Event-Verzögerung in matplotlib mpl_connect beim Ausführen von iPython-Shell

Ich versuche, eine sehr einfache kleine 'gui' zu schreiben, die es dem Benutzer ermöglicht, auf ein Bild zu klicken und die Position zu haben und den Wert auf den Bildschirm zu drucken. Was ich habe funktioniert, aber ich habe entdeckt, dass beim Ausführen von einer iPython-Shell eine 1-Ereignis-Verzögerung in der gedruckten Ausgabe stattfindet.

Wenn ich die Routine laufe, macht der erste Klick nichts. Mit dem zweiten Klick kann die gedruckte Ausgabe aus dem ersten Klick angezeigt werden. Die Routine geht in Ordnung, wenn ich mit der rechten Maustaste klicke (was ich will), aber seltsamerweise muss es noch einen Puffer geben, denn wenn ich die Routine wieder laufe, werden die Werte aus diesem letzten Klick gedruckt, bevor ich überhaupt etwas mache.

Hier ist der Code:

import matplotlib.pyplot as plt import numpy as np def pickPoint(data): """Displays a 2D array on the screen and prints data info based upon user clicks.""" def pickPointSelectVal(event): if event.button == 3: fig.canvas.mpl_disconnect(cid) plt.close(fig) else: print 'got click: ', event.x, ',', event.y, ' value: ', data[event.x,event.y] dims = data.shape dpi = 96.0 fdims = (x/dpi for x in dims) fig = plt.figure(figsize=fdims, dpi=dpi) plt.figimage(data.transpose(),origin='lower',cmap='gray') cid = fig.canvas.mpl_connect('button_press_event', pickPointSelectVal) if __name__ == "__main__": a = np.arange(500) b = np.reshape(np.repeat(a,100),(500,100)) c = b * np.reshape(np.repeat(np.arange(100),500),(100,500)).transpose() pickPoint(c) 

Läuft es zweimal mit ein paar Klicks nur zum ersten Mal ergibt die folgende Ausgabe:

 In [1]: pickPoint(c) got click: 60 , 80.0 value: 4800 got click: 45 , 25.0 value: 1125 got click: In [2]: pickPoint(c) 267 , 76.0 value: 20292 

"C" ist ein Dummy-Array. Beachten Sie, dass diese Verzögerung nicht passiert, wenn ich die gleiche Routine von einer normalen Python-Shell ausführen, aber es scheint auch nicht richtig zu beenden in diesem Fall. Ich würde gerne wissen, was der Unterschied ist, und wenn es etwas Kooky mit dem, was ich geschrieben habe.

Ich laufe das in Spyder 2.2.5 von einer Installation von Anaconda 1.8 auf Windows 7 64-Bit.

ADD: Ich habe versucht, dies in iPython qtconsole und einfach iPython, beide mit dem Qt4Agg Backend. Das Problem tritt bei der Verwendung von qtconsole auf, aber nicht bei der Verwendung von einfachem iPython. Weiß jemand, wie die Ereignisse zwischen den beiden unterschiedlich behandelt werden können?

  • Python mqtt script auf himbeer pi zu senden und zu empfangen meldungen
  • MS Analysis Services OLAP API für Python
  • TensorFlow-Tensor in Keras-Verlust-Funktion umgestalten?
  • Stoppen der Listenauswahl?
  • Überspringen Sie numpy __new__ in ndarray Unterklasse (oder möglicherweise überschreiben / definieren Klassen in C oder Zython)
  • Berechnen Sie eine zusammengesetzte Rückholreihe in Python
  • Parsing HTTP User-Agent String
  • Wie kann ich 3 Stack in einem einzigen Array effizient implementieren?
  • One Solution collect form web for “Event-Verzögerung in matplotlib mpl_connect beim Ausführen von iPython-Shell”

    Nun, ich habe es geschafft, dies zu verfolgen – es stellt sich heraus, dass dies ein bekanntes Problem mit QtConsole ist, und die zugrunde liegende Ursache ist die gleiche wie diese Frage (sowohl Canopy als auch Spyder verwenden ipython qtconsole in ihren GUIs). Das Problem ist, dass der erste Druck nicht auslöst eine Flush von Stdout (eine viel bessere Erklärung von vor ein paar Jahren finden Sie hier ), so müssen Sie a) tun Sie es manuell, wie unten, oder b) verwenden ipython – Sie für ungepufferte Ausgabe, die ich nicht versucht habe. Flushing manuell wird gut für mich funktionieren, also werde ich mit dem für jetzt gehen.

    Wenn ich folgendes zu meinem Code addiere, funktioniert es wie erwartet:

     import sys # (put this after the print statement) sys.stdout.flush() 
    Python ist die beste Programmiersprache der Welt.