Python 内置界面开发框架 Tkinter 入门篇
以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「englyf」https://mp.weixin.qq.com/s/8qaS8SDCcRIfAgQGTXPbJA
首先,今天先给大家拜个好年!新年快乐,恭喜发财!为了感谢大家对我的鼓励和支持,特地在公众号里搞了一波红包抽奖活动。如果需要参与沾沾手气的话,可以在 1 月 23 号 22:00 之前到公众号消息页面回复关键词【钱兔无量】,然后系统会自动回复抽奖活动的链接,点击进去看提示继续操作即可。
农历新的一年开始了,打工的烦心事儿可以稍停,但是学习不能停止!
关于 Tkinter
上期讲过,python 其实有三大流行 GUI 开发框架,包括 PyQt、wxPython 和 Tkinter。wxPython 也在上期文章介绍过,今天给大伙带来 Tkinter 的入门介绍!
Tkinter 是 python 标准库内嵌自带的界面开发框架,算得上是皇亲国戚了。如此火热的 python ,又怎能不了解一下它自带的界面开发框架呢?
Tkinter 有很多强大的地方,比如跨平台特性。同一套代码可以轻松运行在 Windows, macOS 和 Linux 系统环境下。它的可视化元素都是基于本地系统元素渲染而得,所以和原生开发相比看不出来有什么区别。
另外,Tkinter 和其它 GUI 框架相比非常轻量和简洁。这就带来了很明显的缺点,界面风格有些过时。如果你需要开发光鲜亮丽的应用,可以参考一下我的其它博文,其中可找到其它的解决方案,总有适合你的那一款!而轻量级的优点也是很突出的,如果华丽花哨的可视化于你是无关紧要的话,Tkinter 真的可以拿来即用,也没有繁杂的开发流程,方便专注于功能的快速实现。对于急用的工具型软件,有必要活捉一番 Tkinter。
关于往期相关的文章,有兴趣可前往关注我的微信公众号 「englyf」 查看,倍感荣幸能得到你的关注!
这将是一个系列文章,你可以了解到这些信息:
本文所有测试代码运行环境基于 win10 x64。
基本框架
好了,八戒为了见 Tkinter 一面,就像娶媳妇一样,匆忙揭开盖头,一睹为快。
新建文件 main.py,先写一个 hello world 吧!
可以看到,需要先导入库 tkinter,名字有点长,所以命名为 tk 方便下面的引用。
绝大部分的界面应用都需要一个顶层窗口,这里通过实例化类 Tk 获得。然后在这个顶层窗口的标题栏设置标题,调用方法 title(),传入 “hello world”。最后,为了响应用户的交互和输入,必须调用主窗口的 mainloop() 以启动事件环。
虽然 tkinter 是 python 标准库的自带 GUI 框架,但是在使用前也得先安装 tk 库。
安装完,使用 pip list 确认一下
写作时,当前安装的最新版本是 0.1.0。
上面的环境配置指令建议在预先准备好的虚拟环境下执行,至于怎么配置虚拟环境,可以看看我的另一篇文章《Python:灵活的开发环境》
然后在环境下,输入脚本启动指令
看看跑起来的界面程序什么样子
从上面代码来看,没有冗余的部分,的确是拿来即用。
基本控件
下面是一些基本又常用的控件
当然 tkinter 的基本控件还有不少没列出来,由于篇幅有限,本文着重于入门级别,如果你有需要查找更全面的信息可以继续关注本公众号的后续更新。所以接下来就从上面的表格中挑几个基本的控件来细讲,继续看。
Label 文本标签
做界面的时候,如果你需要显示一些静态的文本,比如在某些元素前面显示一个名称,那么就可以用到控件 Label。这里要注意,控件 Label 被设计用于向用户显示文本,而不是获取文本。
比如,要显示一行文本 display text with framework tkinter
实例化类 Label 的时候,演示了传入参数 master,text,fg,bg,width 和 height。
参数 master 用于指定被实例化的控件被放置在哪个父控件中,这里指定将实例化的控件 Label 放置在顶层窗口 window 中。
注意:如果 master 参数被忽略,那么被实例化的控件就默认被放置在顶层窗口中。
参数 text 传入的内容就是要显示的文本字符串。
参数 fg 和 bg 分别是 fontground 和 background 的缩写,分别表示字体颜色和背景颜色。可以输入有效的颜色名字,比如 "white","black","red","orange","yellow","green","blue","purple"等 ,或者输入 # 开头的 RGB 值,比如 "#34A2FE"。
参数 width 和参数 height 分别用于设置控件的宽高。
要注意的是,上面用到的参数 width 和参数 height 的单位不是像素而是文本单位,1 个单位 width 表示文本字符 0 的宽度,1 个单位 height 表示文本字符 0 的高度。所以,如果 width 和 height 数值相等,那么实际显示效果也不会是正方形。
像上面说的那样子,单纯创建完控件是无法显示出来的。为了显示控件,还需要调用几何图形管理器(geometry manager),如代码所示,这里使用的几何图形管理器是 pack。当然也可以选用其它的管理器,在下面的界面布局主题章节中会专门介绍,继续看。
看看显示效果
另外,tkinter 对提供的带有文本的部分控件,比如 Label 等,在实例化时,还有个非常有用的参数 textvariable。这个参数需要传入 tkinter 提供的特定字符串类型的变量。然后,在需要读取和修改控件文本时,可以直接操作传入参数 textvariable 的变量。举个栗子
通过 tkinter 提供的 StringVar() 生成特殊字符串类型的量赋给变量 var_lbl,然后传给控件实例化的参数 textvariable。在读取控件 Label 的文本时,可通过 var_lbl.get() 获取。如果需要修改控件的文本,可通过 var_lbl.set() 传入字符串即可。
执行的程序界面和上面的无异,但是命令终端会有输出
Button 按键
在界面中,为了触发某些动作,一般通过点击按键来启动。那么,tkinter 是怎么添加按键控件?
下面举个栗子,添加一个带有文本显示 Click me!
的按键。
参数 text 输入显示的文本字符串,参数 width 输入控件宽度,参数 height 输入控件高度,参数 bg 输入代表背景颜色的名字,参数 fg 输入代表字体颜色的名字。
要注意的是,上面用到的参数 width 和参数 height 的单位同样是文本单位。
控件 Button 同样支持参数 textvariable。
看看显示效果
然后,你可能有疑问,代码中为什么没看到触发动作的内容?莫慌!这个其实属于交互的范畴,在下面的交互章节有专门介绍,继续看。
Frame 矩形区域
一般界面中,为了显示丰富的功能,经常需要把各种各样的控件组合在一起,那么就需要有控件充当组合粘贴板功能,而控件 Frame 刚好可以担起这个责任。
控件 Frame 用于组合相关控件,或者在控件之间提供填充的矩形区域,所以 Frame 是控件容器,也属于布局的内容,这里提前说说看,方便后边引用控件 Frame 对其它控件的演示。下面举个栗子,在控件 Frame 上添加静态标签 Label 和按键 Button 各一个。
为了把控件 Label 和 Button 粘贴到控件容器 Frame 中,只需要把控件容器 Frame 的实例引用赋值给各个控件的实例化参数 master 即可。相当于为各个控件指定父控件,那么这里的控件 Label 和 Button 也被称之为子控件。
道理类似于:一个孩子只能有一个父亲,一个父亲却可以有多个孩子。
看看显示效果
可以看到,控件 Label 排在控件 Button 的上面,那么怎么反过来呢?
看看显示效果
Entry 单行输入框
界面中一般会有一些输入框,比如现在要介绍的单行文本输入框控件 Entry。如果输入的内容比较少,那么就适合使用这个控件 Entry。
下面举个栗子,添加一个单行文本输入框。
实例化单行输入框控件,参数 fg 表示字体颜色,参数 bg 表示背景色,参数 width 也是文本单元的宽度。与其关注输入控件的样色,不如关心一下怎么从输入控件读取内容。
获取全部内容,使用 get()。
清空控件的内容,使用 delete()。输入参数 first 和 last 设置删除的字符索引范围,从 first 开始到 last 结束,不包括 last。last 可以忽略,也可以填 tk.END,表示删除内容到最后位置。
插入内容,使用 insert()。输入参数 index 和 string 设置在索引 index 处,插入内容 string。
控件 Entry 同样支持参数 textvariable。
看看显示效果
Text 多行输入框
再来看看多行输入框控件 Text。如果输入的内容比较多,需要换行才能比较好地显示,那么就适合使用这个控件 Text。
下面举个栗子,添加一个多行文本输入框。
实例化多行输入框控件,输入的参数和控件 Entry 类似,这里略过了。重点说一下对这个控件的内容读写操作。
获取内容,使用 get()。如果没有输入参数,会引起程序执行异常。因为这个方法至少需要输入一个参数 index,用于表示获取的开始位置。还可以输入多一个参数 index,用于表示获取的结束位置,此参数可忽略,若忽略则表示获取内容到最后结束位置。
清空控件的内容,使用 delete()。
插入内容,使用 insert()。输入参数 index 和 chars 设置在索引 index 处,插入内容 chars。index 可以使用类似 <line>.<column>
的格式,比如
上面的代码,表示在第 1 行 2 列处,插入字符串 Hello
看看显示效果
Spinbox 范围输入框
在有些界面中,也时常会看到有些输入框,只能从指定范围内选取值,并且右侧有向上或向下的箭头按钮,点击向上或向下的箭头可按照步进值对输入框中的值加或减,但不能超过设定的范围值。
下面举个栗子,添加一个这样子的输入框,并且输入范围限定在[0, 100]之间,步进为 1。
实例化控件 Spinbox,参数 from_ 输入范围的最小值,参数 to 输入范围的最大值,参数 increment 设定步进值。
获取内容,使用 get(),返回值是输入框中的字符串。
删除输入框中的内容,使用 delete()。输入参数 first 和 last,分别指定开始字符的索引和结束字符的索引。如果忽略 last,那么默认 last = first+1。
插入内容,使用 insert()。输入参数 index 和 s,index 代表开始插入的索引,s 表示插入的字符串。
控件 Spinbox 同样支持参数 textvariable。
看看显示效果
由于篇幅受限,本系列教程还未完结,下一篇《Python 内置界面开发框架 Tkinter 入门篇 乙》将在本公众号稍后推送,如果你对此教程有兴趣或者想和我一起交流更多精彩内容,欢迎关注我的微信公众号 【englyf】,等着你哦!
版权声明: 本文为 InfoQ 作者【englyf】的原创文章。
原文链接:【http://xie.infoq.cn/article/adb464dfcdb7d75940561e1b0】。文章转载请联系作者。
评论