GUIを動的に生成するプログラムがあります。ボタンがいくつあるかわかりません。
具体的な問題は次のようなものです。
for varname in self.filetextboxes:
if self.varDict[varname]=='':
self.varDict[varname] = (StringVar(),)
self.varDict[varname][0].set('')
fileButton = Button(self, text=" ", command = lambda:self.varDict[varname][0].set(tkFileDialog.askopenfilename()), image=self.filephoto)
ftb = Entry(self, textvariable = self.varDict[varname][0],width=40,background='white')
テキストボックスとボタンを作成するforループがあります。StringVar()は、キーを使用して辞書に格納されますvarname
。
ボタンのコールバック関数で引数を渡すことができないため、代わりに各ボタンでラムダを定義します。これにより、このループで作成されたテキストボックスに関連付けられたStringVar()がファイルダイアログボックスの出力に設定されます。
問題は、ラムダに渡されるvarnameが値を渡さず、変数の名前のみを渡すことです。したがって、テキストボックスはforループで作成された変数に関連付けられていますが、ボタンのラムダは常にvarnameの現在の値を使用します。
つまり、各テキストボックスは1つの変数にのみリンクしますが、すべてのボタンは、作成された最終的なテキストボックスのテキスト、つまり、varnameの最終値を持つテキストボックスのみを設定します。
これにアプローチする別の方法はありますか?ラムダをどういうわけか、定義されたとおりにvarnameの値のみを使用し、varnameの将来の値を使用しないようにすることはできますか?