Tkinter's event_generate Befehl ignoriert

Ich versuche herauszufinden, wie man einen Bindungsbefehl in einem Dialogfenster anlegt. Ich versuche das mit tkinter's event_generate . Es funktioniert nicht so, wie ich es erwarte. Für diese StackOverflow Frage habe ich einen Code mit einem einzigen Aufruf zu event_generate . Manchmal funktioniert diese Zeile und manchmal ist es so, als ob die Linie nicht einmal existiert.

Die Bindung in der __init__ Methode des __init__ sieht so aus:

  self.bind('<BackSpace>', #Print "BackSpace event generated." lambda event: print(event.keysym, 'event generated.')) 

Jede Aktion im Dialog ruft zur Terminierungsmethode zurück (Der Dialog basiert auf dem Beispieldialog von Frederik Lundh in "Eine Einführung in Tkinter".)

  def terminate(self, event=None): print('terminate called') # Make sure we got here and the next line will be called self.event_generate('<BackSpace>') self.parent.focus_set() self.destroy() 

Wenn der Dialog mit dem Code unten aufgerufen wird, wird jede Benutzeraktion am Ende aufgerufen. In jedem Fall "beenden" und "BackSpace-Ereignis generiert". sind angezeigt. Dies beweist, dass der Aufruf von event_generate korrekt eingerichtet ist.

 parent = tk.Tk() dialog = Dialog(parent) dialog.wait_window() 

self.wait_window es self.wait_window , sollte ich erwähnen, dass ich Lundhs Aufruf zu self.wait_window von der __init__ Methode des __init__ zum Anrufer __init__ . Während dies die ordentliche Verkapselung seines Dialogs zerbricht, scheint es für automatisierte Units notwendig zu sein. Andernfalls wird der Unbekannte den Dialog anzeigen und auf die Benutzereingabe warten. Ich mag diese Lösung nicht, aber ich kenne keine Alternative.

Das Problem, das ich habe, ist, wenn wait_window durch einen direkten Aufruf der terminate wird. Dies ist die Art von Dingen, die ich erwarten würde, in der Lage sein, in unittesting zu tun, die ist, um meinen GUI-Code zu testen, ohne tkinter's mainloop oder wait_window zu testen.

 parent = tk.Tk() dialog = Dialog(parent) dialog.terminate() 

Dies druckt nur "endet genannt" und druckt nicht "BackSpace-Ereignis generiert". Der Aufruf von event_generate scheint keine Wirkung zu haben. Wenn ich dem Aufruf im Debugger folge, kann ich sehen, dass tkinter's event_generate() mit den richtigen Argumenten aufgerufen wird. self = {Dialog} .99999999, sequence = {str}'<BackSpace>', kw = {dict}{} Angesichts der Warnung in den TkCmd-Man-Seiten über den Fensterfokus habe ich den Dialog mit der Bindung überprüft In seiner __init__ Methode.

Tkinter führt den Rückruf nicht aus. Warum?

EDIT: Dieser nackte Knochencode zeigt das update an. Allerdings funktioniert es nur, wenn es in __init__ event_generate wird, bevor event_generate vom Hauptprogramm aufgerufen wird. (Dieses Puzzle wurde als separate Frage aufgeworfen )

 class UpdWin(tk.Tk): def __init__(self): super().__init__() self.bind('<BackSpace>', lambda event: print(event.keysym, 'event generated.')) self.update() # Update works if placed here app = UpdWin() app.event_generate('<BackSpace>') # app.update() # Update doesn't work if placed here 

One Solution collect form web for “Tkinter's event_generate Befehl ignoriert”

event_generate wird standardmäßig alle Event-Callbacks sofort verarbeiten. Wenn Sie das Update jedoch nicht aufrufen, bevor Sie event_generate aufrufen, wird das Fenster nicht sichtbar und tkinter wird wahrscheinlich keine Ereignisse ignorieren. Sie können steuern, wann das generierte Ereignis mit dem when Attribut verarbeitet wird. Standardmäßig ist der Wert "jetzt", aber eine andere Wahl ist "Schwanz", was bedeutet, dass er an die Ereigniswarteschlange anhängt, nachdem irgendwelche Ereignisse (wie z. B. Neuzeichnungen) verarbeitet wurden.

Vollständige Dokumentation über das if-Attribut befindet sich auf der tcl / tk man-Seite für event_generate : http://tcl.tk/man/tcl8.5/TkCmd/event.htm#M34

  • Verwalten von Protokollen / Warnungen in Python-Erweiterungen
  • Einheit testet ganze Projekthierarchie in Python mit unittest in pydev
  • Spott eine Steckdose in Python
  • Django Benutzer Setup für Nase Tests
  • Wie behaupte ich, dass ein Funktionsaufruf keinen Fehler mit unittest zurückgibt?
  • Eine Liste aller Module im aktuellen Paket erhalten
  • Speziell benannte Verzeichnisse mit Nosetests
  • Python spöttische globale Variable
  • Wie kann man die Verbosität in python unittest erhöhen?
  • Testen auf Nebenwirkungen in Python
  • Verwenden von unittest.mock zum Patch-Eingabe () in Python 3
  • Python ist die beste Programmiersprache der Welt.