Python 如何在框架内显示标签,而不是在框架内显示标签
我正在制作我的第一个GUI,对框架的工作方式感到困惑。如何在框架内放置标签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:
定义初始化(自,窗口):
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)
谢谢,但我也希望显示背景色,但背景色不显示。我不明白为什么……嘿,我已经看了很多遍了,我自己也算出了“重量”,读过关于“粘性”的书,但理解错了。你把我的问题解释得很好!太棒了:)谢谢你,伙计。