本文大概 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. windows下 安装docker

    一.Docker 1.什么是docker 对比 特性 容器 虚拟机 启动 秒级 分钟级 磁盘使用 一般为MB 一般为GB 性能 接近原生 弱于 系统支持量 单机支持上千个容器 一般几十个 2. 使用d ...

  2. 3.JS

    1.简介 JavaScript 因为互联网而生,紧随着浏览器的出现而问世 1997年7月,ECMAScript 1.0发布. 1998年6月,ECMAScript 2.0版发布. 1999年12月,E ...

  3. spring运行报500 bean不存在

    spring运行报500 bean不存在 bean不存在 步骤: ​ 查看bean是否注入成功 ​ junit单元测试 ​ 问题,不一定在我们底层,是spring出现了问题 ​ SpringMVC整合 ...

  4. Crond服务+Shell实现秒级任务

    服务 [root@19-v1-centos-6 ~]# chkconfig --list | grep crond crond 0:off 1:off 2:on 3:on 4:on 5:on 6:of ...

  5. 超精准!AI 结合邮件内容与附件的意图理解与分类!⛵

    作者:韩信子@ShowMeAI 深度学习实战系列:https://www.showmeai.tech/tutorials/42 TensorFlow 实战系列:https://www.showmeai ...

  6. 数电第7周周结_by_yc

    一.通用双向移位寄存器: 功能描述:   4位的双向移位寄存器,含控制输入端(ctrl).串行输入端(Dsl.Dsr).4个并行输入端和4个并行输出端,要求实现5种功能:异步置零.同步置数.左移.右移 ...

  7. 【py模板】missingno画缺失直观图,matplotlib和sns画箱线图

    import missingno as msn import pandas as pd train = pd.read_csv('cupHaveHead1.csv') msn.matrix(train ...

  8. Django框架版本区别

    目录 一:django版本区别 1.django1.X路由层使用的是url方法 2.虽然path不支持正则 但是它的内部支持五种转换器 3.五种转换器 4.除了有默认的五个转换器之外 还支持自定义转换 ...

  9. VUE项目无法启动NODE版本与NODE-SASS、SASS-LOADER版本不兼容解决方案

    一.错误分析 在VUE项目开发中,我们经常会遇到报错: Node Sass version 7.0.1 is incompatible with ^4.0.0. 网上解决方案也千奇百怪,最终操作下来, ...

  10. js 中常用函数汇总(含示例)

    〇.前言 js 在日常开发中还是比较常用的,本文将常用的 js 方法简单汇总一下,希望对你我有一点帮助. 一.重复 / 延迟操作 1.设置固定时间间隔,重复执行(setInterval(funcRef ...