(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 ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Paar Ideen von unterschiedlicher Qualität:
Wenn Sie nicht wie s wird eine Globale variable, die man machen konnte onclick() einer callable-Objekt fügen Sie es zu, dass.
Ihren Rückruf erwerben könnte/, eine Sperre freizugeben, um den Programmablauf Steuern (wenig verschmutzt).
Könnten Sie aktiv poll s, um den Programmablauf Steuern (sehr schmutzig).
Können Sie manuell Steuern, die Zeichnung Ihrer Figuren über Abb.canvas.draw()
Konnte ich lösen, mein Problem heute. wenn jemand interessiert ist, in eine änderung des Verhaltens der
show()
, Lesen Sie, wie Sie es tun können:Bemerkte ich diesen Absatz mit dem Titel mehrere Anrufe, um zu zeigen, unterstützt auf die was ist neu Teil der matplotlib Webseite:
Diese wurde in 'what' s new " für version
1.0.1
beim schreiben der version in synaptic noch zurück auf0.99.3
. Ich war in der Lage, download und build from sourcev1.0.1
. Zusätzliche Pakete, die ich auch benötigt, um Abhängigkeiten wurdenlibfreetype6-dev tk-dev tk8.5-dev tcl8.5-dev python-gtk2-dev
.Nun mit
matplotlib.__version__ == 1.0.1
folgende code-Blöcke, wie ich es erwarten würde:Bemerkte ich einen Unterschied zwischen dem ausführen des Codes
Direkt in der Python-Interpret (command line)
Setzen es in ein Python-Skript und es läuft von der Kommandozeile ("python script.py")
Beide geben ein blockierendes Verhalten, das ist ok.
Vom Interpret beide Bilder angezeigt, von der Befehl Linie nur die erste wird angezeigt.