2013-01-14 71 views
5

有沒有某種方式可以讓matplotlib阻止代碼執行,等待matplotlib.backend_bases.Eventmatplotlib:故意阻止代碼執行等待GUI事件

我一直在研究一些類,用於在matplotlib數字內部交互繪製線條和多邊形,以下是these examples。我真正想要做的是阻止執行,直到完成編輯我的多邊形,然後獲得頂點的最終位置 - 如果您熟悉MATLAB,我基本上試圖複製position = wait(roihandle)語法,例如here

我想我可以在發生按鍵時設置我的交互式多邊形對象的某些類屬性,然後反覆輪詢腳本中的對象以查看事件是否已經發生,但我希望會有更好的方法。

回答

5

好吧,那比我想象的要容易!對於那些有興趣的人,我找到了使用figure.canvas.start_event_loop()figure.canvas.stop_event_loop()的解決方案。

這裏有一個簡單的例子:

from matplotlib import pyplot as plt 

class FigEventLoopDemo(object): 

    def __init__(self): 

     self.fig, self.ax = plt.subplots(1, 1, num='Event loop demo') 
     self.clickme = self.ax.text(0.5, 0.5, 'click me', 
            ha='center', va='center', 
            color='r', fontsize=20, picker=10) 

     # add a callback that triggers when the text is clicked 
     self.cid = self.fig.canvas.mpl_connect('pick_event', self.on_pick) 

     # start a blocking event loop 
     print("entering a blocking loop") 
     self.fig.canvas.start_event_loop(timeout=-1) 

    def on_pick(self, event): 

     if event.artist is self.clickme: 

      # exit the blocking event loop 
      self.fig.canvas.stop_event_loop() 
      print("now we're unblocked") 
+0

你應該接受你自己的答案。 – tacaswell

+0

我同意,但我必須等2天才可以 –