我想结合使用Matplotlib中的交互式绘图和python中的命令行界面Cmd.我怎样才能做到这一点?
我可以使用线程吗?我尝试了以下方法:
from cmd import Cmd
import matplotlib.pylab as plt
from threading import Thread
class MyCmd(Cmd):
def __init__(self):
Cmd.__init__(self)
self.fig = plt.figure()
self.ax = self.fig.add_subplot(1,1,1)
def do_foo(self, arg):
self.ax.plot(range(10))
self.fig.canvas.draw()
if __name__=='__main__':
c = MyCmd()
Thread(target=c.cmdloop).start()
plt.show()
它打开一个图形窗口,我可以在控制台中键入实际执行的命令.当执行“ foo”命令时,它将在图形窗口中绘制.到目前为止,一切正常.但是,当我重新进入控制台时,控制台似乎卡住了,现在有了新的命令窗口.但是,当我单击进入图形窗口时,控制台将输出一个新的命令提示符,并且我可以输入一个新命令.
看来这两个循环并没有真正交织在一起.有没有更好,更常见的方法?
解决方法:
我发现了一些可行的方法,但是很难看
from cmd import Cmd
import matplotlib.pylab as plt
from threading import Thread
import time
class MyCmd(Cmd):
def __init__(self):
Cmd.__init__(self)
self.fig = plt.figure()
self.ax = self.fig.add_subplot(1,1,1)
def do_foo(self, arg):
self.ax.plot(range(10))
self.fig.canvas.draw()
if __name__=='__main__':
plt.ion()
c = MyCmd()
def loop():
while True:
c.fig.canvas.draw()
time.sleep(0.1)
Thread(target=loop).start()
c.cmdloop()
这只是周期性地调用图形的draw方法.如果我不这样做,则该图被遮挡并再次出现在最前面时,该图不会重绘.
但这看起来很丑.有没有更好的办法?