如何Tkinter模块编写Python图形界面
作者:州的先生 发布时间:2021-03-12 20:04:50
一、为何使用Tkinter而非PyQt
众所周知,在Python中创建图形界面程序有很多种的选择,其中PyQt和wxPython都是很热门的模块包,这些第三方的图形界面模块功能强大、配置丰富,界面美观,是很多人的选择。
州的先生也经常使用PyQt5来为Python程序写上图形界面,以方便程序的使用。
而今天,我们要介绍的是Python内置的一个图形界面模块——tkinter。
在网络上有很多抱怨Tkinter模块的言论,比如:界面丑、不灵活、扩展功能差、模块少……等等,诚然,Tkinter确实有这些毛病或者说是缺点,但是它也并非是一无是处。
Tkinter最大的优势,在于其是Python的内置模块;仅仅是这一点,就可以带来很多优点。由于是内置模块,所以不需要进行额外的安装,这也就避免了很多刚刚接触的小伙伴可以顺利地开始import,而非各种pip安装失败或者是到处找各种版本可行的安装包(PyQt5就有很多这样的情况)。
同时,因为其内置模块的属性,使得其在程序打包为EXE或其他可执行文件的时候,打包出来的程序文件不会特别的大,这样对程序的传播还是很有用处的。
想一想,简简单单地写了一个小工具,结果打包出来的文件有几十兆之大,很是尴尬的。
介绍了那么多,下面,我们开始正式学习使用Tkinter编写Python图形界面程序。
二、创建一个基本的Tkinter程序
导入Tkinter模块
Tkinter模块的导入很简单,直接使用命令:
import tkinter
即可。
同时一般约定俗成其模块名简写为tk,所以导入命令为:
import tkinter as tk
实例化一个Tk类
所有的图形界面都有一个最顶级的容器,在PyQt5中有MainWindow、Widget等,而在Tkinter中,最常见最基础的则是Tk()类,当然在程序比较大或者图形窗口比较多的时候,使用Frame或Toplevel等容器部件会更加方便,但是在这里我们才刚刚使用Tkinter,所以就用Tk()类作为图形界面的最顶级容器:
import tkinter as tk
root = tk.Tk() # 实例化一个Tk()主窗口
设置窗口标题
上一步实例化了一个Tk()类并赋值给root变量之后,我们就拥有了一个TK窗口,接下来我们通过它的title()方法为窗口设置标题:
import tkinter as tk
root = tk.Tk()
root.title("第一个Tkinter程序")
这样,我们就将窗口的标题设置为了“第一个Tkinter程序”。
运行图形界面窗口
在创建了一个基本的窗口之后,我们如何将这个图形界面窗口运行起来呢?在PyQt5中我们可以使用窗口的show()方法来启动窗口主循环,而在Tkinter中,我们则可以使用窗口的mainloop()方法启动窗口的主循环,使得图形界面窗口运行起来:
import tkinter as tk
root = tk.Tk()
root.title("第一个Tkinter程序")
root.mainloop()
这样,我们创建的图形界面窗口将在Python文件被运行是出现。其效果如下图所示:
创建一个按钮
在上面,我们创建了一个只有一个窗口的图形界面,现在我们往里面再添加一些小部件,比如按钮;在Tkinter中,按钮为tk.Button()类,通过实例化这个类,我们能创建一个按钮部件:
import tkinter as tk # 引入tkinter模块
root = tk.Tk() # 实例化一个TK()类
btn = tk.Button(root,text='点我吧') # 实例化一个按钮类,父元素为root
btn.pack(padx=200,pady=50) # 设置按钮的大小
root.title('第一个Tkinter程序') # 设置图形界面标题
root.mainloop()
在这里,我们实例化了一个父类为root的Button()类,并且设置了按钮的文本。然后通过它的pack()方法设置的按钮的长度和宽度。继续运行程序,我们将会得到如下图所示的图形界面程序:
为按钮绑定一个命令
上面创建的图形界面包含了一个窗口和一个按钮,但是按钮放着有什么用呢?我们可以将它绑定到一个函数来,来实现点击事件的反馈。这在PyQt5中是一个很重要的概念——信号槽。而在Tkinter中也有类似的概念,在接下来的文章中,我们会逐步涉及到。 我们首先创建一个简单的函数,用于在控制台中打印一个字符串:
def tell_you():
print("州的先生Tkinter教程")
然后通过按钮的config()方法,为按钮配置一个命令:
import tkinter as tk # 引入tkinter模块
def tell_you():
print("州的先生Tkinter教程")
root = tk.Tk() # 实例化一个TK()类
btn = tk.Button(root,text='点我吧') # 实例化一个按钮类,父元素为root
btn.config(command=tell_you)
btn.pack(padx=200,pady=50) # 设置按钮的大小
root.title('第一个Tkinter程序') # 设置图形界面标题
root.mainloop()
这样,当我们点击按钮的时候,程序就会调用tell_you()函数,在控制台打印出“州的先生Tkinter教程”字符串,其效果如下图所示:
三、模块化Tkinter程序
在上面的程序中,我们所有的变量都是全局变量,无论是根窗口还是按钮小部件。这在程序很小的时候,或许没有问题,但是当我们添加的部件越来越多的时候,就很不方便维护了。基于此,我们可以使用面向对象的方法来重新组织我们的图形界面程序。以类和对象的方式作为图形界面窗口的组织单元。
import tkinter as tk
class MainWindows(tk.Tk):
def __init__(self):
super().__init__() # 初始化基类
self.title("第一个程序")
self.ini_ui()
def ini_ui(self):
self.btn = tk.Button(self,text='点我吧')
self.btn.pack(padx=200,pady=30)
self.btn.config(command=self.tell_you)
def tell_you(self):
print("州的先生Tkinter教程")
if __name__ == '__main__':
app = MainWindows()
app.mainloop()
现在,每一个变量都只限于MainWindows()内;这样,我们就将第一个Tkinter图形界面程序改造成了面对对象式。运行代码,也会得到和之前一样的图形界面程序:
来源:https://zmister.com/archives/661.html


