【问题标题】:Python 3.3 : I do not understand Buttons and their lambdas in Tkinter() [duplicate]Python 3.3:我不理解 Tkinter() 中的按钮及其 lambdas [重复]
【发布时间】:2013-11-24 02:47:41
【问题描述】:

我在使用按钮小部件时遇到了一些问题。

这是我的代码。基本上,我想做的是当我按下第一个按钮时打印“0,0”,当我按下第二个按钮时打印“0,1”等等。但发生的情况是它总是打印“1,1”,这是我的 for 循环中的最后一个值。我该如何解决这个问题?

非常感谢您的帮助

from tkinter import *

def show(x,y):

    print(x,y)

root = Tk()

a = 0

for i in range(2):

    for j in range(2):
        Button(root, text=a, command=lambda:show(i,j)).grid(column=j, row=i)
        a += 1

root.mainloop()

【问题讨论】:

  • i, j 是在单击按钮时查找的,而不是在定义 lambda 时查找,因为它们是闭包。
  • 谢谢,我不知道。

标签: python lambda widget tkinter


【解决方案1】:

这是因为 Python 的闭包属性。要解决此问题,请更改

Button(root, text=a, command=lambda:show(i,j)).grid(column=j, row=i)

到

def inner(i=i, j=j):
    Button(root, text=a, command=lambda:show(i,j)).grid(column=j, row=i)
inner()

我们只是用一个函数包装了i 和j 的值。由于函数show 不会立即执行,它只接受i 和j 两个变量的值。因此,现在所有按钮都将具有相同的i 和j,它们将获得循环结束时的值。

现在,通过定义一个新函数,我们得到一个同名的默认参数i 和j,我们在特定时刻得到i 和j 的值。因此,将保留当前值。

【讨论】:

  • 非常感谢,工作正常! :)
  • @Alex 不客气 :)
  • 如果您提供其他方法以相同的方式解决问题,您的答案可能会更好。例如,您可以在创建 lambda 时绑定值,而不是创建 inner,如下所示:command = lambda i=i, j=j: show(i,j)
猜你喜欢
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 2022-01-21
相关资源
最近更新 更多