[TOC]
0x00 前言
Python下各种GUI简介、使用优缺点对比:
GUI编程 | 简介特点 | 优缺点 |
---|---|---|
PyQt | Python 对跨平台的 GUI 工具集 Qt 的包装实现了 440 个类以及 6000 个函数或者方法 ,PyQt 是作为 Python 的插件实现的。 | 比较流行的一个 Tkinter 的替代品,功能 非常强大,可以用Qt开发多美漂亮的界面,也就可以用PyQt开发多么漂亮的界面。 跨平台的支持很好,不过在商业授权上似乎存在一些问题。 |
Tkinter | 绑定了 Python 的 Tk GUI 工具集 ,就是Python 包装的Tcl代码,通过内嵌在 Python 解释器内部的 Tcl 解释器实现, Tkinter的调用转换成 Tcl 命令,然后交给 Tcl 解释器进行解释,实现 Python 的 GUI 界面。对比Tk和其它语言的绑定比如 PerlTk 是直接由 Tk 中的 C 库实现的。 | 历史最悠久Python 事实上的标准 GUI , Python 中使用 Tk GUI 工具集的标准接口,已经包括在标准的 Python Windows 安装中,著名的 IDLE 就是使用 Tkinter 实现 GUI 的创建的 GUI 简单,学起来和用起来也简单。 |
wxPython | Python 对跨平台的 GUI 工具集 wxWidgets ( C 编写)的包装,作为 Python 的一个 扩展模块实现。 | 比较流行的一个 Tkinter 的替代品,在各种平台下都表现挺好。 |
PyGTK | 一系列的 Python 对 GTK GUI 库的包装。 | 比较流行的一个 Tkinter 的替代品,许多 Gnome 下的著名应用程序的 GUI 都是使用 PyGTK 实现的,比如 BitTorrent , GIMP和 Gedit 都有可选的实现,在 Windows 平台 似乎表现不太好,这点也无可厚非,毕竟使用的是GTK 的 GUI 库。 |
PySide | 另一个 Python 对跨平台的 GUI 工具集 Qt 的包装,捆绑在 Python 当中,最初由 BoostC 库实现,后来迁移到 Shiboken。 | 比较流行的一个 Tkinter 的替代品和上面类似至于两者的区别 |
easygui | Python 中一个非常简单的 GUI 编程模块,不同于其他的 GUI 生成器,它不是事件驱动的 | 调用函数实现,并且使用简单;为用户提供了简单的 GUI 交互接口,不需要程序员知道任何有关 tkinter,框架,部件,回调或 lambda 的任何细节。 |
目录导航
(1) easygui 模块 (2) wxPython 模块
补充来源:
- PyQt 的介绍 : http://en.wikipedia.org/wiki/PyQt
- Tkinter 的介绍 : http://en.wikipedia.org/wiki/Tkinter
- wxPython 的介绍 : http://en.wikipedia.org/wiki/WxPython
- PyGTK 的介绍 : http://en.wikipedia.org/wiki/PyGTK
- PySide 的介绍 : http://en.wikipedia.org/wiki/PySide
0x01 Easygui 模块
1. EasyGUI介绍
1.1 什么是 EasyGUI? EasyGUI 是 Python 中一个非常简单的 GUI 编程模块,不同于其他的 GUI 生成器,它不是事件驱动的。 相反所有的 GUI 交互都是通过简地函数调用就可以实现,EasyGUI 为用户提供了简单的 GUI 交互接口,不需要程序员知道任何有关 tkinter,框架,部件,回调或 lambda 的任何细节。
EasyGUI 是运行在 Tkinter 上并拥有自身的事件循环,而 IDLE 也是 Tkinter 写的一个应用程序并也拥有自身的事件循环。因此当两者同时运行的时候,有可能会发生冲突,且带来不可预测的结果。因此如果你发现你的 EasyGUI 程序有这样的问题,请尝试在 IDLE 外去运行你的程序。
环境版本:Python 3.7.2,easygui-0.98.1-py3.7.egg 官网:https://github.com/robertlugg/easygui 使用pip进行安装:pip install easygui
1.2 导入EasyGUI模块以及方法介绍 为了使用 EasyGUI 这个模块,你应该先导入它,
导入语句是:
代码语言:javascript复制import easygui
from easygui import *
import easygui as g
#在命令行调用 EasyGUI 是这样的,且或者可以从 IDE(例如 IDLE, PythonWin, Wing, 等等)上调用:
Python3/Lib/site-packages/easygui-0.98.1-py3.7.egg/easygui/easygui.py
easygui.egdemo()
模块方法一览表:
代码语言:javascript复制(0) easygui.egdemo() #EasyGUI的演示程序
'''消息对话框'''
msgbox(msg='(Your message goes here)', title=' ', ok_button='OK', image=None, root=None) #消息框
enterbox(msg='Enter something.', title=' ', default='', strip=True, image=None, root=None) #输入框,返回值为用户输入的字符串;
integerbox(msg='', title=' ', default=None, lowerbound=0, upperbound=99, image=None, root=None) #数值输入框
#多个简单的输入框,用户输入的值比选项少的话,则返回列表中的值用空字符串填充用户为输入的选项多则截断,用户取消操作返回None
multenterbox(msg='Fill in values for the fields.', title=' ', fields=[], values=[], callback=None, run=True)
passwordbox(msg='Enter your password.', title=' ', default='', image=None, root=None) #密码输入框(以*号形式显示)
'''按钮对话框'''
#显示一个消息和提供一个 “OK” 按钮,你可以指定任意的消息和标题,重写OK按钮
#当选择 “cancel” 或关闭窗口的时候返回一个布尔类型的值0,否则为1
#注意:“C[o]ntinue” 中的 [o] 表示快捷键,也就是说当用户在键盘上敲一下 o 字符,就相当于点击了 “C[o]ntinue” 按键。
ccbox(msg='Shall I continue?', title=' ', choices=('C[o]ntinue', 'C[a]ncel'), image=None, default_choice='C[o]ntinue', cancel_choice='C[a]ncel')
#跟 ccbox() 一样,只不过这里默认的 choices 参数值不同而已,[<F1>] 表示将键盘上的 F1 功能按键作为 “Yes” 的快捷键使用。
ynbox(msg='Shall I continue?', title=' ', choices=('[<F1>]Yes', '[<F2>]No'), image=None, default_choice='[<F1>]Yes', cancel_choice='[<F2>]No')
#使用 buttonbox() 定义自己的一组按钮,buttonbox() 会显示一组由你自定义的按钮。
#当用户点击任意一个按钮的时候,buttonbox() 返回按钮的文本内容。如果用户点击取消或者关闭窗口,那么会返回默认选项(第一个选项)
buttonbox(msg='', title=' ', choices=('Button[1]', 'Button[2]', 'Button[3]'), image=None, images=None, default_choice=None, cancel_choice=None, callback=None, run=True)
#基本跟 buttonbox() 一样,区别就是当用户选择第一个按钮的时候返回序号 0, 选择第二个按钮的时候返回序号 1
indexbox(msg='Shall I continue?', title=' ', choices=('Yes', 'No'), image=None, default_choice='Yes', cancel_choice='No')
boolbox(msg='Shall I continue?', title=' ', choices=('[Y]es', '[N]o'), image=None, default_choice='Yes', cancel_choice='No') #如果第一个按钮被选中则返回 True,否则返回 False。
'''选择/多选框'''
#按钮组件方便提供用户一个简单的按钮选项,但如果有很多选项,或者选项的内容特别长的话,更好的策略是为它们提供一个可选择的列表
choicebox(msg='Pick an item', title='', choices=[], preselect=0, callback=None, run=True) #单选框
multchoicebox(msg='Pick an item', title='', choices=[], preselect=0, callback=None, run=True) #持用户选择 0 个,1 个或者同时选择多个选项
'''显示文本框'''
#注:text 参数设置可编辑文本区域的内容,可以是字符串、列表或者元祖类型。
textbox(msg='', title=' ', text='', codebox=False, callback=None, run=True)
codebox(msg='', title=' ', text='') #以等宽字体显示文本内容(不自动换行),相当于 textbox(codebox=True)
'''文件目录选择框'''
# 函数用于提供一个对话框,返回用户选择的目录名(带完整路径哦),如果用户选择 “Cancel” 则返回 None
diropenbox(msg=None, title=None, default=None)
fileopenbox(msg=None, title=None, default='*', filetypes=None, multiple=False)
filesavebox(msg=None, title=None, default='', filetypes=None) #函数提供一个对话框,让用于选择文件需要保存的路径(带完整路径哦)
#关于 default 参数的设置方法:
default 参数指定一个默认路径,通常包含一个或多个通配符。
如果设置了 default 参数,fileopenbox() 显示默认的文件路径和格式。
default 默认的参数是 '*',即匹配所有格式的文件。
#例如:
default="c:/fishc/*.py" 即显示 C:fishc 文件夹下所有的 Python 文件。
default="c:/fishc/test*.py" 即显示 C:fishc 文件夹下所有的名字以 test 开头的 Python 文件。
#关于 filetypes 参数的设置方法:
可以是包含文件掩码的字符串列表,例如:filetypes = ["*.txt"]
可以是字符串列表,列表的最后一项字符串是文件类型的描述,例如:filetypes = ["*.css", ["*.htm", "*.html", "HTML files"]]
1.3 EgStore 存储过程 GUI 编程中一个常见的场景就是要求用户设置一下参数,然后保存下来,以便下次用户使用你的程序的时候可以记住他的设置;为了实现对用户的设置进行存储和恢复这一过程,EasyGUI 提供了一个叫做 EgStore 的类;
案例:
代码语言:javascript复制from easygui import EgStore
# 定义一个叫做“Settings”的类,继承自EgStore类
#可以在 settings 对象中通过设定值去实例化变量,从而很简单地记住设置,之后使用 settings.store() 方法在硬盘上持久化保存。
class Settings(EgStore):
def __init__(self, filename): # 需要指定文件名
# 指定要记住的属性名称
self.author = ""
self.book = ""
# 必须执行下面两个语句
self.filename = filename
self.restore()
# 创建“Settings”的实例化对象“settings”
settingsFilename = "settings.txt"
settings = Settings(settingsFilename)
author = "WeiyiGEEK"
book = "零基础入门学习Pyhon"
# 将上面两个变量的值保存到“settings”对象中
settings.author = author
settings.book = book
settings.store()
print("n保存完毕n")
1.4 捕获异常 通过 exceptionbox() 函数提供了更好的方式去处理异常;使用 EasyGUI 编写 GUI 程序,有时候难免会产生异常,当然这取决于你如何运行你的应用程序,当你的应用程序崩溃的时候,堆栈追踪可能会被抛出,或者被写入到 stdout 标准输出函数中;
当异常出现的时候,exceptionbox() 会将堆栈追踪显示在一个 codebox() 中,并且允许你做进一步的处理。 举个例子:
代码语言:javascript复制import easygui
try:
print('I Love FishC.com!')
int('FISHC') # 这里会产生异常
except:
easygui.exceptionbox() #产生错误进行处理
WeiyiGeek.异常捕获
2. EasyGUI使用案例
代码语言:javascript复制#!/usr/bin/python3
#案例:easygui模块的使用
import easygui as g
nickname = input('请输入您的网名:')
love = input("请输入您的爱好:")
age = g.enterbox('请输入您的年龄:','信息输入')
res = g.msgbox('您的输入的个人信息是:' nickname ', 爱好:' love ', 年龄:' age,'个人信息','确认无误')
print("msgbox返回值:",res) #返回ok_button值 msgbox返回值: 确认无误
sex = g.buttonbox('选择您的性别:','信息录入',('男','女','none'),default_choice='none')
city = g.multchoicebox('城市选择','信息录入',['北京','上海','广州','深圳','重庆'])
#选择建立文件的目录
savedir = g.diropenbox(msg=None, title='', default=None)
test = g.fileopenbox(msg=None, title=None, default='*', filetypes=None, multiple=False)
savefile = g.filesavebox(msg=None, title='保存文件的目录', default='', filetypes=None)
# C:UsersAdministratorDocuments
# C:UsersAdministratorDesktopStudy-PromgramREADME.md
# C:UsersAdministratorDesktopStudy-Promgramtest.txt
with open(savefile,'w ',encoding='utf-8') as f:
f.write(nickname 'n' love 'n' age 'n' res 'n' sex 'n')
for x in city:
f.write(x 'n')
g.textbox(nickname 'n' love 'n' age 'n' res 'n' sex 'n','效率','value')
print("模块测试完成!")
WeiyiGeek.msgbox
WeiyiGeek.执行完成