gpt4 book ai didi

python - Tkinter 意外行为

转载 作者:行者123 更新时间:2023-11-28 21:30:02 25 4
gpt4 key购买 nike

我一直在使用 Tkinter 用 Python 编写一个很长的 GUI。我不明白的一件事是为什么我不能将事件绑定(bind)到循环中的小部件。在下面的代码中,如果我手动执行(注释掉代码)但不在 for 循环中执行绑定(bind),则绑定(bind)效果很好。我做错了什么吗?

导入 Tkinter

root = Tkinter.Tk()

b1 = Tkinter.Button(root, text="Button 1")
b1.pack()
b1.focus_set()
b2 = Tkinter.Button(root, text="Button 2")
b2.pack()
b3 = Tkinter.Button(root, text="Button 3")
b3.pack()


def up_and_down(*buttons):

for i in range(len(buttons)-1):
buttons[i].bind("<Down>", lambda x: buttons[i+1].focus_set())

for i in range(1, len(buttons)):
buttons[i].bind("<Down>", lambda x: buttons[i-1].focus_set())

'''
buttons[0].bind("<Down>", lambda x: buttons[1].focus_set())
buttons[1].bind("<Down>", lambda x: buttons[2].focus_set())

buttons[1].bind("<Up>", lambda x: buttons[0].focus_set())
buttons[2].bind("<Up>", lambda x: buttons[1].focus_set())
'''

up_and_down(b1, b2, b3)

root.mainloop()

最佳答案

您的闭包(lambda)没有按照您的预期工作。它们保留对 i 的引用,该引用会随着循环迭代而发生变化,最后来自同一循环的所有 lambda 都引用同一个最后一个按钮。

以下是该行为的说明:

>>> k = []
>>> for i in range(5):
... k.append(lambda: i)
>>> k[0]()
4
>>> [f() for f in k]
[4, 4, 4, 4, 4]

关于python - Tkinter 意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3963613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com