Tkinter 按钮按一次,如何失效
from tkinter import*
root=Tk()
root.state("zoomed")
def n() :
Toplevel(root)
m.config(state="disable")
a=["汽车","火车","飞机","轮船"]
def v() :
for i in a :
m=Button(root,
text=i,
command=n)
m.pack()
v()
mainloop()
当按下【汽车】按钮后,【汽车】按钮应该反白,使得按钮只能按一次。 from tkinter import *
root = Tk()
root.state("zoomed")
buttons = {}
def n(button_name):
Toplevel(root)
buttons.config(state="disabled")
a = ["汽车", "火车", "飞机", "轮船"]
def v():
for i in a:
m = Button(root, text=i, command=lambda i=i: n(i))
m.pack()
buttons = m
v()
mainloop() liuhongrun2022 发表于 2024-7-22 21:23
如果不使用 lambda ,可以吗 ? from tkinter import *
root = Tk()
root.state("zoomed")
buttons = {}
def n(button_name):
Toplevel(root)
buttons.config(state="disabled")
a = ["汽车", "火车", "飞机", "轮船"]
def v():
for i in a:
m = Button(root, text=i, command=lambda i=i: n(i))
m.pack()
buttons = m
v()
mainloop()
说的很好,我补充一下其中的
command=lambda i=i: n(i)
为什么要i=i
在Python的lambda表达式中使用i=i实际上是一种技巧,用于确保在循环中创建的每个lambda表达式都绑定到其创建时循环变量的当前值。这个技巧通常被称为“默认参数陷阱”的解决方法。
在Python中,如果你在一个循环中直接定义一个lambda表达式,并且这个lambda表达式引用了循环变量(在这个例子中是i),你可能会遇到一个问题:当lambda表达式实际被调用时(在点击按钮之后),它不会记住循环变量在创建时的值,而是会记住循环变量在循环结束时或最后一次迭代时的值。
这是因为Python中的lambda表达式在定义时不会立即计算其参数的值,而是会延迟到调用时才计算。如果lambda表达式引用了外部作用域中的变量(在这个例子中是循环变量i),那么这个变量在lambda表达式被调用时的值将取决于其在外部作用域中的最后状态。
为了解决这个问题,你可以使用默认参数来“捕获”lambda表达式创建时i的当前值。通过写lambda i=i: n(i),你实际上是在为lambda表达式定义了一个名为i的参数,并且立即将这个参数的值设置为循环变量i的当前值。由于默认参数是在函数定义时求值的,所以这个值就被“冻结”了,即使外部作用域中的i变量在之后发生了变化。
这样,当你点击按钮时,lambda表达式被调用,并且它使用自己参数列表中定义的i的值(即创建lambda时i的值),而不是外部作用域中i的当前值。
简而言之,i=i在这里是用来确保每个lambda表达式都记住它创建时i的值,而不是循环结束时i的值。
本帖最后由 liuhongrun2022 于 2024-7-22 22:29 编辑
dragov 发表于 2024-7-22 21:39
如果不使用 lambda ,可以吗 ?
lambda怎么你了
command传参必须用lambda,否则你还没按,他就自动执行了
页:
[1]