您现在的位置: 首页 资讯 > > 正文
焦点热议:Python 内置界面开发框架 Tkinter入门篇 甲
发布时间:2023-02-21 13:09:10 来源:腾讯云
本文大概 4158 个字,阅读需花 10 分钟内容不多,但也花了一些精力如要交流,欢迎关注我然后评论区留言

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

关于 Tkinter

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

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


(资料图片仅供参考)

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

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

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

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

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

基本框架

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

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

import tkinter as tkwindow = 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.1setuptools 56.0.0tk         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 tkwindow = 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 tkwindow = 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.pydisplay text with tkinter framework

Button 按键

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

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

import tkinter as tkwindow = 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 tkwindow = 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 tkwindow = 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 tkwindow = 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 tkwindow = 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 可以使用类似 .的格式,比如

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

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

看看显示效果

Spinbox 范围输入框

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

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

import tkinter as tkwindow = 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入门篇 乙》将在本公众号稍后推送

标签: 编程算法

深圳“双创”综合指数连续6年排名第一 创业密度稳居全国第一

双创由众而积厚成势,因创而破茧成蝶。今年5月,在深圳发布的《大众创业、万众创新研究报告(2021)》显示...

一线工作近22年的缉毒警:我知道坏的是毒品不是人性

  “影子”般的缉毒警:一线工作22年,我知道坏的是毒品不是人性  如果我不继续干,别人也要干,缉...

