2013-01-14 11 views
5

Czy istnieje sposób, w jaki mogę uzyskać matplotlib do blokowania kodu kodu w oczekiwaniu na matplotlib.backend_bases.Event?matplotlib: celowo blokuje wykonywanie kodu w oczekiwaniu na zdarzenie GUI

Pracowałem nad niektórymi klasami interaktywnego rysowania linii i wielokątów wewnątrz figur matplotlib, po these examples. Naprawdę chciałbym zablokować wykonywanie, dopóki nie zakończę edycji swojego wielokąta, a następnie zdobędziemy końcowe pozycje wierzchołków - jeśli znasz Matlaba, zasadniczo próbuję replikować składnię position = wait(roihandle), na przykład here.

Przypuszczam, że mógłbym ustawić jakiś atrybut klasy mojego interaktywnego obiektu wielokąta po naciśnięciu klawisza, a następnie wielokrotnie odpytywać obiekt w moim skrypcie, aby sprawdzić, czy zdarzenie miało miejsce jeszcze, ale miałem nadzieję, że będzie lepszy sposób.

Odpowiedz

5

Cóż, to było łatwiejsze niż myślałem, że będzie! Dla zainteresowanych, znalazłem rozwiązanie przy użyciu figure.canvas.start_event_loop() i figure.canvas.stop_event_loop().

Oto prosty przykład:

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

należy przyjąć swoją odpowiedź. – tacaswell

+0

Zgadzam się, ale muszę poczekać 2 dni, zanim będę mógł –

Powiązane problemy