用tkinter.pack设计复杂界面布局

【Python】Tkinter模块(巨详细) 通常如果没有为组件设置大小和设置间距,组件的大小应该是适应内容;如果设置了间距,那么无论标签里的内容多少,里面的内容始终能够与标签边缘保持距离。其左上角的羽毛是窗口的默认图标,而羽毛右边的“tk”是窗口的默认名称。tkinter模块中大多数组件都可以通过width和height设置宽度和高度,大部分组件设置大小时,单位为像素,但是也有部分组件单位为文字的行,例如Label组件。虽然tkinter模块中提供了众多组件且每个组件都有各自的属性,但有些属性是各组件通用的。实例-设置组件的间距。 阅读详情
AI摘要

本文深入剖析Tkinter的包布局管理器(pack)的工作原理,详细解释组件如何在界面上定位和扩展,包括组件的独占空间、可扩展空间、锚定位和填充等概念。通过实例演示,帮助读者掌握包布局在Python GUI应用设计中的应用。

对程序员来说,界面设计的实现,要解决的一个主要问题就是如何根据界面设计的需求,将组件以规定的大小放置在规定的位置。tkinter是python语言中常用的界面实现模块,其中pack()方法,可创建浮动,自动伸缩扩展的软件界面,如以下界面。

如果你对以上用tkinter.pack实现的界面布局有兴趣,觉得有些实现效果可以参考借鉴,请继续阅读下面的内容。

一. pack的组件空间布局原理分析

用pack进行的布局界面组件,可用以下一些界面布局空间来进行分析

side = top 的布局空间

side = left 的布局空间

1. 容器可用空间 

系统严格按代码的前后组织顺序依次排列组件,前辈组件还没有占据的空间,是当前组件的可用空间,pack布局是在当前组件的可用空间内进行的。如上图的黑边白底的区域。(为了说明,我留出padding空间,若没有padding,组件将占据整个目前可用空间)

2.组件原始大小可见空间

设置了width, height, 或由具体内容确定的组件原始大小,也就是可以看得见的组件宽高。如上图的黄色区域。

3.组件的独占空间

组件不单只占据它原始可见的位置,而是会同时占据可用空间的整行空间或整列空间。如上图红色区域。

side = top / bottom 时,组件占据整行,后辈组件只能依次排在它的下面 / 上面;组件为上下排列方式

side = left / right 时, 组件占据整列,后辈组件只能依次排在它的右边 / 左边;组件为左右排列方式

pack() , 我分析下来,其实就是 pack(side=top)

组件独占空间,没有进行填充(fill)时,不可见,但我们必须了解到它的存在,因为它直接影响组件本身及后辈组件的布局。

组件独占空间,是固有的,其它后辈组件绝对不可能进入该空间,后辈组件最多只能紧靠它。

4. 组件可扩展空间

组件独占空间的另一个方向,是组件的可扩展空间方向。如上图的浅蓝色区域。

side = top / bottom 时,组件独占整行,并可向整列方向进行扩展。

side = left / right 时,组件独占整列,并可向整行方向进行扩展。

组件可扩展空间,没有进行填充(fill)时,也是不可见的,但它同样会直接影响自身和后辈组件的布局,必须掌握它的空间存在。

若设置了 expand = yes, 则启用可扩展空间;若 expand = no, 则不启用可扩展空间。

组件可扩展空间,是动态的,是可以被后辈组件的独占空间占据压缩的,后辈组件可以从前辈可扩展空间的边缘开始入侵,直至压缩到前辈组件自身的独占空间为止。 

5. 组件占用总空间

组件独占空间 + 组件可扩展空间,就是当前组件的总占用空间,若没有启用组件扩展空间(expand = no),则只包含组件独占空间。

接下来的 锚定位(anchor)和填充(fill),都是基于组件的占用总空间来进行处理的。

6. 空间定位和填充

锚定位(anchor ),加 padx, pady , 可将组件安排在指定位置

锚定位有9个方向,缺省为 center, 居中

若 side = top / bottom ,  expand=no, 则合并到一行,即NW, W, SW的效果一样,其他同理。

若 side = left / right,  expand = no, 则合并到一列,即NW, N, NE的效果一样,其他同理

填充(fill)组件,可以将组件的可见,可操作范围充满指定区域

填充的方式有4种,缺省的方式是(none),不填充。

 

二. 单组件布局的分析步骤

