python-3.x - Tkinter 在循环中创建多个按钮并更改单击按钮的文本
问题描述
我尝试访问/更改在循环中创建的按钮的按钮属性。
我的想法是收集列表中的按钮,以便我可以访问每个按钮。有没有更好的办法?
目前我尝试使用按钮命令来更改单击按钮的文本。在“动作”功能中,当我尝试运行代码时,我得到错误代码“列表索引超出范围”!?
由于我是 python 和 tkinter 的新手,到目前为止已经过去了几个小时才能找到没有成功的解决方案。每一个想法都将不胜感激。
我在没有创建列表的情况下使用了完全相同的代码。代码正在运行,但是当我单击一个按钮时,只有最后一个创建的按钮更改了文本。难道是我必须以某种方式使用“StringVar”函数或“textvariable”吗?
import tkinter as tk
window = tk.Tk()
window.geometry("300x150")
window.title("Tic Tac Toe")
def action(i):
btns[i].configure(text = 'X')
btn_nr = -1
btns = []
for x in range(1,4):
for y in range(1,4):
btn_nr += 1
print(btn_nr)
btns.append(tk.Button(text='-', command = action(int(btn_nr))))
btns[int(btn_nr)].grid(row=x, column=y)
exit_button = tk.Button(text='Exit Game', command=window.destroy)
exit_button.grid(row=4, column=1, columnspan=15)
window.mainloop()
解决方案
你快到了。请参阅下面正在解决的问题,因为您需要一个 lambda 来将 btn_nr 传递给函数action
。顺便说一句,不需要 int()
import tkinter as tk
window = tk.Tk()
window.geometry("300x150")
window.title("Tic Tac Toe")
def action(button):
if btns[button].cget('text') == '-':
btns[button].configure(text='X')
else:
btns[button].configure(text='-')
btn_nr = -1
btns = []
for x in range(1, 4):
for y in range(1, 4):
btn_nr += 1
print(btn_nr)
btns.append(tk.Button(text='-', command=lambda x=btn_nr: action(x)))
btns[btn_nr].grid(row=x, column=y)
exit_button = tk.Button(text='Exit Game', command=window.destroy)
exit_button.grid(row=4, column=1, columnspan=15)
window.mainloop()
我action
稍微更改了功能,使其在“X”和“-”之间切换。
推荐阅读
- automated-tests - 谷歌是否支持 TestCafe 和 Puppeteer?,如果是,那么为什么?
- r - 是否有正则表达式可以在两个正斜杠之间和特定字符串之后查找字符串?[R]
- python - 使用 Pygame 的 Python 游戏出现游戏画面问题
- python-3.x - 如何使用 MinGW 编译 XGBoost
- powershell - Powershell - 提供一个不包含任何空值的集合
- floating-point - 24 位二进制到单精度浮点数
- android - 我可以在不制造智能手表的情况下创建适用于智能手表的操作系统吗
- c++ - 通过 conan_cmake_run 调用时更改柯南导入命令的工作目录
- javascript - 过滤 JSON 文件并查找值
- c# - 证书私钥在 ASP.Net Core 上引发 WindowsCryptographicException