本文大概 4158 个字,阅读需花 10 分钟
内容不多,但也花了一些精力
如要交流,欢迎关注我然后评论区留言
谢谢你的点赞收藏分享

首先,今天先给大家拜个好年!新年快乐,恭喜发财!为了感谢大家对我的鼓励和支持,特地在公众号里搞了一波红包抽奖活动。如果需要参与沾沾手气的话,可以在1月23号22:00之前到公众号消息页面回复关键词【钱兔无量】,然后系统会自动回复抽奖活动的链接,点击进去看提示继续操作即可。

农历新的一年开始了,打工的烦心事儿可以稍停,但是学习不能停止!

关于 Tkinter

上期讲过,python 其实有三大流行 GUI 开发框架,包括 PyQt、wxPython 和 Tkinter。wxPython 也在上期文章介绍过,今天给大伙带来 Tkinter 的入门介绍!

Tkinter 是 python 标准库内嵌自带的界面开发框架,算得上是皇亲国戚了。如此火热的 python ,又怎能不了解一下它自带的界面开发框架呢?

Tkinter 有很多强大的地方,比如跨平台特性。同一套代码可以轻松运行在 Windows, macOS 和 Linux 系统环境下。它的可视化元素都是基于本地系统元素渲染而得,所以和原生开发相比看不出来有什么区别。

另外,Tkinter 和其它 GUI 框架相比非常轻量和简洁。这就带来了很明显的缺点,界面风格有些过时。如果你需要开发光鲜亮丽的应用,可以参考一下我的其它博文,其中可找到其它的解决方案,总有适合你的那一款!而轻量级的优点也是很突出的,如果华丽花哨的可视化于你是无关紧要的话,Tkinter 真的可以拿来即用,也没有繁杂的开发流程,方便专注于功能的快速实现。对于急用的工具型软件,有必要活捉一番 Tkinter。

关于往期相关的文章,有兴趣可前往关注我的微信公众号 「englyf」 查看,倍感荣幸能得到你的关注!

这将是一个系列文章,你可以了解到这些信息:

Tkinter 应用的基本框架是什么样子?
常用的基本控件有哪些?
除了基本控件,还有主题控件?
怎样布局界面?
如何与界面元素交互?
手把手写一个简单的记事本应用

本文所有测试代码运行环境基于 win10 x64。

基本框架

好了,八戒为了见 Tkinter 一面,就像娶媳妇一样,匆忙揭开盖头,一睹为快。

新建文件 main.py,先写一个 hello world 吧!

import tkinter as tk

window = tk.Tk()
window.title("hello world !")
window.mainloop()

可以看到,需要先导入库 tkinter,名字有点长,所以命名为 tk 方便下面的引用。

绝大部分的界面应用都需要一个顶层窗口,这里通过实例化类 Tk 获得。然后在这个顶层窗口的标题栏设置标题,调用方法 title(),传入 “hello world”。最后,为了响应用户的交互和输入,必须调用主窗口的 mainloop() 以启动事件环。

虽然 tkinter 是 python 标准库的自带 GUI 框架,但是在使用前也得先安装 tk 库。

pip install tk

安装完,使用 pip list 确认一下

Package    Version
---------- -------
pip 22.3.1
setuptools 56.0.0
tk 0.1.0

写作时,当前安装的最新版本是 0.1.0。

上面的环境配置指令建议在预先准备好的虚拟环境下执行,至于怎么配置虚拟环境,可以看看我的另一篇文章《Python:灵活的开发环境》

然后在环境下,输入脚本启动指令

python main.py

看看跑起来的界面程序什么样子

从上面代码来看,没有冗余的部分,的确是拿来即用。

基本控件

下面是一些基本又常用的控件

控件类 说明
Label 文本标签,显示静态文本
Button 按键,可点击的按键
Frame 矩形区域,组合相关控件
Entry 单行输入框,输入单行文本
Text 多行输入框,输入多行文本
Spinbox 范围输入框,选择指定范围内的值
Scale 刻度条,拖动按钮选取数值
Progressbar 进度条,显示进度
Listbox 列表,显示浏览和选择单行文本项的列表

当然 tkinter 的基本控件还有不少没列出来,由于篇幅有限,本文着重于入门级别,如果你有需要查找更全面的信息可以继续关注本公众号的后续更新。所以接下来就从上面的表格中挑几个基本的控件来细讲,继续看。

