鱼C论坛

 找回密码
 立即注册
查看: 277|回复: 4

[已解决]Tkinter 按钮按一次,如何失效

[复制链接]
发表于 2024-7-22 21:14:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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()

当按下【汽车】按钮后,【汽车】按钮应该反白,使得按钮只能按一次。
最佳答案
2024-7-22 21:23:57
from tkinter import *

root = Tk()
root.state("zoomed")

buttons = {}

def n(button_name):
    Toplevel(root)
    buttons[button_name].config(state="disabled")

a = ["汽车", "火车", "飞机", "轮船"]

def v():
    for i in a:
        m = Button(root, text=i, command=lambda i=i: n(i))
        m.pack()
        buttons[i] = m

v()
mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-22 21:23:57 | 显示全部楼层    本楼为最佳答案   
from tkinter import *

root = Tk()
root.state("zoomed")

buttons = {}

def n(button_name):
    Toplevel(root)
    buttons[button_name].config(state="disabled")

a = ["汽车", "火车", "飞机", "轮船"]

def v():
    for i in a:
        m = Button(root, text=i, command=lambda i=i: n(i))
        m.pack()
        buttons[i] = m

v()
mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-22 21:39:36 From FishC Mobile | 显示全部楼层
liuhongrun2022 发表于 2024-7-22 21:23

如果不使用 lambda ,可以吗 ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-22 21:55:31 | 显示全部楼层
from tkinter import *

root = Tk()
root.state("zoomed")

buttons = {}

def n(button_name):
    Toplevel(root)
    buttons[button_name].config(state="disabled")

a = ["汽车", "火车", "飞机", "轮船"]

def v():
    for i in a:
        m = Button(root, text=i, command=lambda i=i: n(i))
        m.pack()
        buttons[i] = 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的值。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-22 22:21:18 | 显示全部楼层
本帖最后由 liuhongrun2022 于 2024-7-22 22:29 编辑
dragov 发表于 2024-7-22 21:39
如果不使用 lambda ,可以吗 ?


lambda怎么你了
command传参必须用lambda,否则你还没按,他就自动执行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 00:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表