"TclError: Unknown Option" whilst trying to generate 3x3 grid for Noughts and Crosses
"TclError: Unknown Option" whilst trying to generate 3x3 grid for Noughts and Crosses
我正在开发一个小的十字交叉游戏来帮助我从 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
是另一个处理其他内容的文件。
尝试过的东西:
Setting the value to None
before setting it as a button.
由于您的 class 继承自 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(...)
我正在开发一个小的十字交叉游戏来帮助我从 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
是另一个处理其他内容的文件。
尝试过的东西:
Setting the value to
None
before setting it as a button.
由于您的 class 继承自 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(...)