Label 文本标签

做界面的时候,如果你需要显示一些静态的文本,比如在某些元素前面显示一个名称,那么就可以用到控件 Label。这里要注意,控件 Label 被设计用于向用户显示文本,而不是获取文本。

比如,要显示一行文本 display text with framework tkinter

import tkinter as tk

window = tk.Tk()
lbl = tk.Label(
master=window,
text="display text with tkinter framework",
fg="white",
bg="black",
width=40,
height=10
)
lbl.pack()
window.mainloop()

实例化类 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 的变量。举个栗子

import tkinter as tk

window = tk.Tk()
var_lbl = tk.StringVar()
var_lbl.set("display text with tkinter framework")
lbl = tk.Label(
master=window,
fg="white",
bg="black",
width=40,
height=10,
textvariable=var_lbl
)
lbl.pack()
print(f"{var_lbl.get()}")
window.mainloop()

通过 tkinter 提供的 StringVar() 生成特殊字符串类型的量赋给变量 var_lbl,然后传给控件实例化的参数 textvariable。在读取控件 Label 的文本时,可通过 var_lbl.get() 获取。如果需要修改控件的文本,可通过 var_lbl.set() 传入字符串即可。

执行的程序界面和上面的无异,但是命令终端会有输出

(.venv) D:\englyf\python>python main.py
display text with tkinter framework

Button 按键

在界面中,为了触发某些动作,一般通过点击按键来启动。那么,tkinter 是怎么添加按键控件?

下面举个栗子,添加一个带有文本显示 Click me! 的按键。

import tkinter as tk

window = tk.Tk()
btn = tk.Button(
text="Click me!",
width=25,
height=5,
bg="blue",
fg="yellow"
)
btn.pack()
window.mainloop()

参数 text 输入显示的文本字符串,参数 width 输入控件宽度,参数 height 输入控件高度,参数 bg 输入代表背景颜色的名字,参数 fg 输入代表字体颜色的名字。

要注意的是,上面用到的参数 width 和参数 height 的单位同样是文本单位。

控件 Button 同样支持参数 textvariable。

看看显示效果

然后,你可能有疑问,代码中为什么没看到触发动作的内容?莫慌!这个其实属于交互的范畴,在下面的交互章节有专门介绍,继续看。

Frame 矩形区域

一般界面中,为了显示丰富的功能,经常需要把各种各样的控件组合在一起,那么就需要有控件充当组合粘贴板功能,而控件 Frame 刚好可以担起这个责任。

控件 Frame 用于组合相关控件,或者在控件之间提供填充的矩形区域,所以 Frame 是控件容器,也属于布局的内容,这里提前说说看,方便后边引用控件 Frame 对其它控件的演示。下面举个栗子,在控件 Frame 上添加静态标签 Label 和按键 Button 各一个。

import tkinter as tk

window = tk.Tk()
frame = tk.Frame()
label = tk.Label(
master=frame,
text="I'm a label in Frame"
)
label.pack()
button = tk.Button(
master=frame,
text="I'm a button in Frame"
)
button.pack()
frame.pack()
window.mainloop()

为了把控件 Label 和 Button 粘贴到控件容器 Frame 中,只需要把控件容器 Frame 的实例引用赋值给各个控件的实例化参数 master 即可。相当于为各个控件指定父控件,那么这里的控件 Label 和 Button 也被称之为子控件。

道理类似于:一个孩子只能有一个父亲,一个父亲却可以有多个孩子。

看看显示效果

可以看到,控件 Label 排在控件 Button 的上面,那么怎么反过来呢?

import tkinter as tk

window = tk.Tk()
frame = tk.Frame()
label = tk.Label(
master=frame,
text="I'm a label in Frame"
)
button = tk.Button(
master=frame,
text="I'm a button in Frame"
)
button.pack()
label.pack()
frame.pack()
window.mainloop()

看看显示效果

Entry 单行输入框

界面中一般会有一些输入框,比如现在要介绍的单行文本输入框控件 Entry。如果输入的内容比较少,那么就适合使用这个控件 Entry。

下面举个栗子,添加一个单行文本输入框。

import tkinter as tk

window = tk.Tk()
entry = tk.Entry(
fg="yellow",
bg="blue",
width=50
)
entry.pack()
window.mainloop()