以上描述的pack布局原理,需要仔细理解和掌握,这是pack布局的基础,当我们理解这些原理后,就可以用来控制单个组件的位置了。

基本分析步骤为:

1. 明确当前容器的可用空间范围

2.分析是用上下排列方式(side=top / bottom),还是左右排列方式(side=left/right)

3.分析是否需要启用扩展空间,若需要则设置 expand = yes, 否则保持缺省值 expand = no

4.利用锚定位(anchor),确定组件的具体位置

5.利用填充(fill), 对组件的可见区域进行填充

 

举例分析:

设置代码

布局效果

说明

.pack(side=‘top‘)

独占整行,缺省居中

.pack(side='top', anchor='sw')

没有启用可扩展空间,只独占行,锚定位 nw, w, sw 都一样,定位在西边

.pack(side='top', expand='yes', anchor='sw')

启用可扩展空间,除了独占的行空间,还扩展到了容器可用空间的所有列空间,锚定位'sw' ,定位到了容器的西南边

.pack(side='top', expand='yes')

启动扩展空间,没有设置anchor,则缺省居中(整个组件占用空间的中间,不同于第1个例子)

.pack(side='top', expand='yes', fill='y')

启用扩展空间,定位完后,进行“y”轴方向的填充,填满整个占用空间的列

.pack(side='top', fill='y')

没有启用扩展空间,当选择进行“y”方向填充时,也只是在独占的行空间内进行“y”方向填充

 

三.  多组件布局的分析

我们现在基本掌握了单个组件的布局定位分析方法,而实际的软件界面,一定是多组件的综合布局,涉及多组件之间的相互关系和影响。以上所有讲到的单组件布局分析,都有一个前提,就是在已知容器可用空间的前提下, 进行当前组件的布局定位。

 

整理分析多组件布局的要点:

1. 所有组件按代码的前后组织次序,依次进行布局定位

2. 设置side = top / bottom 的组件,为上下排列的组件,独占当时可用空间的整行 

3. 设置side = left / right 的组件,为左右排列的组件,独占当时可用空间的整列

4. 后辈组件不可进入任何前辈组件的独占空间,不论 side的设置如何,是否相同,一律都是前辈

5. 组件可扩展空间,是动态的,是可以被后辈组件的独占空间占据压缩的,后辈组件可以从前辈可扩展空间的边缘开始入侵,直至压缩到前辈组件自身的独占空间为止

6.后辈组件的扩展空间,不能侵占前辈组件的扩展空间;既若扩展空间重叠,前辈享用扩展空间

7. 若整个界面空间缩小,出现后辈组件独占空间跟前排组件独占空间重叠时,后辈组件将被压缩,直至消失。

8. 若界面空间继续缩小,小到比组件独占空间小时,组件将被压缩,直至消失。

9. 空间优先级别为:界面空间 > 前辈组件独占空间 > 后辈组件独占空间 > 前辈组件可扩展空间 > 后辈组件可扩展空间

10.可利用frame的多层嵌套,进行灵活布局

 

举例分析:

设置代码

布局效果

说明

1.pack(side='left', expand='no', anchor='w', fill='y', padx=5, pady=5)
2.pack(side='top')
3.pack(side='right')
4.pack(side='bottom')

块1:

第一个组件,可用空间为整个界面空间,靠左,独占列,不启动扩展空间,按“y”方向填充,周围有5个像素的padding

 

块2:

可用空间从块1的右边缘开始,靠上,独占行,位置居中,但注意是从块1右边缘到界面边缘的中间位置,而不是整个界面的中间位置

 

块3:

靠右,居中;其上下可用空间大小是块2的下边缘,到界面边缘

 

块4:

靠下,居中;其左右可用空间大小是从块1的右边缘 到 块3的左边缘

1.pack(side='left', expand='yes', fill='x')
2.pack(side='top')
3.pack(side='right', expand='yes', fill='x')
4.pack(side='bottom')
 

这个例子比较复杂点

块1:

启用了扩展空间,往“x”行方向填充,但被块2,块3,块4的独占空间压回到了现在的大小。

 

块2:

同上,始终位于块1右边缘和界面边界的中间靠上位置

 

块3:

启用了扩展空间,但也越不过块4的独占列空间

 

块4:

始终位于块1,块3的中间位置靠下

1.pack(side='left', expand='no', fill='y')
2.pack(side='top', fill='x')
3.pack(side='right', expand='yes', fill='both')

