为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中的yield浅析
Jun 16 Python
python检测某个变量是否有定义的方法
May 20 Python
python3之微信文章爬虫实例讲解
Jul 12 Python
python实现周期方波信号频谱图
Jul 21 Python
Python查找最长不包含重复字符的子字符串算法示例
Feb 13 Python
利用python-docx模块写批量生日邀请函
Aug 26 Python
python生成requirements.txt的两种方法
Sep 18 Python
Python csv文件的读写操作实例详解
Nov 19 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
Jan 14 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
May 11 Python
Python为何不支持switch语句原理详解
Oct 21 Python
Anaconda的安装与虚拟环境建立
Nov 18 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
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
2012/07/23 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
2013/11/12 PHP
php使用strtotime和date函数判断日期是否有效代码分享
2013/12/25 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十一)
2014/06/25 PHP
PHP中Header使用的HTTP协议及常用方法小结
2014/11/04 PHP
PHP图片处理之图片旋转和图片翻转实例
2014/11/19 PHP
thinkPHP实现将excel导入到数据库中的方法
2016/04/22 PHP
jquery ui dialog ie8出现滚动条的解决方法
2010/12/06 Javascript
JavaScript 模拟类机制及私有变量的方法及思路
2013/07/10 Javascript
JavaScript DOM节点添加示例
2014/07/16 Javascript
JavaScript中的对象序列化介绍
2014/12/30 Javascript
BootStrap响应式导航条实例介绍
2016/05/06 Javascript
微信小程序的动画效果详解
2017/01/18 Javascript
详解AngularJS controller调用factory
2017/05/19 Javascript
Node.js dgram模块实现UDP通信示例代码
2017/09/26 Javascript
jQuery实现的点击图片居中放大缩小功能示例
2019/01/16 jQuery
[01:04:01]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第一场
2014/05/24 DOTA
[03:37]2015国际邀请赛第四日现场精彩集锦
2015/08/08 DOTA
Python Web开发模板引擎优缺点总结
2014/05/06 Python
python处理文本文件并生成指定格式的文件
2014/07/31 Python
实例解析Python的Twisted框架中Deferred对象的用法
2016/05/25 Python
基于Python的接口测试框架实例
2016/11/04 Python
详解Pytorch 使用Pytorch拟合多项式(多项式回归)
2018/05/24 Python
通过python顺序修改文件名字的方法
2018/07/11 Python
Django添加favicon.ico图标的示例代码
2018/08/07 Python
对pyqt5多线程正确的开启姿势详解
2019/06/14 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
2020/02/16 Python
Python生成pdf目录书签的实例方法
2020/10/29 Python
英国最出名高街品牌:Forever Unique
2018/02/24 全球购物
学校司机岗位职责
2013/11/14 职场文书
期末学生评语大全
2014/04/24 职场文书
合作意向书
2014/07/30 职场文书
大学生村官工作心得体会
2016/01/23 职场文书
《浅水洼里的小鱼》教学反思
2016/02/16 职场文书
Nginx 502 Bad Gateway错误原因及解决方案
2021/03/31 Servers
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python