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.???
War es hilfreich?

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)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top