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