Как совместить Cmd и Matplotlib в Python - PullRequest
3 голосов
/ 13 августа 2010

Я бы хотел совместить интерактивное построение графиков в Matplotlib и интерфейс командной строки Cmd в python. Как я могу это сделать? Могу ли я использовать потоки? Я попробовал следующее:

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 ]

2 голосов
/ 13 августа 2010

Я нашел что-то, что работает, но довольно уродливо

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

Это просто периодически вызывает метод рисования фигуры.Если я этого не сделаю, фигура не перерисовывается, когда она была закрыта, и снова выходит на фронт.

Но это кажется уродливым.Есть ли лучший способ?

1 голос
/ 08 ноября 2010

iPython довольно популярен.Взгляните на Использование matplotlib в оболочке Python .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...