2010-08-12 84 views
3

我想將Matplotlib中的交互式繪圖和python中的命令行接口Cmd結合起來。我怎樣才能做到這一點? 我可以使用線程嗎?我嘗試了以下方法:如何在Python中結合Cmd和Matplotlib

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」命令時,它將繪製數字窗口。到目前爲止,一切都很好。但是,當我重新進入控制檯時,控制檯似乎卡住了,現在有新的命令窗口。但是當我點擊數字窗口時,控制檯會輸出一個新的命令提示符,然後我可以輸入一個新的命令。 看來這兩個循環並不是真正的交錯或什麼的。有更好,更常見的方法嗎?

+0

請編輯您的問題。在編輯時,請閱讀頁面右側的格式說明。請編輯你的代碼,看起來像代碼。 – 2010-08-12 21:14:35

+0

它不起作用?你使用的是什麼版本的Python?什麼平臺?線程是如何定義的(你似乎沒有導入它)? – robert 2010-08-12 22:06:44

+0

我在Linux上使用Python 2.6。 – Christian 2010-08-13 06:01:35

回答

2

我發現一些作品,但比較難看

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

這只是定期調用圖的繪製方法。如果我不這樣做,這個圖不會重新繪製,當它被遮擋並再次出現在前面時。

但這看起來很難看。有沒有更好的辦法?