python - 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
当我尝试创建按钮时?
解决方案
只有一个按钮出现的原因是因为button
只有一个值,None
。button[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()
推荐阅读
- android - 在android中的键盘上方显示动态edittext
- python - Django 不发送服务器错误(500)电子邮件
- excel - 从子例程运行工作表事件
- c# - 将 Linq 结果转换为 JSON 数组
- css - 我尝试使用浮动来定位一些文本,但它甚至没有移动
- sql - 如何在数据库中为每个主题获取最小和最大日期
- mysql - MariaDB 查询两个字段中的最大值和最小值
- php - docker-compose:无法从我的 LEMP 堆栈访问 phpMyAdmin
- python - 一个字符串中的多个字符串替换
- python - 如何在 Python 中使用新数据更新绘图?