Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 将值传递给按钮单击事件_Python 3.x - Fatal编程技术网

Python 3.x 将值传递给按钮单击事件

Python 3.x 将值传递给按钮单击事件,python-3.x,Python 3.x,下面的代码创建了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))

下面的代码创建了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()
  • 当我点击任何按钮时,我总是得到9。为什么呢
  • 是否有更好的/替代方法来解决此问题

  • 似乎
    number
    上的闭包是通过引用给出一个简单的循环测试的,但是我不确定这是正确的行为

    这是通过使用
    partial
    实现的,我确信它在构建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()
    

    似乎
    number
    上的闭包是通过引用给出一个简单的循环测试的,但是我不确定这是正确的行为

    这是通过使用
    partial
    实现的,我确信它在构建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()
    

    您需要将数字作为lambda参数传递。 尝试:

    关于lambda函数“捕获”局部变量的方式,请参见以下内容: 在这里:


    简而言之,通过将number作为参数传递给lambda,可以确保对迭代的number值执行number的副本。如果不将其作为参数传递,则所有lambda函数“number”都指向同一个变量(循环编号),该变量仅在调用lambda函数时计算。当时它被称为数字,数值是“9”。这与C++中的“for循环”变量的范围非常不同,即循环本身。在python中,只要有人(这里是lambda)引用循环变量,循环变量就存在。

    您需要将数字作为lambda参数传递。 尝试:

    关于lambda函数“捕获”局部变量的方式,请参见以下内容: 在这里:


    简而言之,通过将number作为参数传递给lambda,可以确保对迭代的number值执行number的副本。如果不将其作为参数传递,则所有lambda函数“number”都指向同一个变量(循环编号),该变量仅在调用lambda函数时计算。当时它被称为数字,数值是“9”。这与C++中的“for循环”变量的范围非常不同,即循环本身。在python中,只要有人(这里是lambda)引用循环变量,循环变量就存在。

    它不应该是
    lambda编号:单击按钮(编号)
    ?文档中对
    命令=
    有何说明?忽略我的注释不应该是
    lambda编号:单击按钮(编号)
    ?文档中关于
    命令=
    的内容是什么?忽略我的comments@dhiman也不确定,我希望lambda声明在time@dhiman也不确定,我希望lambda声明在时间点结束(
    结束
    )号,Python lambda不关闭作用域变量,您必须显式地将其指定为输入参数?这同样有效。。但我不明白其中的道理。任何要读取的引用?因此,Python lambda不关闭作用域变量,您必须显式地将其指定为输入参数?这同样有效。。但我不明白其中的道理。有参考资料要读吗?