实例化单行输入框控件,参数 fg 表示字体颜色,参数 bg 表示背景色,参数 width 也是文本单元的宽度。与其关注输入控件的样色,不如关心一下怎么从输入控件读取内容。

获取全部内容,使用 get()。

清空控件的内容,使用 delete()。输入参数 first 和 last 设置删除的字符索引范围,从 first 开始到 last 结束,不包括 last。last 可以忽略,也可以填 tk.END,表示删除内容到最后位置。

插入内容,使用 insert()。输入参数 index 和 string 设置在索引 index 处,插入内容 string。

控件 Entry 同样支持参数 textvariable。

看看显示效果

Text 多行输入框

再来看看多行输入框控件 Text。如果输入的内容比较多,需要换行才能比较好地显示,那么就适合使用这个控件 Text。

下面举个栗子,添加一个多行文本输入框。

import tkinter as tk

window = tk.Tk()
text = tk.Text(
fg="yellow",
bg="blue",
width=50
)
text.pack()
window.mainloop()

实例化多行输入框控件,输入的参数和控件 Entry 类似,这里略过了。重点说一下对这个控件的内容读写操作。

获取内容,使用 get()。如果没有输入参数,会引起程序执行异常。因为这个方法至少需要输入一个参数 index,用于表示获取的开始位置。还可以输入多一个参数 index,用于表示获取的结束位置,此参数可忽略,若忽略则表示获取内容到最后结束位置。

清空控件的内容,使用 delete()。

插入内容,使用 insert()。输入参数 index 和 chars 设置在索引 index 处,插入内容 chars。index 可以使用类似 <line>.<column> 的格式,比如

text.insert("1.2", "Hello")

上面的代码,表示在第1行2列处,插入字符串 Hello

看看显示效果

Spinbox 范围输入框

在有些界面中,也时常会看到有些输入框,只能从指定范围内选取值,并且右侧有向上或向下的箭头按钮,点击向上或向下的箭头可按照步进值对输入框中的值加或减,但不能超过设定的范围值。

下面举个栗子,添加一个这样子的输入框,并且输入范围限定在0, 100之间,步进为1。

import tkinter as tk

window = tk.Tk()
spinbox = tk.Spinbox(
master=window,
from_=0,
to=100,
increment=1
)
spinbox.pack()
window.mainloop()

实例化控件 Spinbox,参数 from_ 输入范围的最小值,参数 to 输入范围的最大值,参数 increment 设定步进值。

获取内容,使用 get(),返回值是输入框中的字符串。

删除输入框中的内容,使用 delete()。输入参数 first 和 last,分别指定开始字符的索引和结束字符的索引。如果忽略 last,那么默认 last = first+1。

插入内容,使用 insert()。输入参数 index 和 s,index 代表开始插入的索引,s 表示插入的字符串。

控件 Spinbox 同样支持参数 textvariable。

看看显示效果


由于篇幅受限,本系列教程还未完结,下一篇《Python 内置界面开发框架 Tkinter入门篇 乙》将在本公众号稍后推送,如果你对此教程有兴趣或者想和我一起交流更多精彩内容,欢迎关注我的微信公众号 【englyf】,等着你哦!

