热门标签 | 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 --



推荐阅读
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文介绍了如何通过扩展 UnityGUI 创建自定义和复合控件,以满足特定的用户界面需求。内容涵盖简单和静态复合控件的实现,并展示了如何创建复杂的 RGB 滑块。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 本文介绍了如何使用 Python 的 Bokeh 库在图表上绘制菱形标记。Bokeh 是一个强大的交互式数据可视化工具,支持丰富的图形自定义选项。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 本文介绍了如何使用 Python 的 Matplotlib 和 Pandas 库进行数据可视化。通过示例代码展示了折线图、柱状图和水平柱状图的创建方法,并解释了图表参数设置的具体细节。 ... [详细]
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社区 版权所有