0

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

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 = Frame(self.window, bg="green", height=25, width=600)
        self.frame = Frame(self.window, bg="red", height=375, width=600)

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

        self.label1 = Label(self.header, text="Hello World", bg="black", fg="white")
        self.label2 = Label(self.frame, text="This is the Game")

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


root = Tk()
gui = GUI(root)
root.mainloop()

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

4

2 回答 2

1

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

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

虽然一开始可能看起来违反直觉,但一旦您了解了这些规则的工作原理,这些规则实际上就可以很好地grid工作。

假设您想要headerframe填满窗口,您需要进行配置grid以了解如何处理额外的可用空间。这是通过给行或列一个“权重”来完成的。

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

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

零行的默认权重为 0(零),grid将为self.frame. 通过将权重 1(一)设置为零列,该列将获得所有额外的水平空间。

这样,框架将在顶部分配足够的空间用于标题,并且所有额外空间都将分配给self.frame. 还有一步需要完成。

即使self.frame已经给了所有额外的空间,您也需要告诉grid拉伸框架以适应所有分配的空间。您可以使用该sticky选项执行此操作。它采用代表罗盘上点的字母:n(北)、s(南)、e(东)和 w(西)。要让框架填充所有分配的空间,您希望它“粘”到所有四个侧面:

self.frame.grid(row=1, column=0, sticky="nsew")

类似地,要让标题拉伸以一直水平填充,您可以告诉它“粘”在东西方:

self.header.grid(row=0, column=0, sticky="ew")

这样,绿色标题框将填充屏幕的顶部,红色框将填充所有其余空间。

截屏

这可能仍然不是您想要的,但问题是相同的。如果您希望为标签分配标题中的所有空间,您需要使用给行和列 0 一个权重。这样做将使标签居中。如果您希望标签填充允许的空间,请使用sticky.

同样,如果您希望所有其他标签填充底部框架,请为该行和列赋予权重,标签将在空间中居中。如果您希望它填满所有分配的空间,请使用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)

截屏

于 2019-08-19T22:09:38.160 回答
0

a 的默认边框宽度Frame0指没有边框。如果您想要一个,则指定一个大于零的值。例如——注意添加的bd=1关键字参数(你也可以使用borderwidth=1):

此外,如果您希望文本在标签中居中,您必须给它们一个最小值width(字符数),并anchor通过一个选项指定您希望文本在该空间内如何对齐。

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

结果: 显示结果的屏幕截图

于 2019-08-19T00:31:49.870 回答