【问题标题】:how to give different command to buttons created in a loop in tkinter? [duplicate]如何为在 tkinter 中循环创建的按钮提供不同的命令? [复制]
【发布时间】:2020-01-20 16:34:18
【问题描述】:

我正在尝试在一个循环中创建多个按钮, 类似:

def press_button(button):
    button.configure(bg="red")


root = tkinter.Tk()

for i in range(4):
    quick_button = tkinter.Button(root, text=str(i) ,font=("courier", 30), 
                                  command=lambda: press_button(quick_button))
    quick_button.grid(row=i, pady=3, padx=3)

root.mainloop()

但我希望每个按钮发送不同的参数,我想要的是每个按钮将发送不同的参数,但是发生的是它们都设置为相同的东西,所以当我按下第一个按钮时,三个按钮是被着色。 另外,有没有办法在创建按钮时引用按钮而不将它们放入字典中?

任何帮助将不胜感激

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    Lambda 不会立即绑定它们使用的值。它们是闭包,在调用时查找所需的值。这意味着它只会对 last quick_button 起作用,因为这是循环完成后 quick_button 等于的值。最重要的是,您试图在 quick_button 存在之前引用它!

    如果我告诉你你可以利用这种导致你的问题的后期绑定行为实际上帮助解决你的问题?

    我们可以存储您的按钮列表 (buttons) 并将按钮的索引存储为 lambda 中的局部变量。然后,您将使用该索引访问被按下的按钮并将其传递给您的 press_button 函数。

    看起来像这样:

    import tkinter
    
    def press_button(button):
        button.configure(bg="red")
    
    
    root = tkinter.Tk()
    
    buttons = [] # <-- Added list of buttons
    for i in range(4):
        quick_button = tkinter.Button(root, text=str(i) ,font=("courier", 30), 
                                      command=lambda i=i: press_button(buttons[i]))
        quick_button.grid(row=i, pady=3, padx=3)
        buttons.append(quick_button)
    
    root.mainloop()
    

    注意lambda i=i 部分。如果没有i=i,您将遇到与现在相同的行为...当调用 lambda 时,无论您按什么按钮,它都会查找 i 的值并看到它是 3。将i=i 添加到 lambda 会在本地 lambda 中绑定它。

    现在,每个按钮的行为都“独立”于其他按钮:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 2020-04-13
      • 2022-11-04
      相关资源
      最近更新 更多