我有以下脚本,它使用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'
为什么我会收到此错误?
答案 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。尽管如此,这是您第一个错误的解决方案。