猜你喜欢
- 如何在Typescript中使用for...in ?本人在TS中用for...in出现了些问题,也想到了一些解决方法。那么先来看看下面报错的
- F.conv2d pytorch卷积计算Pytorch里一般小写的都是函数式的接口,相应的大写的是类式接口。函数式的更加low-level一
- 前言综合应用已经学习过的知识点:变量流程控制函数模块系统需求1.程序启动,显示名片管理系统欢迎界面,并显示功能菜单*************
- 前言:接口自动化是指模拟程序接口层面的自动化,由于接口不易变更,维护成本更小,所以深受各大公司的喜爱。接口自动化包含2个部分,功能性的接口自
- 前言本文介绍如何使用Python制作一个简单的猜数字游戏。游戏规则玩家将猜测一个数字。如果猜测是正确的,玩家赢。如果不正确,程序会提示玩家所
- 这里的Counter是指collections中的Counter,通过Counter可以实现字典的创建以及字典key出现频次的统计。然而,使
- 随着 Node.js v8 的发布,Node.js 已原生支持 async/await 函数,Web 框架 Koa 也随之发布了 Koa 2
- 在系统开发中,有一类任务不是立即执行,而是在未来某个时间点或者按照一定间隔去执行,比如日志定期压缩、报表制作、过期数据清理等,这就是定时任务
- Innodb数据库对于已经删除的数据只是标记为删除,并不真正释放所占用的磁盘空间,这就导致InnoDB数据库文件不断增长。如果在创建数据库的
- 1.创建mysql存储过程,这是个复杂查询加上了判断,比较复杂CREATE PROCEDURE searchAllList (IN trad
- 如下所示:只对当前文件有效的操作:菜单栏->View -> Active Editor -> Use Soft Wraps
- function siblings(o){//参数o就是想取谁的兄弟节点,就把那个元素传进去 var a=[];//定义一个数组,用来存o的
- 前言在用python处理表格数据中,这其中的工作重点就是对表格类型的数据进行梳理、计算和展示,本文重点介绍展示这个方面的工作。首先我们看一个
- 如下所示:import numpy as npimport codecs, json a = np.arange(10).reshape(2
- 本文实例讲述了python使用装饰器和线程限制函数执行时间的方法。分享给大家供大家参考。具体分析如下:很多时候函数内部包含了一些不可预知的事
- 高性能的SQL语句会在软件运行中起到非常重要的作用,下面小编把最近整理的SQL语句优化资料分享给大家。第一: 选择最有效率的表名顺
- 西贝做了许久的交互设计工作,每年的目标都有不同,却发现今年没有什么提高和改进的地方。也许是自己没有回头总结,总是被这样那样的借口推脱。最近休
- 引言周六来公司写点东西,刚好有个icon颜色不对,ui又不在公司,那么就只能自己动手丰衣足食了。呜呜呜,好想住公司,都不用上下班了。svg填
- 钟馗之眼是一个强大的搜索引擎,不同于百度谷歌,它主要收集网络中的主机,服务等信息,国内互联网安全厂商知道创宇开放了他们的海量数据库,对之前沉
- 本文实例讲述了php实现的CSS更新类及其用法,非常实用。分享给大家供大家参考。具体如下:CSSUpdate.class.php类文件如下: