网格几何管理器不会将框架在窗口中间居中

时间:2019-05-13 18:08:47

标签: python tkinter

不久前,我开始用python开发一些GUI,最后我决定知道足够多的知识,可以使用网格几何管理器编写完整的GUI。 我很惊讶地发现,当我尝试使用sticky="nsew"参数将网格的框架扩展到窗口边缘时,它没有用,并且网格中的所有元素都保留在网格的左上角。屏幕上。

您可以在下面查看我的代码和一些屏幕截图。

为解决此问题,我尝试了各种解决方案,包括删除了sticky参数(第7行),但是,这弄乱了背景色,并且框架没有延伸到窗口边缘。 如何解决此问题并使框架延伸到窗口边框?提前致谢! (;

使用GridPage类-不居中!
placed using grid

使用PackPage类和.pack()函数-像我需要的那样居中
placed using grid

这是第二个示例的代码:

import tkinter as tk

class DefaultPage(tk.Frame):

    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
        self.grid(row=0, column=0, sticky="nsew")


class GridPage(DefaultPage):

    def __init__(self, *args, **kwargs):
        DefaultPage.__init__(self, *args, **kwargs)

        tk.Button(self, text='hello!').grid()
        tk.Label(self, text="I'm placed USING GRID").grid()


class PackPage(DefaultPage):

    def __init__(self, *args, **kwargs):
        DefaultPage.__init__(self, *args, **kwargs)

        tk.Button(self, text='hi there!').pack()
        tk.Label(self, text="I'm placed USING PACK").pack()


root = tk.Tk()

baseframe = tk.Frame(root)
baseframe.pack(side="top", fill="both", expand=True)
baseframe.grid_rowconfigure(0, weight=1)
baseframe.grid_columnconfigure(0, weight=1)

# frame = PackPage(baseframe, bg='yellow')  # second screenshot. works as intended
frame = GridPage(baseframe, bg='yellow')  # not centerd in the middle of the window.

root.mainloop()

1 个答案:

答案 0 :(得分:2)

您需要配置行和列的权重。 默认情况下,权重= 0,这意味着框架内的小部件将始终缩小到最小尺寸。因此,您需要进行配置。

这可以通过以下功能实现 grid_rowconfigure()grid_rowconfigure()

您似乎需要做的是使列的权重= 1随容器扩展,同时保持第一行的权重= 0以使标签和按钮始终贴紧。

您的代码将是这样

class DefaultPage(tk.Frame):

    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
        self.grid(row=0, column=0, sticky="nsew")
        self.grid_rowconfigure(0, weight=0)
        self.grid_columnconfigure(0, weight=1)


class GridPage(DefaultPage):

    def __init__(self, *args, **kwargs):
        DefaultPage.__init__(self, *args, **kwargs)

        tk.Button(self, text='hello!').grid(sticky="n")
        tk.Label(self, text="I'm placed USING GRID").grid(sticky="n")