一个很常规的导航界面设置

块1:导航栏

靠左,上下填充,不可扩展

 

块2:标题栏

靠上,左右扩展

 

块3:内容栏

位置无所谓,全面扩展填充

 

 

四. 代码演示

我写了一个布局演示程序,包含文章开头展示的界面,可以对照界面实际效果和具体代码,来了解实现的细节。另外提供了单组件和多组件的演示工具,可以调整设置,观察效果,来理解和掌握pack布局的基本方法。演示程序中还包括一些其它窗体布局和实现的方法,希望对大家有帮助。

源代码位置:

https://github.com/EdwinZhang1970/Python/tree/master/tkinter-pack%20Demo

 

 

 

 

 

 

深度解析:Tkinter 界面布局与优化技巧 pack()grid()和place(),每一种都有其适用场景。选择合适的布局管理器是界面设计的关键步骤。pack():组件按顺序排列,适用于简单、线性布局。grid():基于行和列的布局管理器,适合复杂的界面布局。place():精确的像素级控制,适用于对位置有严格要求的场景。布局和优化是开发任何图形用户界面的关键部分。在使用 Tkinter 时,灵活运用pack()grid()和place()布局管理器可以创建布局合理、视觉美观的应用程序。通过响应式设计和合理的资源管理,还可以提升用户体验。 阅读详情

相关推荐

Python自带的标准 GUI(图形用户界面)库——Tkinter教学

摘要:Tkinter是Python内置GUI库,包含主窗口、框架、按钮等基础组件,支持pack、grid、place三种布局方式,通过事件绑定实现交互功能。开发流程包括:导入库、创建主窗口、添加组件、设置布局、绑定事件和启动主循环。示例展示了文本转大写工具的实现,强调实践对掌握Tkinter的重要性。

2501_93587862的博客 1413

tkinter的布局定位方法之一:pack详细讲解

