当前位置: 首页 > 面试题库 >

带可变参数的回调函数tkinter按钮

韶和璧
2023-03-14
问题内容
from tkinter import *

F=Tk()

i=1
while i<10:
    newButton = Button(F,text="Show Number",command=lambda:showNumber(i))
    newButton.pack(side=TOP)
    i+=1

def showNumber(nb):
    print(nb)

F.mainloop()

所有按钮都返回10。为什么?
我想要按钮1返回1,按钮2返回2 …
非常感谢您的帮助


问题答案:

您的匿名lambda函数可以是闭包(如@abernert所指出的,在Python的情况下,它们 实际上并不是
闭包)-它们“封闭”了变量i,以供以后引用。但是,它们不是在定义时查找值,而是 在调用 时查找值,这是整个循环结束
的某个时间while(此时i等于10)。

要解决此问题,您需要将的值重新绑定i到其他东西以供lambda使用。您可以通过多种方式执行此操作-这是一种:

...
i = 1
while i < 10:
    # Give a parameter to the lambda, defaulting to i (function default
    # arguments are bound at time of declaration)
    newButton = Button(F, text="Show Number",
        command=lambda num=i: showNumber(num))
    ...


 类似资料:
  • 问题内容: 如标题所示,我需要知道方法参数中是否存在与java对应的语法,例如 (代码由维基百科提供) 问题答案: 是的,您可以这样写:

  • Scala 函数 Scala 允许你指明函数的最后一个参数可以是重复的,即我们不需要指定函数参数的个数,可以向函数传入可变长度参数列表。 Scala 通过在参数的类型之后放一个星号来设置可变参数(可重复的参数)。例如: object Test { def main(args: Array[String]) { printStrings("Runoob", "Scala",

  • 问题内容: 我有2个按钮,分别名为“ ButtonA”,“ ButtonB”。如果要单击任何按钮,我希望程序打印“ hello,ButtonA”和“hello,ButtonB”。我的代码如下: 当我单击ButtonA时,会发生错误。 我理解此错误,但是如何将ButtonA的文本传递给lambda? 问题答案: 这应该工作: 有关更多信息,请查看Tkinter回调

  • 问题内容: Python有类Tkinter的变量,等等,这些都共享方法,和。作为第二个参数传递给的函数将传递四个参数。 例如,这些似乎是。 第三个参数似乎是触发跟踪的模式,在我的情况下,变量已更改。但是,第一个看似空字符串的变量是什么?如果我不得不猜测该变量的内部名称,第二秒是什么? 问题答案: 第一个参数 是内部变量名称。您可以将此名称用作tkinter和方法的参数。如果你给你的变量名称(例如:

  • 但是,如果Terminal中没有提供,我不知道如何(或者是否能够)为其设置默认值。像这样简单的东西不起作用。这里的一个解决方案是根据的内容或大小在函数中设置变量。但我不知道有没有更好的办法做到这一点。 因此,我正在寻找一种方法来使用来自终端的参数调用一个函数,其中需要一个数字(在本例中为2),而其余的是可选的,并设置为默认值。

  • 我有一个内联变量函数内联int foo(…) 我需要调用一个宏(我们称它为宏),它也是可变的 基本上,我需要将其所有输入参数传递给宏。由于使用了选项,将重新定义为另一个宏将是一个简单的解决方案,但我还需要来返回值<注意:我正在尝试连接已编写代码的两部分,不允许更改它们<代码>foo(…) 用于代码的第一部分,宏定义于第二部分。我要做的唯一一件事就是定义一个使用宏的foo(),我不能,因为它们都是可