python - 使用 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()
解决方案
当您使用expand
时,它会告诉 tkinter 为该小部件提供未分配的空间。当您expand
在多个小部件上设置为 True 时,未分配的空间将在该选项设置为 True 的所有小部件之间分配。
规范文档是这样说的:
如果主窗口太大以至于在打包所有从属窗口后会剩余额外空间,则额外空间将均匀分布在设置了 -expand 选项的所有从属窗口中。+
您所看到的是,一半未分配的空间分配给了顶部小部件,另一半分配给了底部小部件。因为fill
顶部小部件的选项是“两者”,所以小部件将填充分配给它的所有空间。但是,因为您指定了“x”的填充,y 轴上的额外空间未填充。
推荐阅读
- erlang - BEAM 文件是否记得它是否使用 -Werror 构建?
- spring - oracle jdbcTemplate 列类型无效
- c - 如何在c中替换char数组中的字母?
- html - 使用 document.delegate 时,子元素的 JQuery 事件处理程序在父元素之后触发
- apache-spark - 无法从 spark-sql 查询 Hive 表(德鲁伊存储)
- scala - 如何在scala中使用过滤器使用多重条件?
- java - 如何在 Java 中正确使用复制构造函数?
- swift - 单击选项卡栏时如何将表格视图发送到集合视图单元格的顶部?
- javascript - 如何使用匿名函数根据条件拆分数组
- oracle - PL/SQL 触发器在插入语句之前检查值