tkinter网格没有根据窗口大小调整大小



所以我遇到了一些我无法理解的事情,需要帮助。我有两个按钮,都可以将你发送到下一帧,它们工作得很好,但当我调整窗口大小时,它们保持不变,位于左上角,我希望它们自己放在屏幕中心。如果有一个关于他们成长的例子,我们也会感激,但不是必须的。此外,如果可能的话,我想坚持使用网格。我尝试了columnconfigure并将框架放置在另一个框架中,但我所做的似乎都不起作用。奇怪的是,如果我用self替换容器,并将self放在按钮上,它可以工作,但命令不起作用,有人能向我解释一下吗?或者给我一个很好的例子,说明我做错了什么?

代码示例:

import tkinter as tk
class MYapp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.grid(row = 0,column = 0, sticky = "nsew")
container.rowconfigure(0, weight = 1)
container.columnconfigure(0, weight = 1)
container.columnconfigure(1, weight = 1)
self.frames = {}
for FRAME in (N1, N2):
frame = FRAME(container, self)
self.frames[FRAME] = frame
frame.grid(row = 0, column = 0, sticky = "nsew")
self.show_frame(N1)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class N1(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
a = tk.Button(self, text = "N1", command = lambda: controller.show_frame(N2))
a.grid(row = 0, column = 0, sticky = "nsew")
c = tk.Button(self, text = "N1", command = lambda: controller.show_frame(N2))
c.grid(row = 0, column = 1, sticky = "nsew")
class N2(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
b = tk.Button(self, text = "N2")
b.grid(row = 0, column = 0, sticky = "nsew")
if __name__ == "__main__":
app = MYapp()
app.mainloop()

已解决:感谢布莱恩。这是已更新的代码,答案已到位。

import tkinter as tk
class MYapp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.pack(fill="both", expand=True)
container.rowconfigure(0, weight = 1)
container.columnconfigure(0, weight = 1)
self.frames = {}
for FRAME in (N1, N2):
frame = FRAME(container, self)
self.frames[FRAME] = frame
frame.grid(row = 0, column = 0, sticky = "nsew")
frame.rowconfigure(0, weight = 1)
frame.columnconfigure(0, weight = 1)
frame.columnconfigure(1, weight = 1)
self.show_frame(N1)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class N1(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
a = tk.Button(self, text = "N1", command = lambda: controller.show_frame(N2))
a.grid(row = 0, column = 0, sticky = "nsew")
c = tk.Button(self, text = "N1", command = lambda: controller.show_frame(N2))
c.grid(row = 0, column = 1, sticky = "nsew")
class N2(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
b = tk.Button(self, text = "N2")
b.grid(row = 0, column = 0, sticky = "nsew")
if __name__ == "__main__":
app = MYapp()
app.mainloop()

您没有知道首选行为是什么,只知道它所做的是错误的。我不知道这个建议会不会达到你想要的效果。

根据经验,当您使用grid时,您应该始终为包含要管理的小部件的父级赋予至少一行和一列权重。当您对容器中的小部件执行此操作时,不会对根窗口执行此操作。因此,容器内的小部件可能正在正确调整大小,但您不会看到它,因为容器本身没有调整大小。

如果你只想把一个小部件放在另一个小程序中,我建议你使用pack,因为你可以在一行代码中完成所有事情。因此,我建议对容器本身使用pack而不是grid

container.pack(fill="both", expand=True)

此外,由于您的容器似乎只有一行和一列,您可能不想给列1赋予权重。

最后,您还使用grid来管理每个页面内的小部件(N1N2),但同样,您忘记了为这些框架内的任何行或列赋予权重。

网格函数将它们保持在原来的位置。你可以使用pack功能,它可以帮助你。这只是特金特不容易做到的事情。

最新更新