“TclError:未知选项”,同时尝试为 Noughts 和 Crosses 生成 3x3 网格

问题描述

我正在开发一个小游戏来帮助我开始使用 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'] = 100self.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(...)