下面的代码创建了10个按钮。当用户单击该按钮时,我们需要知道单击了哪个按钮。
import tkinter as t
def click_button(number):
print("you clicked %d" % number)
root = t.Tk()
for number in range(0, 10):
btn = t.Button(root, text=number, padx=15, command=lambda: click_button(number))
btn.grid(row=0, column=number)
root.mainloop()发布于 2020-04-06 08:30:55
通过简单的循环测试,number上的闭包似乎是参考的,但是我不确定这是正确的行为。
这是使用partial工作的,毫无疑问,它在构造部分时捕获了number的值:
import functools as fc
import tkinter as t
def click_button(number):
print("you clicked %d" % number)
root = t.Tk()
for number in range(0, 10):
btn = t.Button(
root,
text=number,
padx=15,
command=fc.partial(click_button, number))
btn.grid(row=20, column=number)
root.mainloop()发布于 2020-04-06 10:23:26
您需要将数字作为lambda参数传递。尝试:
command=lambda param = number : click_button(param)关于lambda函数“捕获”局部变量的方式的一些说明可以在这里找到:What do (lambda) function closures capture?和https://docs.python.org/3/faq/programming.html#why-do-lambdas-defined-in-a-loop-with-different-values-all-return-the-same-result
简而言之,通过将number作为参数传递给lambda,可以确保对迭代的数字值执行数字的副本。如果不将其作为参数传递,所有lambda函数"number“都指向同一个变量(循环号),只有在调用lambda函数时才会对其进行计算。当它被称为数字值时是"9“。这与C++非常不同,因为"for循环“变量的作用域就是循环本身。在python中,只要有人(这里的lambdas)引用它,循环中的变量就会存在。
https://stackoverflow.com/questions/61055229
复制相似问题