我的python tkinter网格从哪里继承?

问题描述 投票:0回答:1

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

我认为问题在这里发生:

"self.frame=Small_Frame(self)"

这是我从代码中了解的内容。 class Controller是从tk继承的。 View类是从tk.Frame继承的。到这里为止一切正常。

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个回答
0
投票

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

首先,您正在创建View对象作为根窗口的子级,然后调用pack将其添加到根窗口中。

接下来,您正在创建一系列Small_Frame实例,但是您忽略了将父级传递给超类的__init__,因此这些实例成为根窗口的子级。该实例本身调用pack,然后您对该实例调用grid。在实例上调用grid会使tkinter陷入无限循环,因为gridpack都试图以不同的方式调整父对象的大小。每个触发另一个触发重画。

您需要做两件事。首先,从self.pack(fill=tk.BOTH, expand=1)__init__中删除Small_Frame。本身有一个类调用packgrid是一个不好的做法。创建小部件的代码应负责将其添加到屏幕。

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

class Small_Frame(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent, borderwidth=1, relief="groove")
        self.parent = parent
© www.soinside.com 2019 - 2024. All rights reserved.