【问题标题】:"TclError: Unknown Option" whilst trying to generate 3x3 grid for Noughts and Crosses尝试为 Noughts 和 Crosses 生成 3x3 网格时出现“TclError:Unknown Option”
【发布时间】:2021-10-05 13:20:44
【问题描述】:

我正在开发一个小的 noughts and crosss 游戏来帮助我开始使用 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,然后再将其设置为按钮。

【问题讨论】:

  • self[f'{x+1}{y+1}BUTTON'] 应该做什么?为什么不直接使用button = tk.Button(...)button.grid(...) 然后ButtonList.append(button)
  • self[...] = X,在小部件子类上,是调用 .config() 的简写。您可以配置的名称由小部件定义,您不能创建自己的名称。无论如何,动态生成名称通常不是一个好主意,您应该将按钮添加到列表或字典中(看起来 ButtonList 就是为此目的)。
  • 我也不知道ThreadManager 是什么,但是在使用tkinter 的线程时要非常小心。如果在其他线程中使用tkinter,可能会导致python崩溃
  • @TheLizzard,它将按钮添加到类中。我是使用 Python 的新手,所以我不确定这是否是最好的选择。

标签: python user-interface tkinter tk


【解决方案1】:

由于您的类继承自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(...)

【讨论】:

  • 感谢您告诉并解释我应该如何解决问题(以及我将来应该如何生成按钮)!这对我的项目很有帮助。
猜你喜欢
  • 2014-12-18
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
相关资源
最近更新 更多