[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 模块

补充来源:


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 这个模块,你应该先导入它,

导入语句是:

1
2
3
4
5
6
7
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()

模块方法一览表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
(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 的类;

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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() 中,并且允许你做进一步的处理。
举个例子:

1
2
3
4
5
6
import easygui
try:
print('I Love FishC.com!')
int('FISHC') # 这里会产生异常
except:
easygui.exceptionbox() #产生错误进行处理

WeiyiGeek.异常捕获

WeiyiGeek.异常捕获

2. EasyGUI使用案例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/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:\Users\Administrator\Documents
# C:\Users\Administrator\Desktop\Study-Promgram\README.md
# C:\Users\Administrator\Desktop\Study-Promgram\test.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.msgbox

WeiyiGeek.执行完成

WeiyiGeek.执行完成