【问题标题】:How can I construct button callbacks with Tkinter properly?如何正确使用 Tkinter 构造按钮回调?
【发布时间】:2015-02-04 14:23:57
【问题描述】:

这里我有一个使用Tkinter的简单python应用程序

from Tkinter import *
def draw(i,j):
    button[(i,j)]['text'] = 'X'

if __name__ == '__main__':
    root = Tk()
    root.title('Number Recognation')

    button = {}



    for i in range(2):
        for j in range(2):
            button[(i,j)] = Button(width = 3,command = lambda: draw(i,j))
            button[(i,j)].grid(row = i,column = j)




    root.mainloop()

我想制作一个小程序,其中有四个空白按钮,在你按下其中一个按钮的地方,它会将文本更改为“X”。因此,当我使用for 循环编写此程序时,它无法正常工作,单击它会更改位于第二行和第二列的此按钮。如果我写的时候没有for 循环

    button[(0,0)] = Button(width = 3,command = lambda: draw(0,0))
    button[(0,0)].grid(row = 0,column = 0)

    button[(0,1)] = Button(width = 3,command = lambda: draw(0,1))
    button[(0,1)].grid(row = 0,column = 1)

    button[(1,0)] = Button(width = 3,command = lambda: draw(1,0))
    button[(1,0)].grid(row = 1,column = 0)

    button[(1,1)] = Button(width = 3,command = lambda: draw(1,1))
    button[(1,1)].grid(row = 1,column = 1)

这不是问题。

我真的很想用 for 循环,因为我这里会有很多按钮。

【问题讨论】:

    标签: python python-2.7 tkinter


    【解决方案1】:

    i, j 是在调用回调时绑定的,而不是在创建回调时绑定的。您可以使用默认参数来避免后期绑定问题。

    for i in range(2):
        for j in range(2):
            button[(i,j)] = Button(width = 3,command = lambda i=i, j=j: draw(i,j))  # <---
            button[(i,j)].grid(row = i,column = j)
    

    【讨论】:

      猜你喜欢
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 2021-07-06
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多