在关于Python代码结构的另一个问题中,提出了一个解决方案: 在这里可以找到问题:Best way to structure a tkinter application
class Navbar(tk.Frame): ...
class Toolbar(tk.Frame): ...
class Statusbar(tk.Frame): ...
class Main(tk.Frame): ...
class MainApplication(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.statusbar = Statusbar(self, ...)
self.toolbar = Toolbar(self, ...)
self.navbar = Navbar(self, ...)
self.main = Main(self, ...)
self.statusbar.pack(side="bottom", fill="x")
self.toolbar.pack(side="top", fill="x")
self.navbar.pack(side="left", fill="y")
self.main.pack(side="right", fill="both", expand=True)
我喜欢该解决方案,并尝试在将其应用于我的代码之前以很小的规模复制它。 有人可以帮我设置应用程序时缺少哪些参数,参数吗? 参见下面的代码:
import tkinter as tk
class Main(tk.Frame):
def __init__(self, master):
central = tk.Frame(master)
central.pack(side="top", fill="both")
class SubMain(tk.Frame):
def __init__(self,master):
lowercentral = tk.Frame(master)
lowercentral.pack(side="top", fill="both")
class MainApplication(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.central = Main(self)
self.lowercentral = SubMain(self)
self.central.pack(side="top", fill="both")
self.lowercentral.pack(side="top", fill="both")
root = tk.Tk()
MainApplication(root).pack(side="top", fill="both")
root.mainloop()
我的代码很少。我希望代码基本上只是打开一个空白的空白窗口。 Main和SubMain类应创建两个框架。 MainApplication应该集成两个类,并有效地充当所有类的中心。
但是,我收到错误消息:
AttributeError:“主”对象没有属性“ tk”
我假设,例如在我的示例中,我缺少MainApplication的 init 函数中的参数,但是我的修改没有成功。
有人可以帮我吗?
答案 0 :(得分:2)
首先,当实例化Main
和SubMain
类时,您需要传递parent
而不是MainApplication
实例(自身)。
然后,您无需在类上调用pack
方法,因为Main
和SubMain
类都已经打包了框架:
import tkinter as tk
class Main(tk.Frame):
def __init__(self, master):
central = tk.Frame(master)
central.pack(side="top", fill="both")
class SubMain(tk.Frame):
def __init__(self,master):
lowercentral = tk.Frame(master)
lowercentral.pack(side="top", fill="both")
class MainApplication(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.central = Main(parent)
self.lowercentral = SubMain(parent)
#self.central.pack(side="top", fill="both")
#self.lowercentral.pack(side="top", fill="both")
root = tk.Tk()
MainApplication(root)#.pack(side="top", fill="both")
root.mainloop()
答案 1 :(得分:1)
您可以在 init 函数中尝试此操作:
super().__init__(master)
我使用了它并且起作用了。希望它有效。
答案 2 :(得分:1)
请确保在所有super().__init__()
函数中调用__init__
。它们在Main
和SubMain
中丢失。