广东肇庆“毒驾连撞5车致1死”肇事司机被批捕

  1月5日14时30分许,广东肇庆市端州区一男子赵某毒驾连撞5车,致一人死亡。  1月10日,澎湃新闻(ww...

江西最大文物倒卖案宣判:倒卖国家二级文物 9人获刑

  中新网南昌1月10日电 (冷峥嵘 张一怡)江西省共青城市人民法院10日发布消息称,近日,该院依法审结...

青海保障门源地震后生活必需品应急物资

  中新网西宁1月10日电 (记者 孙睿)记者10日从青海省商务厅获悉,青海海北州门源县6 9级地震灾害发...

广西东兴口岸恢复通关 入境需网上预约

  中新社防城港1月10日电 (翟李强)自2022年1月10日零时起,广西东兴口岸和边民互市贸易区恢复人员、...

呼和浩特:寒假期间有条件的学校要开展校内托管服务

  中新网呼和浩特1月10日电 (记者 张林虎)10日,记者从呼和浩特市教育局获悉,在暑假校内托管试点的...

“中国最后一个原始部落”翁丁老寨火灾原因公布

  “中国最后一个原始部落”翁丁老寨火灾原因公布:小孩玩火引起  中新网昆明1月10日电 (罗婕)近日...

北京市十五届人大五次会议胜利闭幕

  北京市十五届人大五次会议胜利闭幕   蔡奇陈吉宁李伟魏小东张延昆出席   张延昆齐静当选市人...

天津市委市政府致全市父老乡亲的慰问信:我们一定能够打赢

  中新网天津1月10日电 (记者 张道正)中共天津市委、天津市人民政府10日发布了“致全市父老乡亲的慰...

天津米面油存量由20天提高至30天 超市菜市场进货量翻倍

  天津米面油存量由20天提高至30天 蔬菜库存量、超市菜市场进货量翻倍  记者10日从天津市商务局获...

兰州名师话“美育”:“尚乐立人”分层培优 以“美”润教

  中新网兰州1月10日电 (记者 刘玉桃 高莹)“实际上音乐课作为一门非高考科目,一直以来没有受到足...

子夜直击,天津寒天战“疫”

  新华全媒+|子夜直击,天津寒天战“疫”  新华社天津1月10日电 题:子夜直击,天津寒天战“疫”...

重庆姐弟被生父扔下坠亡案上诉期结束 一审法院暂未收到两被告人上诉状

  重庆姐弟被生父扔下坠亡案上诉期结束,一审法院暂未收到两被告人上诉状  澎湃新闻记者 谢寅宗 ...

天津:划定封控区 全市开展全员核酸检测

  央视网消息:在各地的最新疫情中,奥密克戎变异株引发天津新增多例本土感染引人关注。截至1月9日下...

江歌母亲江秋莲:尊重法院判决,法律认定在我意料之中

  中新网青岛1月10日电 (记者 胡耀杰)山东省青岛市城阳区人民法院10日对原告江秋莲与被告刘暖曦生命...

中国边疆“北方第一所”:9名民警守护“生命禁区”

  中新网呼伦贝尔1月10日电 题:中国边疆“北方第一所”:9名民警守护“生命禁区”  作者 张玮 ...

辟谣!网传“封控区管控区相继解封”通知并非西安

  中新网1月10日电 据西安发布官方微博消息,1月9日,一则:“鉴于我市目前封控区、管控区相继解封,...

河南安阳9日12时至24时新增11例本土确诊病例

  1月9日12时至24时,河南安阳市新增本土确诊病例11例(汤阴县10例、文峰区1例)。  2020年1月22日至2...

老人5折环卫工8折生活困难免费 这家面馆背后有个暖心事

  老人5折,环卫工人8折,生活困难可以免费吃   这家面馆打折背后,有个暖心故事  见习记者 许...

铁路公安以110幅优秀书画作品庆祝人民警察节

  中新网北京1月10日电 (郭超凯 梁西征)1月10日是中国人民警察节。记者从公安部铁路公安局获悉,近...

本周中东部冷空气频繁 东北等地有降雪

  中国天气网讯 本周我国中东部地区冷空气活动频繁,其中,今天(1月10日)受冷暖空气共同影响,雨雪范...

河南新增本土确诊病例60例

  中新网1月10日电 据河南省卫健委网站消息,1月9日0—24时,全省新增本土确诊病例60例(郑州市24例,...

“打拐”民警眼里的百态人生:见证一份份不愿放弃的爱

  打拐者说   一位“打拐”民警眼里的百态人生  本报记者毛鑫、王瑞平   在公安系统里,“打拐...

迎腊八北京晴天上线 阵风6至7级体感冻人

  中国天气网讯 俗话说“腊七腊八冻掉下巴”,今天(1月10日)迎来腊八节,北京体感冻人,白天阵风六七...

多省份倡议春节“非必要不离开”,这地补贴1000元

伪造国家机关证件典型案例发布 有力打击制假贩假行为

15年照顾170多个新生儿 金牌月嫂“漂”到海外去看娃

江歌母亲江秋莲诉刘鑫案一审将于今日宣判

河南省安阳市两地划为高风险地区 一地划为中风险地区

员工迟到一次罚一千引争议 单位惩戒员工法律边界何在?

以体育人 秀出“青年范儿”

保安、厨师曾被竞业限制 企业滥用竞业限制让员工很苦恼

反诈老陈破圈:人民群众在哪 就把反诈宣传开展到哪

一所中职学校的育人实践

各地严惩恶意欠薪 保障农民工及时拿到工资

中学生成剧本杀行业潜在消费人群 多方助推行业“净化”

“这就是我最好的选择”

对餐饮浪费说“不”(百姓关注)

校园“直通车” 服务“零距离”

琉璃河遗址 两段铭文共证北京三千年建城史

千元修复个人征信报告?银行:“征信修复”都是骗局

琉璃河遗址 两段铭文共证北京三千年建城史

北京公交将开展无人驾驶道路测试

河南郑州调整五地为中风险区域 公路入郑需核酸检测阴性证明

“共享法庭”让金融消费者畅享“智慧司法”便利

《传奇2》网游著作权纠纷案峰回路转 最高法五份裁决四份改判一份发回重审

三代警察:从未放弃的28年

“胡叔叔”的寻亲工作室

天津津南本轮本土疫情第3—20例阳性感染者活动轨迹公布

“团圆”行动刑侦专家吕游 每一个案例都有单独的技术方案

河南“战疫”直面五重考验

开考古书店日均两三个顾客 流量时代她决心仍是只卖书

冬奥开幕在即 “双减”催热冰雪课堂

“不得以任何借口拒收患者”彰显生命至上

天津多站进京车票暂停发售

冷空气来袭广州气温骤降 广东多地发布寒冷预警

“电话发我”——“霸气回应”疫情求助背后的城市温度

天津津南区再增20例阳性感染者,详情公布

电影《农民院士》昆明首映 为观众呈现“把论文写在大地上”

南宁铁路警方春运期间将免费提供被拐儿童父母DNA检测服务

天津津南调整区域风险等级:1个高风险6个中风险!

天津全面加强离津管理 实施离津审批报备制度

口述|“郑州人张嘴做核酸采样的样子,熟练得让人心疼”

青海门源地震“震出”潜逃8年犯罪嫌疑人

天津出现感染奥密克戎本土病例 河南禹州全域为中高风险地区

河南郑州:10日在9个城区开展全员核酸检测

天津市津南区一地调整为高风险地区 多地调整为中风险地区

天津全面加强离津管理:广大市民群众非必要不离津

西安南小张村战“疫”记

河南通过“南水北调饮用水水源保护条例”

河南许昌累计报告143例确诊病例 呼吁16万在外务工者就地过年

重庆颁发中国统一公路养护资质管理后首批证照

“双向奔赴”!河南大学生志愿者为社区抗疫贡献力量

河南濮阳部分景点、剧院1月9日起暂停开放

x 广告
x 广告

Copyright ©  2015-2022 青年自然网版权所有  备案号:皖ICP备2022009963号-20   联系邮箱:39 60 291 42@qq.com