热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

用Python写了一段时间的GUI程序,使用的是默认的tkinter模块,一直使用grid方法来做界面布局,后来遇到了问题,

用Python写了一段时间的GUI程序,使用的是默认的tkinter模块,一直使用grid方法来做界面布局,后来遇到了问题,才发现原来pack方法才是最简单最好用的(个人理解)。本文介绍如何使用pack方法布局界面。

每一个tkinter组件,都有pack方法(也都有grid和plack方法)。pack,就是打包的意思,将组件打包进界面。pack方法,就是按照代码的先后顺序,将组件一个个的从上到下(默认)摆放在GUI界面中。

from tkinter import *

root = Tk()

for i in range(5):

Label(root, text=str(i), relief=GROOVE).pack(fill=BOTH, expand=True)

root.mainloop()

fill=BOTH表示按X和Y两个方向随控件延伸,expand=True表示控件随父组件的尺寸扩展而扩展。有这两个属性的定义,比较容易看到效果。pack更多属性,请在Python解释器中使用 help(tkinter.Label.pack) 查看。上面代码运行效果如下:

tkinter_pack.jpgpack方法默认按从上到下顺序排列组件

我们可以通过side属性值,来改变默认的从上到下排雷的方法,side的可选值有LEFT,RIGHT,BOTTOM,TOP(默认)。我们试一下side=RIGHT的效果,代码和效果如下:

from tkinter import *

root = Tk()

for i in range(5):

Label(root, text=str(i), relief=GROOVE).pack(side=RIGHT, fill=BOTH, expand=True)

root.mainloop()

tkinter_pack_side.jpgpack的side属性为RIGHT时的效果

以上就是使用pack,将组件一个个按右排列的效果。

在来一个比较复杂的,代码和效果如下:

from tkinter import *

root = Tk()

for i in range(5):

Label(root, text=str(i), relief=GROOVE).pack(fill=BOTH, expand=True)

for i in range(5):

Label(root, text=str(i), relief=GROOVE).pack(side=RIGHT, fill=BOTH, expand=True)

for i in range(5):

Label(root, text=str(i), relief=GROOVE).pack(side=BOTTOM, fill=BOTH, expand=True)

for i in range(5):

Label(root, text=str(i), relief=GROOVE).pack(side=LEFT,fill=BOTH, expand=True)

root.mainloop()

tkinter_pack_all.jpg复杂的pack效果

我提炼出pack方法下一个位置的概念:上面的代码,先试从上到下pack,因此下一个位置在总下面;第2个循环,采用side=RIGHT,于是就在下面的那个位置里从右开始排列;这样下一个位置就在最后一个4的右边;然后第3个循环,采用side=BOTTOM,从下往上排列,得到下一个位置在第3个4的上面;最后一个循环,采用side=LEFT,从左到右填满了中间那个狭小的空间!

pack方法简单的地方在于:

不用计算,使用grid和place都要计算位置,行列或者坐标,使用pack不用计算,只有上下左右的关系,一个个按设定顺序放上去。这个特点在有GUI分支的时候,特别方别,比如用一个变量控制GUI界面的生成,有的时候都几个组件,有的时候少几个,不用计算位置,pack轻松搞定。

配合Frame,使用pack,几乎任何样式的GUI界面都能轻松搞定。Frame是组件的容器,Frame之间也可以使用pack,Frame之内的组件依然可以使用pack。

最后,来一个超级复杂的用pack方法构建的GUI界面,使用了两层Frame,代码和效果如下:

from tkinter import *

def drawLabels(master=None):

for i in range(5):

Label(master, text=str(i), relief=GROOVE).pack(fill=BOTH, expand=True)

for i in range(5):

Label(master, text=str(i), relief=GROOVE).pack(side=RIGHT, fill=BOTH, expand=True)

for i in range(5):

Label(master, text=str(i), relief=GROOVE).pack(side=BOTTOM, fill=BOTH, expand=True)

for i in range(5):

Label(master, text=str(i), relief=GROOVE).pack(side=LEFT,fill=BOTH, expand=True)

root = Tk()

# frame row 0

frame_0 = Frame(root)

frame_0.pack()

# frame left

frame_left = Frame(frame_0)

frame_left.pack(side=LEFT)

drawLabels(frame_left)

# frame right

frame_right = Frame(frame_0)

frame_right.pack(side=LEFT)

drawLabels(frame_right)

# frame row 1

frame_1 = Frame(root)

frame_1.pack(fill=BOTH, expand=True)

drawLabels(frame_1)

root.mainloop()

tkinter_pack_complex.jpg用两层Frame配合pack构建的界面

这段代码frame_0中包含了frame_left和frame_right,而frame_1中就直接调用drawLabels函数了。注意frame_1的pack方法中使用的参数。

使用pack方面画tkinter的GUI界面,一般采用限制窗口大小的缩放,如果允许窗口大小的变化,可能导致各组件大小变得极其不协调,或者窗口内出现大片空白尴尬的区域。

-- EOF --



推荐阅读
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 解决python matplotlib画水平直线的问题
    本文介绍了在使用python的matplotlib库画水平直线时可能遇到的问题,并提供了解决方法。通过导入numpy和matplotlib.pyplot模块,设置绘图对象的宽度和高度,以及使用plot函数绘制水平直线,可以解决该问题。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
author-avatar
mobiledu2502885927
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有