pack参数说明   编写一个程序的界面,就是要把各个组件,以适当大小,定位到界面的某个位置。   tkinter以提供3种界面组件布局管理的方法,分别是:pack,grid,place 这篇文章先来讲解pack 方法。   pack() 方法的参数有:side, fill, padx/pady, ipadx/ipady, anchor, expand 参数说明: side: 决定组件停靠的方向。  选项:left, right, top, bottom  la1.pack( side...

hyf64的专栏 1万+

Python的GUI编程之 Pack、Place、Grid 的区别

****Python的GUI编程之 Pack、Place、Grid 的区别**** 简介: 本文讲述如何使用 tkinter 的布局管理 (被称作 layout managers 或 geometry managers). tkinter 有三种布局管理方式: · pack · grid · place 注意这三种布局...

weixin_39076347的博客 7137

TKinter之pack()

PythonGUI TKinter(一) 组件摆放-------->pack() 首先介绍最基本的框架,下面我们用三个简单的步骤来绘制一个最简单的窗口 1.导入tkinter库 2.创建主窗口对象 3.加入消息循环 # 1.导入tkinter库 import tkinter # 2.创建主窗口对象 root = tkinter.Tk() # 3.加入消息循环 root.mainlo...

Weary_PJ的博客 9587

T-Box功能详解及应用

T - BOX,其全称为 Telematics Box,作为远程 / 车载通信模块,是一款集车身网络与无线通讯功能于一体的智能终端设备。它充当了多媒体车机与 TSP(汽车远程服务提供商)以及互联网之间的无线路由器角色,为用户创造了远程访问的可能。用户借助T - BOX能够对车辆配备的各个 ECU(电子控制单元)进行远程操控,包括远程启动或停止发动机开启或关闭空调天窗后备箱门车门,以及实现闪灯鸣笛等功能。

wgl110110的博客 5640

Nginx/OpenResty目录穿越漏洞复现

Nginx/OpenResty目录穿越漏洞复现 漏洞背景: 2020年03月18日, 360CERT监测发现 openwall oss-security 邮件组披露了两枚漏洞。在特定配置下 nginx/openresty 存在 内存泄漏漏洞/目录穿越漏洞。 Nginx 是异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存。 OpenResty是一个基于nginx的Web平台,它对nginx增加LuaJIT引擎使其运行Lua脚本。 影响版本: nginx <= v1.17

小小猪的博客 1万+

Tkinter (python自带界面库)

python自带gui库

书山有路勤为径 1万+

1.2 从“跟网”到“构网”:技术范式的历史性转变

新型电力系统面临"双高"特征带来的稳定性挑战,促使并网控制技术从"跟网型"向"构网型"范式转变。传统跟网型变流器作为受控电流源依赖强电网,存在短路电流能力有限、易失稳等缺陷;而构网型变流器模拟同步发电机特性,作为受控电压源具备自主建立电压/频率、提供虚拟惯性、增强短路容量和改善系统阻尼四大核心能力。这一技术范式转变使变流器从电网跟随者变为构建支撑者,成为解决新能源大规模接入稳定性的关键。

技术工作者 723

tkinter 组合布局

通过这种方式,我们可以灵活地组合Tkinter的不同布局管理器,以满足复杂的界面设计需求。不过,需要注意的是,过度混合布局管理器可能导致界面难以维护和预测其最终布局效果,因此在实际应用中应谨慎设计。),以构建更复杂的界面布局。虽然Tkinter推荐在一个父容器中尽量避免混合使用不同的布局管理器,但在不同层次的容器中混用它们是完全可行的。在Tkinter中实现组合布局,意味着在一个容器中嵌套使用多种布局管理器(如。

zengliguang的专栏 876

从网格划分到结果解读:一次完整的子弹侵彻LS-DYNA仿真避坑指南

本文详细解析了子弹侵彻LS-DYNA仿真中的关键技术与避坑指南,涵盖网格优化、对称边界条件设置、沙漏控制参数调整及结果可信度验证。通过HyperMesh网格划分和LS-DYNA高级参数配置,帮助工程师提升仿真精度与效率,确保计算结果物理可信。

weixin_29816689的博客 406

【渗透工具】内网多级代理工具Venom详细使用教程

Venom是一款为渗透测试人员设计的使用Go开发的多级代理工具。Venom可将多个节点进行连接,然后以节点为跳板,构建多级代理。渗透测试人员可以使用Venom轻松地将网络流量代理到多层内网,并轻松地管理代理节点。

TT小子的博客 3757

python tkinter 布局_如何使用pack布局界面tkinter组件?

用Python写了一段时间的GUI程序,使用的是默认的tkinter模块,一直使用grid方法来做界面布局,后来遇到了问题,才发现原来pack方法才是最简单最好用的(个人理解)。本文介绍如何使用pack方法布局界面。每一个tkinter组件,都有pack方法(也都有grid和plack方法)。pack,就是打包的意思,将组件打包进界面。pack方法,就是按照代码的先后顺序,将组件一个个的从上到下(...

weixin_39726267的博客 877

rk3568 修改开机动画

bootanimation.zip是一个Android设备启动时播放的动画文件,它包含了一系列的图片和描述文件,用于描述动画的播放顺序和持续时间。

weixin_35723192的博客 2728

用Tkinter打造GUI开发工具(11)Tkinter小部件的pack布局

用Tkinter打造GUI开发工具(10)Tkinter小部件的pack布局 Tkinter 共有三种小部件的几何布局管理器,分别是:pack布局,grid布局,place布局。通过几何布局管理器控制窗体或容器中各个小部件的位置关系。首先介绍小部件的pack布局。 使用pack()方法的时候,默认先使用的放到上面,然后依次向下排,它会给我们的部件一个自认为合适的位置和大小,这是默认方式。pack(...

hepu8的博客 1569

基于STM32F103C8T6的智能蓝牙手环系统设计与实现

摘要:本文设计并实现了一款基于STM32F103C8T6单片机的智能蓝牙手环系统。该系统集成了ADXL345加速度计、DS18B20温度传感器、plusesennor心率模块和BT06蓝牙模块,实现了心率(±2bpm)、体温(±0.5℃)、步数(±3%)等健康数据的实时监测与显示。通过OLED屏提供人机交互界面,支持蓝牙APP远程控制,具备自动步数清零、异常提醒等功能。测试表明系统各项功能均达到设计要求,响应时间0.1-0.5秒,心率检测准确率98%,体温检测准确率99%,功耗50mA(工作)/10mA(待

3254968421的博客 205

零基础入门篇③ PyCharm使用指南(个性化设置、开发必备插件、常用快捷键)

Python从入门到精通👉零基础入门篇③

hacker707的博客 4375

python无师自通配套资源_Python Tkinter Pack布局管理器(超级详细,看了无师自通)...

GUI 编程就相当于小孩子搭积木,每个积木块应该放在哪里,每个积木块显示为多大,也就是对大小和位置都需要进行管理,而布局管理器正是负责管理各组件的大小和位置的。此外,当用户调整了窗口的大小之后,布局管理器还会自动调整窗口中各组件的大小和位置。如果使用 Pack 布局,那么当程序向容器中添加组件时,这些组件会依次向后排列,排列方向既可是水平的,也可是垂直的。下面程序简单示范了 Pack 布局的用法,...

weixin_39950010的博客 254

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深入解析Python tkinter pack布局:从原理到实战应用

在Python GUI开发中,布局管理器是构建用户界面的核心组件,它决定了控件在窗口中的排列方式和空间分配逻辑。pack布局作为tkinter三大布局管理器之一,其核心原理基于“剩余空间分配”算法,通过控件的打包顺序和方向参数自动计算位置。这种流式布局方式特别适合构建具有明确嵌套和分组关系的界面,能显著提升开发效率并增强代码可维护性。pack布局通过side、fill、expand等关键参数实现灵活的空间控制,其中expand参数与fill参数的配合使用是实现自适应界面的关键技术。在实际工程实践中,pack

weixin_30721077的博客 397

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

基于Tkinter的Python布局管理

 Layout management in Tkinter In this part of the Tkinter programming tutorial, we introduce layout managers. When we design the GUI of our application, we decide what widgets we will use and how...

leemboy的博客 728

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Python编程之Tkinter布局管理详细教程

本教程详细介绍了Python Tkinter的三种GUI布局管理器:pack、grid和place。pack布局适合简单垂直/水平排列;grid布局利用行列网格实现复杂表单设计;place布局提供精确定位能力。教程包含代码示例和综合案例(登录界面),对比了三种布局的优缺点,建议优先使用grid布局平衡灵活性与易用性。通过Frame容器组合不同布局方式,可以构建更复杂的GUI界面。

胡茬大叔的博客 671

An Introduction To Tkinter

An Introduction To Tkinter

wang880117的博客 274

Python之Tkinter布局管理

所有的Tkinter组件都包含专用的几何管理方法,这些方法是用来组织和管理整个父配件区中子配件的布局的。Tkinter提供了截然不同的三种几何管理类:pack、grid和place。   1. pack方式        pack几何管理采用块的方式组织配件,在快速生成界面设计中广泛采用,若干组件简单的布局,采用pack的代码量最少。pack几何管理程序根据组件创建生成的顺序将组件添加到

2575

Python Tkinter Grid (网格布局管理器) 简明解释+代码

Grid(网格)布局管理器会将控件放置到一个二维的表格里。主控件被分割成一系列的行和列,表格中的每个单元(cell)都可以放置一个控件。 什么时候使用Grid管理器 grid管理器是Tkinter里面最灵活的几何管理布局器。如果你不确定什么情况下从三种布局管理中选择,你至少要保证自己会使用grid。 当你设计对话框的时候,grid布局管理器是一个非常方便的工具。如果你之前使用pack进行...

biu________的博客 1874

Tkinter 布局管理器(二):grid

Tkinter布局管理器之grid grid 管理器可以说是 Tkinter 这三个布局管理器中最灵活多变的。如果你只希望学习使用一个布局管理器,那么 grid 绝对是首选。 当你在设计对话框的时候,使用 gird 尤其便捷。如果你此前一直在用 pack 构造窗口布局,那么学习完 grid 你会悔恨当初为啥不早学它。使用一个 grid 就可以简单的实现你用很多个框架和 pack 搭建起来的效果。 ...

crown的博客 369

python grid布局切换_Python Tkinter Grid布局管理器用法(附带实例分析)

很多时候 Tkinter 界面编程都会优先考虑使用 Pack 布局,但实际上 Tkinter 后来引入的 Grid 布局不仅简单易用,而且管理组件也非常方便。Grid 把组件空间分解成一个网格进行维护,即按照行、列的方式排列组件,组件位置由其所在的行号和列号决定,行号相同而列号不同的几个组件会被依次上下排列,列号相同而行号不同的几个组件会被依次左右排列。可见,在很多场景下 Grid 是最好用的布局...

weixin_39747383的博客 360
上一篇: 用代码来解释可迭代性,迭代器,生成器的区别
下一篇: 用Keras实现图片风格迁移的算法详解
快乐清风客
博客等级 码龄19年 191粉丝 12原创
评论 46
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值