为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任务调度实例分析
May 19 Python
通过Python使用saltstack生成服务器资产清单
Mar 01 Python
Python实现简单http服务器
Apr 12 Python
python方法生成txt标签文件的实例代码
May 10 Python
Python实现的本地文件搜索功能示例【测试可用】
May 30 Python
Python日志模块logging基本用法分析
Aug 23 Python
Python 单元测试(unittest)的使用小结
Nov 14 Python
Python判断一个文件夹内哪些文件是图片的实例
Dec 07 Python
Python数据类型之Number数字操作实例详解
May 08 Python
django fernet fields字段加密实践详解
Aug 12 Python
python 下载文件的几种方法汇总
Jan 06 Python
Python用tkinter实现自定义记事本的方法详解
Mar 31 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
php 数组字符串搜索array_search技巧
2016/07/05 PHP
PHP编程 SSO详细介绍及简单实例
2017/01/13 PHP
iis6手工创建网站后无法运行php脚本的解决方法
2017/06/08 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
js之WEB开发调试利器:Firebug 下载
2007/01/13 Javascript
js修改table中Td的值(定义td的单击事件)
2013/01/10 Javascript
JavaScript中数组的22种方法必学(推荐)
2016/07/20 Javascript
jQuery实现表格文本框淡入更改值后淡出效果
2016/09/27 Javascript
Vue.js render方法使用详解
2017/04/05 Javascript
微信小程序 支付功能(前端)的实现
2017/05/24 Javascript
基于JavaScript实现微信抢红包功能
2017/07/20 Javascript
详解vue静态资源打包中的坑与解决方案
2018/02/05 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
2018/11/29 Javascript
JavaScript对象的特性与实践应用深入详解
2018/12/30 Javascript
通过实例学习React中事件节流防抖
2019/06/17 Javascript
Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)
2020/04/27 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
[00:58]2016年国际邀请赛勇士令状宣传片
2016/06/01 DOTA
[59:00]OG vs TNC 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
用Python的urllib库提交WEB表单
2009/02/24 Python
Python实现合并字典的方法
2015/07/07 Python
python 实现分页显示从es中获取的数据方法
2018/12/26 Python
python解析含有重复key的json方法
2019/01/22 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
2019/05/30 Python
python实现京东订单推送到测试环境,提供便利操作示例
2019/08/09 Python
PyTorch里面的torch.nn.Parameter()详解
2020/01/03 Python
html5视频自动横过来自适应页面且点击播放功能的实现
2020/06/03 HTML / CSS
世界上最大的售后摩托车零配件超市:J&P Cycles
2017/12/08 全球购物
Vinatis德国:法国领先的葡萄酒邮购公司
2020/09/07 全球购物
《中国的气候》教学反思
2014/02/23 职场文书
介绍信的格式
2015/01/30 职场文书
2015年食堂工作总结报告
2015/04/23 职场文书
2015年教师节主持词
2015/07/03 职场文书
结婚幸福感言
2015/08/01 职场文书
《作风建设永远在路上》心得体会
2016/01/21 职场文书
Python实现老照片修复之上色小技巧
2021/10/16 Python