首页 > 解决方案 > Python Tkinter:使用循环创建多个按钮

问题描述

我是 Tkinter 的新手,不知道如何通过将它们组织在列表中来创建多个按钮。我能够出现一个按钮,但是当我尝试创建多个时,它不起作用,而是创建一个空白页面。

from tkinter import *
from V2cboard import *
import time


#blueLength=len(blueTokens) # This is the num of blue tokens left on board
#redLength=len(redTokens) # This is the num of red tokens left on board

DispTXT=["Play as Red!","Play as Blue!","Let the Computer play!","Two players!"]
button=[None]

root=Tk()
for i in range(4):
    button[i] = Button(root, text=DispTXT[i], command=boardWindow(i))
    button[i].pack()

root.mainloop()

请理解,我一般是编码和 Tkinter 的新手。

我期望发生的是在窗口中创建 4 个单独的按钮,每个按钮都显示上面列表中的文本。然后,当单击一个时,它会将数字 (i) 发送到我的功能 boardWindow 以执行其他操作。我无法让按钮出现,所以我认为这可能是语法错误或者我误解了 Button 函数的工作原理?我得到错误

can't invoke "button" command: application has been destroyed

当我尝试创建按钮时?

标签: pythontkinter

解决方案


只有一个按钮出现的原因是因为button只有一个值,Nonebutton[i]表示列表中的第 i 个项目button。因为button只有一个项目,当它尝试更改另一个项目时,您会收到错误(列表分配超出范围)。与其在索引处更改项目,不如将其附加到列表的末尾更容易。
单击按钮不起作用的原因是由两件事引起的。该command参数采用函数的名称,因此不要包含(). 因为你需要 的值i,所以你必须使用一个叫做 a 的东西lambda。这允许您在命令中使用参数。command = lambda: boardWindow(i)会起作用,但它总是使用 的最后一个值i,这不是我们想要的,所以我们使用lambda i=i保持对该按钮的值的唯一引用。
这是工作代码:

button=[]

root=Tk()
for i in range(4):
    b = Button(root, text=DispTXT[i], command= lambda i = i: boardWindow(i))
    b.pack()
    button.append(b)

root.mainloop()

推荐阅读