【问题标题】:Where is my python tkinter grid from this inheritance?这个继承的我的python tkinter网格在哪里?
【发布时间】:2020-01-05 00:21:14
【问题描述】:

这是我打算编写的程序的视图和控制器部分。我的问题是为什么我看不到我的网格。我的怀疑是我没有正确继承。

我认为问题在这里发生:

"self.frame=Small_Frame(self)"

这是我从我的代码中理解的。 Controller 类继承自 tk。类 View 继承自 tk.Frame。到这里一切正常。

class Small_Frame 是我的客户小部件。网格只是使用 grid() 方法的 Small_Frame 类的 12 个实例。我不知道为什么它没有出现。请帮我理解。谢谢你。

import tkinter as tk

class View(tk.Frame):
    def  __init__(self, parent, controller):
        tk.Frame.__init__(self, parent, bg= "yellow", bd =2, relief = tk.RIDGE)
        self.parent = parent
        self.controller = controller
        self.pack(fill=tk.BOTH, expand=1)

        for r in range(3):
            self.rowconfigure(r, weight=1)
            for c in range(4):
                self.columnconfigure(c, weight=1)
                self.frame=Small_Frame(self)
                self.frame.grid(row = r, column = c, padx=1, pady = 1,  sticky=
                         (tk.N, tk.S, tk.W, tk.E))


class Small_Frame(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, borderwidth=1, relief="groove")
        self.parent = parent
        self.pack(fill=tk.BOTH, expand=1)


class Controller():
    def __init__(self):
        self.root = tk.Tk()
        self.view = View(self.root, self)
        self.root.title("notbook my own try")
        self.root.geometry("1200x650")
        self.root.config(bg="LightBlue4")
        self.root.mainloop()


if __name__ == "__main__":
    c = Controller()

【问题讨论】:

    标签: python-3.x model-view-controller tkinter grid widget


    【解决方案1】:

    问题是您将packgrid 与共享一个共同父级的小部件混合在一起。

    首先,您将创建一个View 对象作为根窗口的子对象,并调用pack 将其添加到根窗口。

    接下来,您将创建一系列Small_Frame 实例,但您忽略了将父级传递给超类的__init__,因此这些实例成为根窗口的子级。实例调用自己的pack,然后你调用实例的grid。在实例上调用 grid 会导致 tkinter 进入无限循环,因为 gridpack 都尝试以不同的方式调整父级的大小。每一个都会触发另一个重绘。

    您需要做两件事。首先,从Small_Frame__init__ 中删除self.pack(fill=tk.BOTH, expand=1)。对自己进行类调用packgrid 是一种不好的做法。创建小部件的代码应该负责将其添加到屏幕上。

    其次,您需要将parent 传递给Small_Frame 中超类的__init__ 方法,以便Small_Frame 是正确父级的子级。因此,您的 __init__ 应如下所示:

    class Small_Frame(tk.Frame):
        def __init__(self, parent):
            tk.Frame.__init__(self, parent, borderwidth=1, relief="groove")
            self.parent = parent
    

    【讨论】:

    • 感谢您花时间回答。我对网格和打包方法感到困惑。我确实尝试在视图类上使用 pack(),它有效,但我不知道为什么在我放置 grid 方法时它会发生冲突。这是我作为练习编写的第三个应用程序。我有时很困惑。再次感谢。
    猜你喜欢
    • 2019-05-08
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    相关资源
    最近更新 更多