为Python程序添加图形化界面的教程


Posted in Python onApril 29, 2015

Python支持多种图形界面的第三方库,包括:

  •     Tk
  •     wxWidgets
  •     Qt
  •     GTK

等等。

但是Python自带的库是支持Tk的Tkinter,使用Tkinter,无需安装任何包,就可以直接使用。本章简单介绍如何使用Tkinter进行GUI编程。
Tkinter

我们来梳理一下概念:

  • 我们编写的Python代码会调用内置的Tkinter,Tkinter封装了访问Tk的接口;
  • Tk是一个图形库,支持多个操作系统,使用Tcl语言开发;
  • Tk会调用操作系统提供的本地GUI接口,完成最终的GUI。

所以,我们的代码只需要调用Tkinter提供的接口就可以了。
第一个GUI程序

使用Tkinter十分简单,我们来编写一个GUI版本的“Hello, world!”。

第一步是导入Tkinter包的所有内容:

from Tkinter import *

第二步是从Frame派生一个Application类,这是所有Widget的父容器:

class Application(Frame):
  def __init__(self, master=None):
    Frame.__init__(self, master)
    self.pack()
    self.createWidgets()

  def createWidgets(self):
    self.helloLabel = Label(self, text='Hello, world!')
    self.helloLabel.pack()
    self.quitButton = Button(self, text='Quit', command=self.quit)
    self.quitButton.pack()

在GUI中,每个Button、Label、输入框等,都是一个Widget。Frame则是可以容纳其他Widget的Widget,所有的Widget组合起来就是一棵树。

pack()方法把Widget加入到父容器中,并实现布局。pack()是最简单的布局,grid()可以实现更复杂的布局。

在createWidgets()方法中,我们创建一个Label和一个Button,当Button被点击时,触发self.quit()使程序退出。

第三步,实例化Application,并启动消息循环:

app = Application()
# 设置窗口标题:
app.master.title('Hello World')
# 主消息循环:
app.mainloop()

GUI程序的主线程负责监听来自操作系统的消息,并依次处理每一条消息。因此,如果消息处理非常耗时,就需要在新线程中处理。

运行这个GUI程序,可以看到下面的窗口:

为Python程序添加图形化界面的教程

点击“Quit”按钮或者窗口的“x”结束程序。
输入文本

我们再对这个GUI程序改进一下,加入一个文本框,让用户可以输入文本,然后点按钮后,弹出消息对话框。

from Tkinter import *
import tkMessageBox

class Application(Frame):
  def __init__(self, master=None):
    Frame.__init__(self, master)
    self.pack()
    self.createWidgets()

  def createWidgets(self):
    self.nameInput = Entry(self)
    self.nameInput.pack()
    self.alertButton = Button(self, text='Hello', command=self.hello)
    self.alertButton.pack()

  def hello(self):
    name = self.nameInput.get() or 'world'
    tkMessageBox.showinfo('Message', 'Hello, %s' % name)

当用户点击按钮时,触发hello(),通过self.nameInput.get()获得用户输入的文本后,使用tkMessageBox.showinfo()可以弹出消息对话框。

程序运行结果如下:

为Python程序添加图形化界面的教程

小结

Python内置的Tkinter可以满足基本的GUI程序的要求,如果是非常复杂的GUI程序,建议用操作系统原生支持的语言和库来编写。

源码参考:https://github.com/michaelliao/learn-python/tree/master/gui

Python 相关文章推荐
python实现猜数字游戏(无重复数字)示例分享
Mar 29 Python
python中split方法用法分析
Apr 17 Python
Python正则替换字符串函数re.sub用法示例
Jan 19 Python
python读取和保存视频文件
Apr 16 Python
django的登录注册系统的示例代码
May 14 Python
python3读取csv和xlsx文件的实例
Jun 22 Python
基于Python List的赋值方法
Jun 23 Python
Python异步操作MySQL示例【使用aiomysql】
May 16 Python
分析运行中的 Python 进程详细解析
Jun 22 Python
Django实现简单网页弹出警告代码
Nov 15 Python
Python中Pyspider爬虫框架的基本使用详解
Jan 27 Python
如何在Python中妥善使用进度条详解
Apr 05 Python
python执行get提交的方法
Apr 29 #Python
在Python中使用PIL模块处理图像的教程
Apr 29 #Python
python获得linux下所有挂载点(mount points)的方法
Apr 29 #Python
python创建和删除目录的方法
Apr 29 #Python
python访问系统环境变量的方法
Apr 29 #Python
python中迭代器(iterator)用法实例分析
Apr 29 #Python
在Python中使用HTMLParser解析HTML的教程
Apr 29 #Python
You might like
DOTA2 无惧惊涛骇浪 昆卡大型水友攻略
2020/04/20 DOTA
解析PHP中empty is_null和isset的测试
2013/06/29 PHP
php获取目标函数执行时间示例
2014/03/04 PHP
jQuery实现动画效果的实例代码
2013/05/07 Javascript
javascript中call和apply方法浅谈
2013/09/27 Javascript
jQuery点击自身以外地方关闭弹出层的简单实例
2013/12/24 Javascript
禁止按回车键提交表单的方法
2015/06/11 Javascript
Reactjs实现通用分页组件的实例代码
2017/01/19 Javascript
详解vue2.0 不同屏幕适配及px与rem转换问题
2018/02/23 Javascript
基于Vue实现拖拽功能
2020/07/29 Javascript
JavaScript中变量、指针和引用功能与操作示例
2018/08/04 Javascript
Vue cli3 库模式搭建组件库并发布到 npm的流程
2018/10/12 Javascript
详解js访问对象的属性和方法
2018/10/25 Javascript
在Layui中操作数据表格,给指定单元格添加事件示例
2019/10/26 Javascript
vue 动态表单开发方法案例详解
2019/12/02 Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
2020/03/09 Javascript
[01:15:15]VG VS EG Supermajor小组赛B组胜者组第一轮 BO3第二场 6.2
2018/06/03 DOTA
[01:11:35]Liquid vs LGD 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[00:20]TI9观赛名额抽取Ⅱ
2019/07/24 DOTA
python的迭代器与生成器实例详解
2014/07/16 Python
Python实现自动为照片添加日期并分类的方法
2017/09/30 Python
python logging日志模块的详解
2017/10/29 Python
Django 模型类(models.py)的定义详解
2019/07/19 Python
python实现网站微信登录的示例代码
2019/09/18 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
Python爬虫之Selenium实现键盘事件
2020/12/04 Python
使用HTML5 Canvas绘制圆角矩形及相关的一些应用举例
2016/03/22 HTML / CSS
Tarte Cosmetics官网:美国最受欢迎的化妆品公司之一
2017/08/24 全球购物
请解释接口的显式实现有什么意义
2012/05/26 面试题
初中毕业生的自我评价
2014/03/03 职场文书
优秀的2014年两会精神解读
2014/03/17 职场文书
毕业生学校推荐信范文
2014/05/21 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
公务员个人总结
2015/02/12 职场文书
学校运动会简讯
2015/07/20 职场文书
修改MySQL的数据库引擎为INNODB的方法
2021/05/26 MySQL