我的 python tkinter 网格来自此继承?



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

我认为问题发生在这里:

"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()

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

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

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

您需要做两件事。首先,从Small_Frame__init__中删除self.pack(fill=tk.BOTH, expand=1)。让类调用本身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

最新更新