如何在Tkinter(Python)中将绑定添加到动态的小部件列表中

时间:2017-06-02 08:46:50

标签: python tkinter

我正在尝试从列表中创建标签,绑定'<Enter>''<Leave>'事件以使标签悬停时背景颜色发生变化(默认为蓝色,悬停时为红色) ,然后打包标签。

目前,我正在将每个标签添加到字典中并引用它,但是当光标进入任何标签时,最后一个(也是最后一个)标签的背景颜色会发生变化。

from tkinter import *


random_list = ['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQR']


class x:
    def __init__(self, master):
        y = {}
        for i in random_list:
            y[i] = Label(master, text=i, bg='#00f')
            y[i].pack()
            y[i].bind('<Enter>', lambda event: y[i].configure(background='#f00'))
            y[i].bind('<Leave>', lambda event: y[i].configure(background='#00f'))


root = Tk()
app = x(root)
root.mainloop()

1 个答案:

答案 0 :(得分:3)

您的lambda表达式正在捕获i,并导致此问题。

您应该能够通过在lambda定义中指定i = i来解决此问题。

即,使用lambda语句的行应如下所示:

y[i].bind('<Enter>', lambda event, i=i: y[i].configure(background='#f00'))
y[i].bind('<Leave>', lambda event, i=i: y[i].configure(background='#00f'))