AttributeError:'应用程序'对象没有属性' tk'

时间:2018-05-07 21:31:44

标签: python python-3.x tkinter attributeerror

我有以下脚本,它使用Tkinter:

import tkinter as tk

class Application(tk.Frame):    

    def __init__(self, master):
        frame = tk.Frame(master)
        frame.pack

        self.PRINT = tk.Button(frame, text = 'Print', fg = 'Red', command = self.Print())
        self.PRINT.pack(side = 'left')    

        self.QUIT = tk.Button(frame, text = 'Quit', fg = 'Red', command = self.quit())
        self.QUIT.pack(side = 'left')    

    def Print(self):
        print('at least somethings working')

root = tk.Tk()

b = Application(root)    
root.mainloop()

当我运行它时,我收到以下错误:

  

AttributeError:'应用程序'对象没有属性' tk'

为什么我会收到此错误?

1 个答案:

答案 0 :(得分:1)

我在这里运行你的脚本并获得了这个堆栈跟踪:

Application

错误消息出现在最后,但整个堆栈很重要!我们来分析吧。

显然,有一个tk类的实例,没有tkinter.Frame属性。有道理:我们创建了这个类,但我们没有添加这个属性。

好吧,主循环期望一个属性存在!会发生什么,我们的类扩展tk,并且框架需要此__init__()属性。幸运的是,我们不必考虑如何创建它:因为所有帧都需要它,所以帧初始化器(它的tkinter.Frame方法)知道如何设置这个属性。

然后,我们要做的就是在我们自己的初始化程序中调用__init__()初始值设定项。这可以通过直接从tk.Frame调用self,传递tk.Frame.__init__(self, master) 变量来轻松完成:

import tkinter as tk

class Application(tk.Frame):    

    def __init__(self, master):
        tk.Frame.__init__(self, master)

        frame = tk.Frame(master)
        frame.pack

        self.PRINT = tk.Button(frame, text = 'Print', fg = 'Red', command = self.Print())
        self.PRINT.pack(side = 'left')    

        self.QUIT = tk.Button(frame, text = 'Quit', fg = 'Red', command = self.quit())
        self.QUIT.pack(side = 'left')    

    def Print(self):
        print('at least somethings working')

root = tk.Tk()

b = Application(root)    
root.mainloop()

整个脚本将是这个,然后:

{{1}}

现在,您的脚本中还会出现其他一些错误,您很快就会发现;)还有一些与多重继承相关的复杂问题可以解决with the super() function。尽管如此,这是您第一个错误的解决方案。