fileselectionダイアログに基づいて設定されたオプションメニューを持つウィンドウを作成しようとしています。私はoptionmenuに、以前に選択したファイルに基づいてすべてのオプションを含めることができます。ただし、どのオプションがユーザーによって選択されても、変数には選択したファイルから最後に読み込まれたオプションが含まれます。Tkinterオプションメニューウィジェットaddコマンドlambdaが期待するコマンドを生成しない
なぜこのようなことが起こったのか誰かが私に説明できれば、私は大好きです。したがって、私は、最小限の例以下含まれている:コードでprint
が期待A
、B
とC
を生成しながら
from Tkinter import *
Tk()
class App():
chunks = ['A','B','C'] # These are read from a file in the actual program
testVariable = StringVar()
def __init__(self,master):
def initSummary():
self.dataButton["menu"].delete(0, 'end')
for i in self.chunks:
print i # To demonstrate what's in there
self.dataButton["menu"].add_command(label=i, command = lambda: self.testVariable.set(i))
top = self.top = Toplevel()
top.protocol("WM_DELETE_WINDOW", lambda: close(self))
self.sumButton = Button(top, text="Test", width=25, command=lambda: initSummary())
self.sumButton.grid(row=0, column=0, sticky=W)
self.dataButton = OptionMenu(top, self.testVariable, "Stuff")
self.dataButton.grid(row=0, column=1, sticky=W)
# Call the main app
root = Tk()
app = App(root)
root.mainloop()
このコードは関係なく、ユーザが選択したものの、オプションメニューにC
を示すであろう。私はprint
も3回C
を示したが、何が印刷されているのか、そしてGUIに表示されているものが私を捨てているのか分かります。
forループでlambdaを使用すると、古典的な問題です:https://docs.python.org/3/faq/programming.html#why-do-lambdas-defined-in-a-loop-with-different-値がすべて返される同じ結果 –
私に正しい方向@ j_4321を指摘していただきありがとうございます。私は上記の問題を解決するために中間的な機能を追加しましたが、これがそのような問題に対処する「正しい」方法だとお考えですか? –
この問題に対処する「正しい」方法があるかどうかわかりません。私はあなたのような中間関数を追加していましたが、今は 'lambda j = i:self.testVariable.set(j)'を使うのが好きです。 –