(python) matplotlib pyplot show() .. blockieren oder nicht?

Habe ich diese Probleme mit show() immer und immer wieder, und ich bin sicher, ich mache etwas falsch, aber sicher nicht zu den "richtigen" Weg, das zu tun, was ich will.

Und [denke ich], was ich will, ist ein Weg-block in der main-thread, bis ein Ereignis passiert, in den GUI-thread, so etwas wie dieses Werk das erste mal:

from matplotlib import pyplot as p
from scipy import rand

im = (255*rand(480,640)).astype('uint8')
fig = p.figure()
ax = fig.add_subplot(111)
ax.imshow(im)

# just any mutable container for storing a click
s = [-1, -1]

def onclick(event):
  if event.xdata is not None and event.ydata is not None:
    s[0] = event.xdata
    s[1] = event.ydata
    p.close()

cid = fig.canvas.mpl_connect('button_press_event', onclick)
p.show()
print s

den p.show() Blöcke bis p.close() heißt in der event-handler. Aber wenn Sie führen Sie den gleichen code, die zweite die Zeit, Sie Rast vorbei an der p.show() und Drucke, die original s, [-1, -1].

Ich gelesen habe widersprüchliche Informationen, ob oder ob nicht p.show() kann oder sollte, mehr als einmal aufgerufen werden, die das gleiche Programm. Es scheint, dass es wurde entwickelt, um verwendet werden, einmal, und nur einmal am Ende des script. Andere Anwendungsfälle scheinen zu brechen pyplot irgendwie (state machine?).

Ich habe versucht, zu verwenden Kombinationen von p.draw() und p.ion() und p.ioff(), konnten aber nicht das Verhalten, die ich wollte (entweder die Dinge waren nicht die Sperrung richtig oder die Grundstücke nicht erscheinen zur richtigen Zeit).

Ich bin auch verwirrt darüber, wie der event-handler ist in der Lage, um zu sehen s an alle hier, und ob, das ist ein schlechter Weg dar, um in - /out-Informationen. Wenn ich nicht mit einem mutable-container wie ein array oder eine Liste, die Informationen, die ich will, die durch den event-handler nur verloren, als eine lokale variable. gibt es eine andere Methode ich bin zu verpassen , wo die GUI-thread übergeben kann Signale zurück an den main-thread? gibt es eine Möglichkeit zu blockieren, in Haupt -, ohne periodische polling oder busy waiting , für ein signal aus der event-handler, bevor Sie fortfahren?

Also ich denke, letztlich ist meine wichtigste Frage ist:

Gibt es einen ordentlichen Ersatz für p.show(), das tut, was ich will (das gleiche Verhalten als p.show() hat das erste mal), oder ist diese Art von code erfordern ein Umdenken/umschreiben ?

InformationsquelleAutor wim | 2011-05-31
Schreibe einen Kommentar