如何将我的课程整合到期末课程中?

时间:2018-11-08 10:26:36

标签: python python-3.x oop tkinter

在关于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 函数中的参数,但是我的修改没有成功。

有人可以帮我吗?

3 个答案:

答案 0 :(得分:2)

首先,当实例化MainSubMain类时,您需要传递parent而不是MainApplication实例(自身)。 然后,您无需在类上调用pack方法,因为MainSubMain类都已经打包了框架:

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__。它们在MainSubMain中丢失。