为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实现获取操作系统版本信息方法
Apr 08 Python
深入讲解Java编程中类的生命周期
Feb 05 Python
Python中不同进制的语法及转换方法分析
Jul 27 Python
Python高级特性——详解多维数组切片(Slice)
Nov 26 Python
Python模块的定义,模块的导入,__name__用法实例分析
Jan 07 Python
django2.2 和 PyMySQL版本兼容问题
Feb 17 Python
最新2019Pycharm安装教程 亲测
Feb 28 Python
python中format函数如何使用
Jun 22 Python
Python 串口通信的实现
Sep 29 Python
Pycharm同步远程服务器调试的方法步骤
Nov 04 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
Jan 05 Python
Python first-order-model实现让照片动起来
Jun 25 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
ajax完美实现两个网页 分页功能的实例代码
2013/04/16 PHP
基于wordpress主题制作的具体实现步骤
2013/05/10 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
2020/02/07 PHP
Js+XML 操作
2006/09/20 Javascript
又一个小巧的图片预加载类
2007/05/05 Javascript
JavaScript和CSS通过expression实现Table居中显示
2013/06/28 Javascript
简单实用jquery版三级联动select示例
2013/07/04 Javascript
如何实现textarea里的不同文本显示不同颜色
2014/01/20 Javascript
jquery实现的省市区三级联动
2015/04/02 Javascript
javascript中eval和with用法实例总结
2015/11/30 Javascript
全面解析多种Bootstrap图片轮播效果
2016/05/27 Javascript
基于原生js淡入淡出函数封装(兼容IE)
2016/10/20 Javascript
JavaScript仿聊天室聊天记录
2016/12/27 Javascript
非常优秀的JS图片轮播插件Swiper的用法
2017/01/03 Javascript
基于VUE.JS的移动端框架Mint UI的使用
2017/10/11 Javascript
基于casperjs和resemble.js实现一个像素对比服务详解
2018/01/10 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
2018/03/22 Javascript
jQuery操作动画完整实例分析
2020/01/10 jQuery
JS数组push、unshift、pop、shift方法的实现与使用方法示例
2020/04/29 Javascript
Python使用Flask框架同时上传多个文件的方法
2015/03/21 Python
Django中的“惰性翻译”方法的相关使用
2015/07/27 Python
解决安装pycharm后不能执行python脚本的问题
2019/01/19 Python
如何在Django中添加没有微秒的 DateTimeField 属性详解
2019/01/30 Python
python  logging日志打印过程解析
2019/10/22 Python
opencv+python实现均值滤波
2020/02/19 Python
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
试述DBMS的主要功能
2016/11/13 面试题
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
珠宝店促销方案
2014/03/21 职场文书
《菜园里》教学反思
2014/04/17 职场文书
介绍信范文
2015/01/31 职场文书
岗位职责范本大全
2015/02/26 职场文书
2015年银行柜员工作总结报告
2015/04/01 职场文书
新郎父亲婚礼致辞
2015/07/27 职场文书
2019大学生实习报告
2019/06/21 职场文书