У меня есть программа, которая динамически генерирует графический интерфейс. Я не знаю, сколько кнопок у меня будет, если вообще есть.Как я могу получить кнопки TK, сгенерированные циклом for, передать вход в свою команду? (Python)
Специфической проблемой является чем-то вроде этого:
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')
У меня есть цикл, который создает текстовые поля и кнопки. StringVar() хранится в словаре с ключом varname
.
потому что я не могу передать аргументы в функции обратного вызова кнопки, вместо этого я определяю лямбду в каждой кнопке. Это устанавливает StringVar(), связанный с текстовым полем, созданным в этом цикле, к выходу поля filedialog.
Проблема в том, что имя varname, переданное в лямбда, не передает значение, а только имя переменной. Поэтому, когда текстовые поля связаны с переменной, которую они создали с помощью цикла for, lambdas в кнопках постоянно использует текущее значение varname.
Другими словами, каждое текстовое поле ссылается только на одну переменную, но все кнопки устанавливают только текст окончательного текстового поля, т. Е. Текстовое поле с окончательным значением varname.
Есть ли другой способ приблизиться к этому? Могу ли я заставить лямбду каким-то образом использовать значение varname, как оно определено, и не использовать будущие значения varname?
Спасибо, создание отдельного класса было отличным решением. Хотя теперь, когда я пытаюсь вызвать grid() в моем новом классе, Filetextboxes всегда размещаются под всеми другими виджетами в кадре. – user1442389
@ user1442389 - Сегодня утром я выяснил проблему с лямбдой.Я опубликовал ссылку и объяснение. На самом деле это довольно просто. – mgilson
Мне нравится это решение много. Возможно, я вернусь к использованию лямбда, хотя я уже изменил весь свой код. – user1442389