【问题标题】:How to combine Cmd and Matplotlib in python如何在 python 中结合 Cmd 和 Matplotlib
【发布时间】:2011-03-29 04:14:17
【问题描述】:

我想将 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”命令时,它会在图形窗口中绘制。到目前为止一切正常。但是,当我重新进入控制台时,控制台似乎卡住了,现在有新的命令窗口。但是当我单击图形窗口时,控制台会输出一个新的命令提示符,我可以输入一个新命令。 看来这两个循环并没有真正交错或什么的。有没有更好、更常用的方法?

【问题讨论】:

  • 请编辑您的问题。编辑时,请阅读页面右侧的格式说明。请编辑您的代码,使其看起来像代码。
  • 怎么不行?你使用的是什么版本的 Python?什么平台? Thread 是如何定义的(您似乎没有导入它)?
  • 我在 Linux 上使用 Python 2.6。

标签: python cmd matplotlib plot interactive


【解决方案1】:

我发现了一些有用的东西,但是很丑

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()

这只是周期性地调用图形的绘制方法。如果我不这样做,则当它被遮挡并再次出现在前面时,图形不会重新绘制。

但这看起来很难看。有没有更好的办法?

【讨论】:

    【解决方案2】:

    iPython 非常流行。看看Using matplotlib in a python shell

    【讨论】:

      猜你喜欢
      • 2013-11-22
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      相关资源
      最近更新 更多