首页 > 解决方案 > 使用 tkinter 包几何管理器的帧之间的空间

问题描述

我试图了解 pack 在 tkinter 中的工作原理。

我执行以下示例代码:

# -*- coding: utf-8 -*-

import tkinter as tk

window = tk.Tk()

window.title('TEST')

frame1 = tk.Frame(window, height="90", background="red")
frame2 = tk.Frame(window, height="10", background="green")
frame1.pack(fill=tk.BOTH, expand=1, side=tk.TOP)
frame2.pack(fill=tk.X, expand=1, side=tk.TOP, anchor=tk.S)

window.mainloop()

我得到以下结果:

在此处输入图像描述

但如果窗口是拉伸的,则两个框架之间会出现一个空白(灰色)区域。我对上述代码的期望是红框会占用所有可用空间。

在此处输入图像描述


编辑:按照布莱恩的回答,这是获得所需行为的正确代码。

# -*- coding: utf-8 -*-

import tkinter as tk

window = tk.Tk()

window.title('TEST')

frame1 = tk.Frame(window, height="90", background="red")
frame2 = tk.Frame(window, height="10", background="green")
frame1.pack(fill=tk.BOTH, expand=1, side=tk.TOP)
frame2.pack(fill=tk.X, side=tk.TOP, anchor=tk.S)

window.mainloop()

标签: pythontkinter

解决方案


当您使用expand时,它会告诉 tkinter 为该小部件提供未分配的空间。当您expand在多个小部件上设置为 True 时,未分配的空间将在该选项设置为 True 的所有小部件之间分配。

规范文档是这样说的:

如果主窗口太大以至于在打包所有从属窗口后会剩余额外空间,则额外空间将均匀分布在设置了 -expand 选项的所有从属窗口中。+

您所看到的是,一半未分配的空间分配给了顶部小部件,另一半分配给了底部小部件。因为fill顶部小部件的选项是“两者”,所以小部件将填充分配给它的所有空间。但是,因为您指定了“x”的填充,y 轴上的额外空间未填充。

有关打包程序如何工作的非常精确的描述,请参阅打包的 tcl/tk 手册页中的打包程序算法


推荐阅读