tkinter网格未根据窗口大小

时间:2017-10-23 21:21:43

标签: python-3.x tkinter grid resize

所以我遇到了一些我无法解决并需要帮助的东西。我有两个按钮,它们都会发送到下一帧并且它们工作得很好但是当我调整窗口大小时它们保持相同的大小并保持在左上角,我希望它们将它们放置在屏幕的中心。如果有一个关于它们成长的例子,那也将被理解但不是必要的。如果可能的话,我也想坚持使用网格。 我尝试了columnconfigure并将框架放在另一个框架中,我所做的一切似乎都没有用。奇怪的是,如果我用自己替换容器并将自己放在它工作的按钮上,但是没有命令工作,有人可以向我解释这个或给我一个很好的例子,我做错了什么?

代码示例:

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

2 个答案:

答案 0 :(得分:1)

你没有理解首选行为是什么,只是它所做的事情是错误的。我不知道这个建议是否符合您的要求。

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

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

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

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

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

答案 1 :(得分:0)

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