问题描述
我正在开发一个小游戏来帮助我开始使用 Python,但我不断收到错误:_tkinter.TclError: unkNown option "-11BUTTON"
,我该如何解决这个问题。
import ThreadManager
import tkinter as tk
class Application(tk.Frame):
def __init__(self,master=None):
super().__init__(master)
self.master = master
self.pack()
self.CreateWidgets()
def CreateWidgets(self):
ButtonList = []
for x in range(3):
for y in range(3):
self[f'{x+1}{y+1}BUTTON'] = tk.Button(self,text=f'{x+1}{y+1}_BUTTON')
self[f'{x+1}{y+1}BUTTON'].grid(row=x+1,column=y+1)
self.RestartApp = tk.Button(self,text="RESTART",fg="green",command=self.restart)
self.RestartApp.grid(row=4,column=1)
self.QuitApp = tk.Button(self,text="QUIT",fg="red",command=self.master.destroy)
self.QuitApp.grid(row=4,column=3)
def Restart():
print('Restarting')
# Start game stuff goes here,I haven't gotten onto this part yet as I've only just started it
Window = tk.Tk()
App = Application(master=Window)
App.mainloop()
无论如何我可以解决这个问题吗?我还没有添加任何游戏功能,ThreadManager
是另一个处理其他内容的文件。
尝试过的东西:
在将其设置为按钮之前将值设置为 None
。
解决方法
由于您的类继承自 tk.Frame
,因此它继承了框架小部件的所有行为。该行为的部分原因是 self[x]
只是 x
属性的方便别名(例如:self['width'] = 100
和 self.configure(width=100)
是同义词)。
错误告诉您 11BUTTON
不是有效属性。如果您执行 self.configure('11BUTTON') = ...
你不能用 self[...]
做到这一点。相反,您需要创建一个实例属性。
例如:
self.buttons = {}
for x in range(3):
for y in range(3):
self.buttons[f'{x+1}{y+1}BUTTON'] = tk.Button(self,text=f'{x+1}{y+1}_BUTTON')
...
不过,如果您使用元组而不是格式化字符串,代码至少可以说更容易理解:
self.buttons[(x,y)] = tk.Button(...)