【问题标题】:AttributeError: 'Application' object has no attribute 'tk'AttributeError:“应用程序”对象没有属性“tk”
【发布时间】:2018-10-17 18:20:18
【问题描述】:

我有以下使用 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: 'Application' 对象没有属性 'tk'

为什么会出现这个错误?

【问题讨论】:

  • 与您的问题无关。你知道frame.pack 不是一个函数调用并且不打包任何东西,不是吗?
  • 你没有打电话给Frame.__init__(self, master)。另一个问题是您的按钮命令是错误的。将command = self.Print()更改为command = self.Print,否则立即调用函数并将命令设置为函数的返回值。

标签: python python-3.x tkinter attributeerror


【解决方案1】:

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

Traceback (most recent call last):
  File "t.py", line 23, in <module>
    b = Application(root)    
  File "t.py", line 15, in __init__
    self.QUIT = tk.Button(frame, text = 'Quit', fg = 'Red', command = self.quit())
  File "/usr/lib/python3.6/tkinter/__init__.py", line 1283, in quit
    self.tk.quit()
AttributeError: 'Application' object has no attribute 'tk'

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

显然,有一个对象,Application 类的实例,它没有tk 属性。有道理:我们创建了这个类,但我们没有添加这个属性。

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

那么,我们要做的就是在我们自己的初始化程序中调用tkinter.Frame 初始化程序。这可以通过直接从tk.Frame 调用__init__() 来轻松完成,并传递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()

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

【讨论】:

    猜你喜欢
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2015-09-27
    • 2021-11-03
    • 2019-04-27
    • 1970-01-01
    相关资源
    最近更新 更多