tkinter 网格不根据 window 大小调整大小

tkinter grid not resizing based on window size

所以我遇到了一些我无法弄清楚并需要帮助的事情。我有 2 个按钮,它们都将您带到下一帧,它们工作得很好,但是当我调整 window 的大小时,它们保持相同的大小并留在左上角,我希望它们将自己放在中心的屏幕。如果有一个关于它们也在增长的例子,那也将不胜感激,但不是必需的。如果可能的话,我也想坚持使用网格。 我尝试了 columnconfigure 并将框架放在另一个框架中,但我所做的一切似乎都不起作用。奇怪的是,如果我用 self 替换 container 并将 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()

网格功能使它们保持原样。您可以使用可以帮助您的 pack 功能。这只是 Tkinter 不容易做到的事情。

你不知道首选的行为是什么,只是它所做的是错误的。不知道这个建议能不能如你所愿

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

如果您只想将一个小部件放入另一个小部件,我建议使用 pack,因为您可以在一行代码中完成所有操作。因此,我建议对容器本身使用 pack 而不是 grid

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

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

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