【问题标题】:Python - object has no attribute error using TkinterPython - 使用 Tkinter 的对象没有属性错误
【发布时间】:2020-05-14 00:41:50
【问题描述】:

所以我正在创建一个快速的 Tic-Tac-Toe 小游戏来与 Tkinter 一起练习,但我遇到了一个小问题。我正在使用一个 Window 类来保存我的方法和框架,并且我在框架中的一个按钮有一个指向我的“game()”方法的命令。但是,一旦我运行脚本,我就会收到 AttributeError: 'Window' object has no attribute 'game' 错误。

到目前为止,这是我的代码:

from tkinter import *

class Window(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.master = master
        self.master.title("Tic-Tac-Toe")
        self.grid()

        # GUI Grid
        for row in range(2):
            if row == 0:
                self.master.grid_rowconfigure(row, weight=1)
            else:
                self.master.grid_rowconfigure(row, weight=6)
        for col in range(3):
            self.master.grid_columnconfigure(col, weight=1)

        # Game Loop
        def game(self):
            switch = 0
            game_status = True
            Frame2.button.config(status=ENABLED) 


        # Game Title
        Frame1 = Frame(self.master, bg="#424242")
        Frame1.grid(row=0, column=0, columnspan=3, sticky=W+E+N+S)
        Frame1.label = Label(Frame1, font=("Arial", 16), text="Tic-Tac-Toe", bg="#424242", fg="#FDD835")
        Frame1.button = Button(Frame1, bd=0, font=("Arial", 10), text="Start", bg="#FDD835", fg="#212121", command=self.game)
        Frame1.label.pack()
        Frame1.button.pack()

        # Game Board
        Frame2 = Frame(self.master, bg="#BDBDBD")
        Frame2.grid(row=1, column=0, columnspan=3, sticky=W+E+N+S)
        for i in range(3):
            Frame2.grid_rowconfigure(i, weight=1)
            Frame2.grid_columnconfigure(i, weight=1)
        for x in range(3):
            for y in range(3):
                Frame2.button = Button(Frame2, bd=1, state=DISABLED, font=("Arial", 18), bg="#BDBDBD", fg="#FFFFFF")
                Frame2.button.grid(row=x, column=y, sticky=W+E+N+S)



root = Tk()
root.geometry("500x500")
app = Window(root)
root.mainloop()

有问题的按钮是 Frame1.button。我将命令设置为command=self.master.game 无济于事。感谢所有帮助!

【问题讨论】:

  • 正如错误所暗示的,self.master 没有将game 定义为属性。
  • @EricJin 我做了self.game,游戏定义在class Window(Frame):内,如代码sn-p所示。我之前试过self.master,还是不行。
  • 只是取消缩进函数game
  • @jizhihaoSAMA 谢谢你,我刚刚意识到,就像你发表评论一样。谢谢。

标签: python tkinter


【解决方案1】:

问题是您的 game 函数位于 init 函数之下。

而且你得到了很多额外的错误,所以我完全重新编写了你的​​代码。

from tkinter import *

class Window(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.master = master
        self.master.title("Tic-Tac-Toe")
        self.grid()

        # GUI Grid
        for row in range(2):
            if row == 0:
                self.master.grid_rowconfigure(row, weight=1)
            else:
                self.master.grid_rowconfigure(row, weight=6)
        for col in range(3):
            self.master.grid_columnconfigure(col, weight=1)

        # Game Loop
    def game():
        global Frame2
        switch = 0
        game_status = True
        Frame2.button.config(state="normal")


# Game Title 
root = Tk()
root.geometry("500x500")
app = Window(root)
Frame1 = Frame(root, bg="#424242")
def run():
    Window.game()
Frame1.grid(row=0, column=0, columnspan=3, sticky=W+E+N+S)
Frame1.label = Label(Frame1, font=("Arial", 16), text="Tic-Tac-Toe", bg="#424242", fg="#FDD835")
Frame1.button = Button(Frame1, bd=0, font=("Arial", 10), text="Start", bg="#FDD835", fg="#212121", command=run)
Frame1.label.pack()
Frame1.button.pack()

# Game Board
Frame2 = Frame(root, bg="#BDBDBD")
Frame2.grid(row=1, column=0, columnspan=3, sticky=W+E+N+S)
for i in range(3):
    Frame2.grid_rowconfigure(i, weight=1)
    Frame2.grid_columnconfigure(i, weight=1)
for x in range(3):
    for y in range(3):
        Frame2.button = Button(Frame2, bd=1, state=DISABLED, font=("Arial", 18), bg="#BDBDBD", fg="#FFFFFF")
        Frame2.button.grid(row=x, column=y, sticky=W+E+N+S)
root.mainloop()

希望这会有所帮助!

【讨论】:

  • 刚刚在您输入答案时意识到我的错误。谢谢你的清理!
  • 没问题! @SuperHydracid 总是乐于提供帮助。
猜你喜欢
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
相关资源
最近更新 更多