如何在Python中结合Cmd和Matplotlib
我想把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”命令时,它会在图形窗口中绘图。到目前为止,一切都很好。但是,当我重新进入控制台时,控制台似乎卡住了,没有新的命令窗口。不过,当我点击图形窗口时,控制台会输出一个新的命令提示符,我可以输入新的命令。看起来这两个循环并没有真正交替进行。有没有更好、更常见的方法呢?
2 个回答
0
iPython 是一个非常受欢迎的工具。你可以看看这个链接,了解如何在 Python 环境中使用 matplotlib:在 Python shell 中使用 matplotlib。
3
我找到了一种方法可以解决问题,但看起来有点丑陋。
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()
这个方法只是定期调用图形的绘制方法。如果我不这样做,当图形被遮挡后再重新显示时,它就不会被重新绘制。
不过这样做看起来不太好,有没有更好的办法呢?