Python 如何在框架内显示标签,而不是在框架内显示标签

Python 如何在框架内显示标签,而不是在框架内显示标签,python,tkinter,Python,Tkinter,我正在制作我的第一个GUI,对框架的工作方式感到困惑。如何在框架内放置标签 类GUI: 定义初始化(自,窗口): self.window=window self.window.title(“RPG”) 自窗几何(“600x400”) self.window.configure(bg=“黑色”) self.window.grid_锚定(锚定=中心) self.header=Frame(self.window,bg=“绿色”,高度=25,宽度=600) self.frame=frame(self.w

我正在制作我的第一个GUI,对框架的工作方式感到困惑。如何在框架内放置标签

类GUI:
定义初始化(自,窗口):
self.window=window
self.window.title(“RPG”)
自窗几何(“600x400”)
self.window.configure(bg=“黑色”)
self.window.grid_锚定(锚定=中心)
self.header=Frame(self.window,bg=“绿色”,高度=25,宽度=600)
self.frame=frame(self.window,bg=“红色”,高度=375,宽度=600)
self.header.grid(行=0)
self.frame.grid(行=1)
self.label1=标签(self.header,text=“Hello World”,bg=“black”,fg=“white”)
self.label2=Label(self.frame,text=“这就是游戏”)
self.label1.grid(行=0,列=0)
self.label2.grid(行=0,列=0)
root=Tk()
gui=gui(根)
root.mainloop()

我想显示两个帧,就像现在的色块一样,每个帧都有一个居中的标签,但它根本不显示帧,只显示标签。

帧的默认边框宽度是
0
,这意味着没有边框。如果需要,请指定一个大于零的值。例如-注意添加的
bd=1
关键字参数(也可以使用
borderwidth=1
):

此外,如果希望文本在标签中居中,则必须为它们指定最小的
宽度
(字符数),并通过
锚定
选项指定文本在该空间内的对齐方式

import tkinter as tk


class GUI:
    def __init__(self, window):
        self.window = window
        self.window.title("RPG")
        self.window.geometry("600x400")
        self.window.configure(bg="black")
        self.window.grid_anchor(anchor="center")

        self.header = tk.Frame(self.window, bg="green", height=25, width=600, bd=1)
        self.frame = tk.Frame(self.window, bg="red", height=375, width=600, bd=1)

        self.header.grid(row=0)
        self.frame.grid(row=1)

        self.label1 = tk.Label(self.header, text="Hello World", bg="black", fg="white",
                      width=15, anchor='center')  # ADDED
        self.label2 = tk.Label(self.frame, text="This is the Game",
                      width=15, anchor='center')  # ADDED

        self.label1.grid(row=0, column=0)
        self.label2.grid(row=0, column=0)


root = tk.Tk()
gui = GUI(root)
root.mainloop()
结果:

默认情况下,框架(以及所有其他小部件)将收缩或扩展以适应其内容。因此,当您将标签放入框架内时,框架会收缩以适合标签

此外,您正在使用
网格
网格
将创建尽可能最小的行和列,以适应行和列中的内容<代码>网格只使用所需的空间,并且不会使用额外的空间,除非您已将其配置为这样做。不仅如此,网格还会在分配的空间中将项目居中,因此即使列或行大于项目,项目也不会填充该行或列

虽然乍一看似乎有悖常理,但一旦您了解了
grid
的工作原理,这些规则实际上非常有效

假设希望
标题
框架
填充窗口,则需要配置
网格
,以了解如何处理额外的可用空间。这是通过给行或列一个“权重”来实现的

例如,假设希望
self.header
成为顶部的水平stip,并且
self.frame
占用所有额外空间,则需要添加以下语句:

self.grid_rowconfigure(1, weight=1)
self.grid_columnconfigure(0, weight=1)
当第0行的默认权重为0(零)时,
grid
将为
self.frame
提供所有额外的垂直空间。通过将权重1(一)设置为列零,该列将获得所有额外的水平空间

这样,帧的顶部将被分配足够的空间给头部,所有额外的空间将被分配给
self.frame
。还有一个步骤需要完成

即使
self.frame
已经获得了所有额外的空间,您也需要告诉
grid
拉伸框架以适应其分配的所有空间。您可以使用
sticky
选项执行此操作。它用字母表示指南针上的点:北(北)、南(南)、东(东)和西(西)。要使框架填满其分配的所有空间,您希望它“粘住”所有四个面:

self.frame.grid(row=1, column=0, sticky="nsew")
类似地,要使标题延伸到水平方向,您可以告诉它“坚持”到东和西:

self.header.grid(row=0, column=0, sticky="ew")
这样,绿色的标题框将填充屏幕的顶部,红色的标题框将填充剩余的空间

这可能仍然不是您想要的,但问题是相同的。如果希望为标签分配标题中的所有空间,则需要使用为行和列0指定权重。这样做将使标签居中。如果您想让标签填满允许的空间,请使用
粘滞

同样,如果希望所有其他标签填充底部框架,请为该行和列指定权重,标签将在空间中居中。如果您想让它填满所有分配的空间,请使用
sticky

例如:

    self.header.grid_rowconfigure(0, weight=1)
    self.header.grid_columnconfigure(0, weight=1)

    self.frame.grid_rowconfigure(0, weight=1)
    self.frame.grid_columnconfigure(0, weight=1)

谢谢,但我也希望显示背景色,但背景色不显示。我不明白为什么……嘿,我已经看了很多遍了,我自己也算出了“重量”,读过关于“粘性”的书,但理解错了。你把我的问题解释得很好!太棒了:)谢谢你,伙计。