为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高效编程技巧
Jan 07 Python
菜鸟使用python实现正则检测密码合法性
Jan 05 Python
Python面向对象编程中关于类和方法的学习笔记
Jun 30 Python
浅谈Python使用Bottle来提供一个简单的web服务
Dec 27 Python
python: line=f.readlines()消除line中\n的方法
Mar 19 Python
使用Django简单编写一个XSS平台的方法步骤
Mar 25 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
Jun 18 Python
python 整数越界问题详解
Jun 27 Python
Python简易版图书管理系统
Aug 12 Python
基于python实现学生信息管理系统
Nov 22 Python
解决python 读取 log日志的编码问题
Dec 24 Python
Python字符串查找基本操作代码案例
Oct 27 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 验证码制作(网树注释思想)
2009/07/20 PHP
发款php蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
php使用APC实现实时上传进度条功能
2015/10/26 PHP
配置Nginx+PHP的正确思路与过程
2016/05/10 PHP
PHP PDOStatement::bindColumn讲解
2019/01/30 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
2019/12/02 PHP
javascript 获取url参数和script标签中获取url参数函数代码
2010/01/22 Javascript
JavaScript将相对地址转换为绝对地址示例代码
2013/07/19 Javascript
通过js获取div的background-image属性
2013/10/15 Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
2017/11/17 Javascript
vue2.0 better-scroll 实现移动端滑动的示例代码
2018/01/25 Javascript
详解Vue.js v-for不支持IE9的解决方法
2018/12/29 Javascript
jquery实现异步文件上传ajaxfileupload.js
2020/10/23 jQuery
[58:09]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第三场 6.2
2018/06/03 DOTA
[49:21]TNC vs VG 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第三场 8.20.mp4
2019/08/22 DOTA
python处理按钮消息的实例详解
2017/07/11 Python
python 动态加载的实现方法
2017/12/22 Python
如何使用Python标准库进行性能测试
2019/06/25 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
2019/08/12 Python
Python + selenium + crontab实现每日定时自动打卡功能
2020/03/31 Python
Python3.7 读取音频根据文件名生成脚本的代码
2020/04/07 Python
Python如何实现定时器功能
2020/05/28 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
2020/06/02 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
2020/10/21 Python
基于HTML5的WebSocket的实例代码
2018/08/15 HTML / CSS
丹尼尔惠灵顿手表天猫官方旗舰店:Daniel Wellington
2017/08/25 全球购物
银行学习十八大感想
2014/01/11 职场文书
群众路线剖析材料怎么写
2014/10/09 职场文书
2014保险公司个人工作总结
2014/12/09 职场文书
英语教师个人工作总结
2015/02/09 职场文书
歌剧魅影观后感
2015/06/05 职场文书
《草船借箭》教学反思
2016/02/23 职场文书
对讲机的最大通讯距离是多少
2022/02/18 无线电
Python中三种花式打印的示例详解
2022/03/19 Python