Lassen Sie sich Bound Event-Handler in Tkinter
-
02-07-2019 - |
Frage
Nach einer Bindung ein Verfahren auf ein Ereignis eines Tkinter Elements gibt es eine Möglichkeit, das Verfahren zurück zu bekommen?
>>> root = Tkinter.Tk()
>>> frame = Tkinter.Frame(root, width=100, height=100)
>>> frame.bind('<Button-1>', lambda e: pprint('Click')) # function needed
>>> frame.pack()
>>> bound_event_method = frame.???
Lösung
Der zugehörige Anruf, dass für das tk-C-API zu tun wäre, Get_GetCommandInfo der
stellt Informationen über den Befehl in der Struktur zeigte Tcl_CmdInfo durch infoPtr
Allerdings ist diese Funktion nicht überall in _tkinter.c , die für die Bindung von tk ist Python Trog verwendet Tkinter.py .
Daher ist es unmöglich, die gebundene Funktion aus tkinter zu bekommen. Sie müssen, die Funktion selbst erinnern.
Andere Tipps
Der Standard-Weg, dies in Tcl / Tk zu tun ist trivial: Sie denselben Befehl BIND verwenden, aber ohne das letzte Argument.
bind .b <Button-1> doSomething
puts "the function is [bind .b <Button-1>]"
=> the function is doSomething
Sie können mit Tkinter etwas Ähnliches tun, aber die Ergebnisse sind leider nicht ganz so verwendbar:
e1.bind("<Button-1>",doSomething)
e1.bind("<Button-1>")
=> 'if {"[-1208974516doSomething %# %b %f %h %k %s %t %w %x %y %A %E %K %N %W %T %X %Y %D]" == "break"} break\n'
Offensichtlich Tkinter tun vielen Jonglieren unter der Decke. Eine Lösung wäre, ein wenig Helfer Prozedur zu schreiben, die dies für Sie erinnert sich:
def bindWidget(widget,event,func=None):
'''Set or retrieve the binding for an event on a widget'''
if not widget.__dict__.has_key("bindings"): widget.bindings=dict()
if func:
widget.bind(event,func)
widget.bindings[event] = func
else:
return(widget.bindings.setdefault(event,None))
Sie würde es so verwenden:
e1=Entry()
print "before, binding for <Button-1>: %s" % bindWidget(e1,"<Button-1>")
bindWidget(e1,"<Button-1>",doSomething)
print " after, binding for <Button-1>: %s" % bindWidget(e1,"<Button-1>")
Wenn ich den obigen Code ausführen, erhalte ich:
before, binding for <Button-1>: None
after, binding for <Button-1>: <function doSomething at 0xb7f2e79c>
Als letzten Hinweis, ich Tkinter nicht viel verwenden, so bin ich nicht sicher, was die Auswirkungen sind dynamisch ein Attribut zu einer Widget-Instanz hinzufügen. Es scheint harmlos zu sein, aber wenn nicht, können Sie immer ein globales Wörterbuch erstellen Überblick über die Bindungen zu halten.
scheint nicht zu sein ... warum nicht speichern Sie es einfach selbst, wenn Sie es brauchen sind, oder eine nicht-anonyme Funktion verwenden?
Auch dann, wenn der Code nicht geschrieben arbeiten. lambda
Funktionen nur Ausdrücke enthält, nicht Aussagen, so print
ist ein No-Go (dies wird in Python 3.0 ändern, wenn print()
eine Funktion wird)