1

メソッドを Tkinter 要素のイベントにバインドした後、メソッドを元に戻す方法はありますか?

>>> 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.???
4

3 に答える 3

3

Tcl/Tk でこれを行う標準的な方法は簡単です。同じ bind コマンドを使用しますが、最後の引数は使用しません。

bind .b <Button-1> doSomething
puts "the function is [bind .b <Button-1>]"
=> the function is doSomething

Tkinter で同様のことを行うことができますが、残念ながら、結果はあまり使い物になりません。

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'

明らかに、Tkinter はカバーの下で多くのジャグリングを行っています。1 つの解決策は、これを記憶する小さなヘルパー プロシージャを作成することです。

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))

次のように使用します。

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>")

上記のコードを実行すると、次のようになります。

before, binding for <Button-1>: None
 after, binding for <Button-1>: <function doSomething at 0xb7f2e79c>

最後の警告として、私は Tkinter をあまり使用しないので、属性をウィジェット インスタンスに動的に追加することの影響がどうなるかわかりません。無害に思えますが、そうでない場合は、いつでもグローバル ディクショナリを作成してバインディングを追跡できます。

于 2008-10-22T15:01:35.367 に答える
2

tk C APIに対してこれを行うための関連する呼び出しは、Get_GetCommandInfoになります。

コマンドに関する情報を、infoPtrが指すTcl_CmdInfo構造体に配置します

ただし、この関数は、PythonトラフTkinter.pyによって使用されるtkのバインディングである_tkinter.cのどこでも使用されていません。

したがって、バインドされた関数をtkinterから取得することは不可能です。その機能を自分で覚えておく必要があります。

于 2008-09-26T08:15:25.680 に答える
0

そうではないようです...必要な場合は自分で保存するか、非匿名関数を使用してください。

また、あなたのコードは書かれたとおりには機能しません:関数はステートメントではlambdaなく式のみを含むことができます。printprint()

于 2008-09-26T06:31:03.153 に答える