首页 > 解决方案 > 添加项目后如何保持Tkinter帧大小不变

问题描述

我想将一条线均匀地分成多个区域并在其中放置项目,但遇到了一些问题。如果我运行下面的代码,该区域被平均分为三个部分。

from tkinter import *

tk = Tk()

command_area = Frame(tk, pady=10)
command_area.pack(side=TOP)

width = 300
info_area = Frame(command_area, bg='blue', height=50, width=width)
info_area.pack(side=LEFT)
button_area = Frame(command_area, bg='yellow', height=50, width=width)
button_area.pack(side=LEFT)
time_area = Frame(command_area, bg='green', height=50, width=width)
time_area.pack(side=LEFT)


tk.mainloop()

但是,如果我将一些项目添加到任何这些框架中,框架的宽度将会改变。例如,如果我添加

bomb_label = Label(info_area, text='A sentence')
bomb_label.pack()

在“tk.mainloop()”之前,第一个区域被缩短。在向它们添加项目后,如何使这些框架的大小保持不变?谢谢。

标签: pythontkinter

解决方案


我能想到至少三种方法来实现你的目标。每种方法都有优点和缺点。由于您的问题有些模糊,因此很难说哪种方法最好。

但是,我认为这grid是最好的选择。它允许您指定行和/或列必须具有统一的大小。再加上赋予所有列相同的权重,将产生您想要的结果。

要创建统一宽度的列,您需要使用该uniform选项,并为每一列赋予相同的值。该值无关紧要,因为具有相同值的所有列将被强制为相同大小。

在下面的示例中,我还为每一列赋予了相同的非零值weight,这将允许任何额外的空间在列之间平均分配。如果用户调整窗口大小,这会让列增长。

command_area.pack(side=TOP, fill="x")
command_area.grid_columnconfigure((0,1,2), uniform="1", weight=1)

info_area.grid(row=0, column=0, sticky="ew")
button_area.grid(row=0, column=1, sticky="ew")
time_area.grid(row=0, column=2, sticky="ew")

截屏


推荐阅读