首页 > 解决方案 > 网格几何管理器不会将框架置于窗口中间

问题描述

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

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

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

使用GridPage类 -不居中!
使用网格放置

使用PackPage类和.pack()函数 -像我需要的那样居中
使用网格放置

这是第二个示例的代码:

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

标签: pythontkinter

解决方案


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

这是使用这些功能 grid_rowconfigure()grid_columnconfigure()

您在这里需要做的似乎是使列权重 = 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")

推荐阅读