这是我打算编写的程序的视图和控制器部分。 我的问题是为什么我看不到我的网格。 我的怀疑是我没有正确继承。
我认为问题发生在这里:
"self.frame=Small_Frame(self)"
这是我从代码中理解的。 类控制器继承自 tk。 类视图继承自 tk。框架。 到目前为止,一切正常。
类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()
问题是您将pack
和grid
与共享一个共同父级的小部件混合在一起。
首先,创建一个View
对象作为根窗口的子对象,并调用pack
将其添加到根窗口。
接下来,您将创建一系列Small_Frame
实例,但您忽略了将父实例传递给超类的__init__
,因此这些实例成为根窗口的子实例。实例在自身上调用pack
,然后在实例上调用grid
。在实例上调用grid
会导致 tkinter 进入无限循环,因为grid
和pack
都尝试以不同的方式调整父级的大小。每个都会触发另一个的重绘。
您需要做两件事。首先,从Small_Frame
__init__
中删除self.pack(fill=tk.BOTH, expand=1)
。让类调用本身pack
或grid
是一种不好的做法。创建小部件的代码应负责将其添加到屏幕。
其次,您需要将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