0

この質問を見たばかりなので、この質問を提起します。Tkinterトレースに関連付けられたコールバック関数の制限は何ですか?

そして、私はlambda別の議論を追加するために使用します。コードは次のとおりです。

from tkinter import *

def callbackfunc(*args, **kwargs):
    print(args,kwargs)

class App(object):
    def __init__(self, master):
        frame = Frame(master)
        frame.pack()

        optionvalue = IntVar(master)
        optionvalue.set(2)
        optionvalue.trace("w",lambda a,b,c,x='test':callbackfunc(x))
        self.optionmenu = OptionMenu(master, optionvalue, 1, 2, 3, 4)
        self.optionmenu.pack()

root = Tk()
app = App(root)
root.mainloop()

私の出力:('test',) {} 知りたいのは:ラムダを使用すると、他の3つの引数が出力されないのはなぜですか?

4

2 に答える 2

2

問題はこの行です:

optionvalue.trace("w",callbackfunc())

に渡す代わりにcallbackfuncoptionvalue.trace引数なしでそれを呼び出しているので、出力になります。

代わりにこれを使用する必要があります。

optionvalue.trace("w", callbackfunc)

リンクした質問のように、括弧なしで。

于 2013-03-27T13:08:59.950 に答える
2

この行を見てみましょう:

optionvalue.trace("w",lambda a,b,c,x='test':callbackfunc(x))

これは、概念的にはこの方法で行うのとほぼ同じです。

def i_dont_care_what_the_name_is(a,b,c,x='test'):
    callbackfunc(x)
optionvalue.trace("w", i_dont_care_what_the_name_is)

トレースが起動すると、3つの値でラムダが呼び出されます。これは文書化された動作です。ラムダを使用しているかどうかは関係ありません。Tkinterは常に3つの引数をコールバックに渡します。

ラムダを使用する非常に一般的な方法である、4番目のオプション値を取るラムダを作成しました。ただし、ラムダでは、明示的に呼び出しcallbackfuncて、単一の値xのみを渡します。

これは次のように機能します。コールバックは3つの引数を使用してラムダを呼び出します。ラムダを定義して、4番目の引数を追加しました。次に、ラムダはコールバックを呼び出しますが、指定するパラメーターは1つだけです。

それで、「ラムダを使用すると、他の3つの引数が出力されないのはなぜですか?」という質問に対する答えです。「ラムダ内から他の関数​​にこれらの引数の1つだけを渡すため」です。

于 2013-03-27T17:15:46.113 に答える