Команда Tkinter назначить кнопку в цикле с лямбдой

Я пытаюсь создать несколько кнопок (с a для), например:

def a(self, name): print name users = {"Test":"127.0.0.0", "Test2":"128.0.0.0"} row = 1 for name in users: user_button = Tkinter.Button(self.root, text=name, command=lambda: self.a(name)) user_button.grid(row = row, column = 0) row+=1 

и для кнопок каждый получает свой собственный параметр (Test get Test и Test2, получающий Test2), но когда я нажимаю кнопки, они оба печатают «Test2», что означает, что они используют одну и ту же функцию с тем же параметром.

Как я могу это решить?

  • Вертикальный текст в холсте Tkinter
  • Как изменить цвет кнопки ttk
  • Изменение цвета текста виджета ttk
  • Python / Tkinter: Использование языков Tkinter для RTL (справа налево), таких как арабский / иврит?
  • Tkinter: ProgressBar с неопределенной продолжительностью
  • TypeError: printName1 () принимает 0 позиционных аргументов, но 1 дано
  • Когда мне нужно вызвать mainloop в приложении Tkinter?
  • Предотвращение растягивания ярлыков tkinter длинной строкой
  • One Solution collect form web for “Команда Tkinter назначить кнопку в цикле с лямбдой”

    Проблема в том, что ваша ламба в цикле for. В вашей лямбда используется переменная name , но переменная name каждый раз переназначается через цикл for. Таким образом, в конце все кнопки получают последнее значение, которому было присвоено name в цикле for. Чтобы этого избежать, вы можете использовать параметры ключевого слова по умолчанию в своем выражении lamba следующим образом:

     user_button = Tkinter.Button(self.root, text=name, command=lambda name=name: self.a(name)) 

    Это привязывает текущее значение переменной name к аргументу ключевого слова name lamba каждый раз через цикл, создавая желаемый эффект.

    Python - лучший язык программирования в мире.