1

Python で Tkinter を使用して、self.do(x) を使用して番号 x を文字列変数に追加する番号付きボタンを作成しようとしています。(スペースを節約するために) ループ内にあるこの特定のコードの問題は、文字列に LAST 番号 (つまり、この例では 9) が追加されることです。これは、この後に関数を呼び出し、num[i] の最新の値を使用するためです。これを修正する方法はありますか?

self.numButton = []
num = []
for i in range(9):
    num.append(i + 1)
    self.numButton.append(Button(root,text=num[i],command=lambda: self.do(num[i])))
4

1 に答える 1

1

lambda関数でデフォルト値を使用します。

self.numButton.append(
    Button(root,text=num[i],command=lambda i=i: self.do(num[i])))

デフォルト値は、 (実行時ではなく)lambda関数の定義時に評価され、関数にバインドされます。そのため、後でボタンが押され、コールバックが引数なしで呼び出されると、デフォルト値が使用されます。

の異なるデフォルト値が各関数にiバインドされているため、コールバックごとに適切な値が使用されます。lambdai


コールバックに on などの追加の引数が必要な場合はevent、パラメータをデフォルト値とともに最後に配置します。例えば、

root.bind('Key-{n}'.format(n=num[i]), lambda e, i=i: self.do(num[i]))
于 2013-09-22T01:44:02.027 に答える