快看:Python 内置界面开发框架 Tkinter入门篇 甲
本文大概 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入门篇 乙》将在本公众号稍后推送
标签: 编程算法
推荐文章
- 快看:Python 内置界面开发框架 Tkinter入门篇 甲
- 每日视讯:中国稀土集团:敖宏会见四川省自然资源投资集团党委书记徐志文
- 女工用牙给生鱼剥皮,公司回应:都是临时工干的!_每日热门
- 买部iPhone 14要花你多少年薪?各国对比:国人要12% 印度近50%|当前热闻
- 广东今年将完成林分优化和森林抚育提升400万亩 每日播报
- 安康学院地理学社
- 全球速递!2023年巴西里约狂欢节桑巴巡演开始
- 大智慧: 关于诉讼进展的公告
- 天天微动态丨八大券商论注册制改革:有利于普提A股公司质量 投行业务预计将迎高增长
- 阿尔特(300825)2月20日主力资金净买入904.25万元
- 2月20日网红直播板块涨幅达2%
- 全球最新:兰花养不好?可能你忽略的这四点,内容很短但都是干货!
- 我科学家提出钙钛矿电池新结构方案
- 资料:德甲联赛2022-2023赛季第21轮积分榜 前沿资讯
- 电动车一盔一带还是要查,最近又来了两项禁令,车主:直接卖了
- 安装坐便器的详细步骤及视频_安装坐便器的详细步骤及视频教学-每日热门
- 7个方法助你快速倒时差_如何快速倒时差 环球观速讯
- 为失业人员搭建起“就业桥梁”
- 如何将 PVC 管连接到黄铜管 当前简讯
- 手上真菌感染起小水泡痒怎么办_手上真菌感染怎么办_环球要闻
- 摄影《家乡的雪》|烟台中小学生“才艺秀”作品征集
- 每日观察!QQ彻底重做,十年来最大改变
- 懒人听书主播入驻_懒人听书主播怎么赚钱_世界微资讯
- 佳能sx20 is_关于佳能sx20 is的介绍
- 当前最新:防晒衣大一点好还是正常就好
- 假如生活欺骗了你普希金图片_假如生活欺骗了你普希金 焦点信息
- 品味遵义·荐书|《自由的夜行》
- 焦点观察:改过自新≠允许出镜 专家:绝不让涉毒艺人变相复出
- 汾酒将解禁220万激励股 股价是授予价的15倍!
- 性感的网名_这些女生网名最妖娆-每日时讯
- 苹果8价格表官网报价128g_苹果8官方报价128g
- 当前观点:周末游|寻香攻略!这几处赏梅胜地撑起了正定的颜值!
- 航拍“美丽河湖”丨常宁市洋泉水库:徜徉“天堂湖”之上 犹在画中游 世界热消息
- 天天热点评!文昌市寻找见义勇为游客
- 深化移风易俗工作|文汇街道:“理”出好乡风 焦点
- 北屯税务局:“便民春风”吹暖企业发展路
- 光大期货:2月17日金融日报
- 【机构调研记录】德邦基金调研金力永磁、贝斯特
- 如何使用离线浏览器保存/浏览网页_如何将网页保存下来以便离线查看
- 馆长带你看居延汉简敦煌遗书 这些"宝贝"有料又有趣|全球快讯
- 开新店招新人 生活服务类消费市场有序回暖
- 概伦电子: 监事会关于公司2023年限制性股票激励计划首次授予激励对象名单的公示情况说明及核查意见
- 9款圆脸女生适合的甜美长卷发发型_9款圆脸女生适合的甜美长卷发发型是什么
- 小米13系列和小米万兆路由器升级搭配wifi7
- 股权激励是好事还是坏事?|每日速看
- 12345678有几种写法-全球观速讯
- 全球视点!神州信息:公司成功搭建了国税总局新统计分析平台、维护运行混合架构(Hadoop+MPP)数据平台,为海南税务局搭建发票风险模型,全力支撑金税四期
- 环球快看点丨怎么把页眉上的横线去掉
- 四有老师指什么?_四有老师的标准是什么 天天观天下
- 雨果电影_关于雨果电影的介绍 报道
- 行车记录仪g_sensor是什么意思-全球热消息
- 视焦点讯!Tor浏览器重新设计 切换到新的Firefox Quantum引擎
- DNF:巴卡妮金团“倒了”!体验服更新,已加入强退惩罚设定
- 奇葩朵朵开 王者荣耀名字大全
- iphone8如何设置屏幕时间? 世界最新
- 歌手彭佳慧简历 彭佳慧个人资料
- 男子持枪抢劫后潜逃25年 重庆警方千里追踪抓其归案-全球观点
- 世界快播:beryl_说一说beryl的简介
- 中央政治局委员什么级别 请看回答|世界今亮点
- 世界要闻:移动不限量套餐副卡_移动不限量套餐
- 每天超20吨!您菜篮子里的西红柿来自这里 全球资讯
- 张柏芝带三个儿子韩国滑雪,Lucas颜值变化大,网友:咋像吴宗宪?
- 【天天新视野】2019白沙和天下香烟价格表和图片一览(5款)
- 农业银行传世之宝金条价格今天多少一克(2023年02月15日)
- 每日快报!空调5匹等于多少kw_空调1匹等于多少kw
- 【全球时快讯】不作死就不会死的搞笑名言
- 韦小宝的七个老婆叫什么名字陈小春版_韦小宝的七个老婆叫什么-今日关注
- 华为荣耀畅玩8a隐藏空间如何使用_荣耀畅玩8a怎么隐藏刘海 热门看点
- 伊索寓言故事《老人和驴》
- 思美人片头曲插曲片尾曲背景音乐MV 世界今热点
- 微资讯!翻山越岭游戏创意
- 环球观察:ActivePresenter 8.5软件下载及安装教程
- 初学者如何学习做生意
- excel第二页有抬头_excel第二页显示表头
- 苹果怎么备份手机里的软件_苹果怎么备份手机里的东西 聚焦
- pickup的意义
- 2023云南省环境保护产业协会招聘-世界最新
- 观察:河南将残疾儿童家庭纳入防返贫动态监测帮扶 坚守不发生致贫返贫底线
- 每日资讯:公司活动策划
- 因超过轮岗期限要求,易雪飞已不再履行广州农商行行长职务-每日资讯
- 宁波银行董秘回复:我司已关注到相关的信息,对于新技术新理念,我司始终保持的开放的态度
- 美国俄亥俄州列车脱轨事故持续发酵 有毒化学物质引担忧
- 特斯拉市值突破2000亿美元原因,特斯拉公司是做什么及最近发展-今日热闻
- 第0384期-每日背CET4单词
- 每日时讯!消防小常识
- 给父亲送什么花合适|当前速看
- 奉天府是今天的哪里
- 阿根廷国家介绍简介
- 天天热消息:液氨的用途
- 瑞信:联博控股(AB.US)上涨势头强劲 上调目标价至43.5美元
- 注意!众望布艺将于3月1日召开股东大会 天天消息
- 环球关注:世界杯后状态低迷,内马尔7场2球4助1红,足坛第三人只剩抱怨
- 特变电工入围甘肃定西“十四五”第二批陇西县100MW集中式光伏竞配项目 全球快讯
- 世界观速讯丨像笔画的读法
X 关闭
资讯
X 关闭