Python 内置界面开发框架 Tkinter入门篇的更多相关文章

  1. Python内置函数详解——总结篇

    2个多月来,将3.5版本中的68个内置函数,按顺序逐个进行了自认为详细的解析,现在是时候进行个总结了.为了方便记忆,将这些内置函数进行了如下分类:     数学运算(7个)     类型转换(24个) ...

  2. Python内置GUI模块Tkinter的几点笔记

    组件属性,用法 组件位置 更多

  3. Python内置函数详解-总结篇

    参考链接:http://www.cnblogs.com/sesshoumaru/p/6140987.html

  4. Python入门之 Python内置函数

    Python入门之 Python内置函数 函数就是以功能为导向,一个函数封装一个功能,那么Python将一些常用的功能(比如len)给我们封装成了一个一个的函数,供我们使用,他们不仅效率高(底层都是用 ...

  5. 浅谈Python内置对象类型——数字篇(附py2和py3的区别之一)

    Python是一门面向对象的编程设计语言,程序中每一样东西都可以视为一个对象.Python内置对象可以分为简单类型和容器类型,简单类型主要是数值型数据,而容器类型是可以包含其他对象类型的集体,如序列. ...

  6. Python基础篇【第2篇】: Python内置函数(一)

    Python内置函数 lambda lambda表达式相当于函数体为单个return语句的普通函数的匿名函数.请注意,lambda语法并没有使用return关键字.开发者可以在任何可以使用函数引用的位 ...

  7. Python之路(第八篇)Python内置函数、zip()、max()、min()

    一.python内置函数 abs() 求绝对值 例子 print(abs(-2)) all() 把序列中每一个元素做布尔运算,如果全部都是true,就返回true, 但是如果是空字符串.空列表也返回t ...

  8. python内置装饰器

    前言 接着上一篇笔记,我们来看看内置装饰器property.staticmethod.classmethod 一.property装饰器 1. 普通方式修改属性值 code class Celsius ...

  9. 几个可以提高工作效率的Python内置小工具

    在这篇文章里,我们将会介绍4个Python解释器自身提供的小工具.这些小工具在笔者的日常工作中经常用到,减少了各种时间的浪费,然而,却很容易被大家忽略.每当有新来的同事看到我这么使用时,都忍不住感叹, ...

  10. 使用Python内置浏览器缓存cookies并做更新

    import requests #python内置的微型浏览器,没有界面的 #作用:缓存cookies s = requests.session() print(s.headers) #伪造请求头部, ...

随机推荐

  1. 归纳学习(Inductive Learning),直推学习(Transductive Learning),困难负样本(Hard Negative)

    归纳学习(Inductive Learning): 顾名思义,就是从已有训练数据中归纳出模式来,应用于新的测试数据和任务.我们常用的机器学习模式就是归纳学习. 直推学习(Transductive Le ...

  2. FTP文本传输协议

    一.存储类型 存储类型分为三种: 直连式存储:Direct-Attached Storage,简称DAS 网络附加存储:Network-Attached Storage,简称NAS(存储和管理空间都在 ...

  3. Silky微服务框架之模块

    模块的定义 Silky是一个包括多个nuget包构成的模块化的框架,每个模块将程序划分为一个个小的结构,在这个结构中有着自己的逻辑代码和自己的作用域,不会影响到其他的结构. 模块类 一般地,一个模块的 ...

  4. iptables规则查询

    iptables规则查询 之前在iptables的概念中已经提到过,在实际操作iptables的过程中,是以"表"作为操作入口的,如果你经常操作关系型数据库,那么当你听到" ...

  5. k8s机器群扩容问题

    今天遇到了一个很奇葩的问题.公司新人吧k8s集权扩容完后,发现服务器上的磁盘没有做分区2T磁盘没有做任何动作 把两台slave节点扩容上去的节点弄到了/目录.由于是生产环境情况比较特殊并没通过kube ...

  6. 微信支付v3接口的 官方 Java SDK

    啰嗦几句:微信支付v3版接口麻烦吗?在对接微信支付v3接口时,本来是一件很简单的事情,其实微信支付v3接口并不是很复杂,但是微信团队的管理很混乱,给我们开发者带来了巨大的麻烦. 微信支付v3版接口对接 ...

  7. 记一次HTTPClient模拟登录获取Cookie的开发历程

    记一次HTTPClient模拟登录获取Cookie的开发历程 环境: ​ springboot : 2.7 ​ jdk: 1.8 ​ httpClient : 4.5.13 设计方案 ​ 通过新建一个 ...

  8. Python冷知识:如何找出新版本增加或删除了哪些标准库?

    "内置电池"是 Python 最为显著的特性之一,它提供了 200 多个开箱即用的标准库.但是,历经了 30 多年的发展,很多标准库已经成为了不得不舍弃的历史包袱,因为它们正在&q ...

  9. python面试题常用语句

    一.比较与交换1.比较并输出大的 print(a if a>b else b) 2.交换两个元素 a,b = b,alist1[i],list[j]=list1[j],list[i] 二.排序 ...

  10. 篇(16)-Asp.Net Core入门实战-权限管理之用户创建与关联角色(ViewModel再用与模型验证二)

    入门实战-权限管理之用户创建与关联角色(ViewModel再用与模型验证二) (1).在用户管理着模块中,相比较菜单功能的代码还是比较多的,设计到用户的创建,修改,角色变更和密码重置,同时都集中在列表 ...