1

Python で ttk を使用して小さなスクリプトを作成していますが、関数が実行されるべきではない場所で実行されるという問題があります。ボタンのコードは次のようになります。

btReload = ttk.Button(treeBottomUI, text="Reload", width=17, command=loadModelTree(treeModel))
btReload.pack(サイド="左")

関数は次のとおりです。

def loadModelTree(ツリー):
    print ("モデルを読み込んでいます...")
    allModels = os.listdir(confModPath)
    allModels のチャンク:
        ...

何らかの理由で、ボタンを押さずに機能が実行されます。なんで?

4

2 に答える 2

2

Markus、はい、それは正しい解決策ですが、ウィジェットのコールアウトで複数引数のコマンドを使用できないためではありません。元のコードで...command=loadModelTree(treeModel)...は、メソッドの呼び出しであると考えてください。Lambda を使用すると、コマンドを抽象化できるため、呼び出しによってインタープリターを混乱させることなく、任意の数の引数を使用できます...command=lambda arg1=myarg1, arg2=myarg2, arg3=myarg3: myCallout(arg1, arg2, arg3)...

何が起こっているのかが少し明確になることを願っています。

于 2012-07-25T02:53:10.400 に答える
1

さて、答えを見つけたので、自分の質問に答えます。ttk.button コマンドは関数への引数の送信をサポートしていないため、次のように回避する必要があります。

btReload = ttk.Button(treeBottomUI, text="Reload", width=17, command=lambda i=treeModel: loadModelTree(i))
btReload.pack(サイド="左")

パイのようにシンプル!

于 2010-06-01T07:25:45.333 に答える