0、安装EasyGui
官网:http://easygui.sourceforge.net
使用标准方法安装
1、使用命令窗口切换到easygui-docs-0.96的目录下
2、【Windows下】执行python setup.py install (Python已配置环境变量)
3、【Linux或Mac下】sudo /Library/Framwork/Python.framework/Versions/3.3/bin/python3.3 setup.py install
1、建议不要再IDLE上运行EasyGui
EasyGui是运行在Tkinter上并拥有自身的事件循环,而IDLE也是Tkinter写的一个应用程序并也拥有自身的事件循环。因此当两者同时运行的时候,有可能发生冲突,且带来不可预测的结果。因此如果你发现你的EasyGui程序有这样的问题,请尝试在IDLE外去运行你的程序。
2、一个简单的例子
在EasyGui中,所有的GUI互动均是通过简单的函数调用,下面一个简单的例子告诉你EasyGui确实很easy。
from easygui import *
import sys
while 1:
msgbox("Hello World!")
msg = 'What is your favorite flavor?'
title = 'Ice Cream Survey'
choices = ['Vanilla','Chocolate','Strawberry','Rocky Road']
choice = choicebox(msg,title,choices)
# note that we convert choice to string,in case
# the user cancelled the choice,and we got None
msgbox('You chose:'+str(choice),'Survey Result')
msg = 'Do you want to continue?'
title = 'Please Confirm'
if ccbox(msg,title): # show a Continue/Cancel dialog
pass # user chose Continue
else:
sys.exit(0) # user chose Cancel
3、EasyGui的各种功能演示
要运行EasyGui的演示程序,在命令行调用EasyGui是这样的:
python easygui.py或者你可以再IDE(例如IDLE,PythonWin,Wing,等等)上来调用:
>>> import easygui as g
>>> g.egdemo()
成功调用后你将可以尝试EasyGui拥有的各种功能,并将你选择的结果打印至控制台。
4、导入EasyGui
1、为了使用EasyGui这个模块,你应该先导入它。最简单的导入语句:
>>> import easygui
如果你使用这种形式导入的话,那么你使用EasyGui的函数的时候,必须在函数的前面加上前缀easygui,像这样:
>>> easygui.msgbox('hello')
2、另一种选择是导入整个EasyGui包:
>>> from easygui import *这使得我们更容易调用EasyGui的函数,你可以直接这样编写代码:
>>> msgbox('hello')
3、第三种方案是使用类似下边的import语句(推荐):
>>> import easygui as g这样可以让你保持EasyGui的命名空间,同时减少你的打字数量。导入之后你就可以这样调用EasyGui的函数:
>>> g.msgbox('hello')
5、使用EasyGui
一旦你的模块导入EasyGui,GUI操作就是一个简单的调用EasyGui函数的几个参数的问题了。
例如,使用EasyGui来实现著名的"Hello World!",程序是这样写的:
import easygui as g
g.msgbox('Hello World!')
6、EasyGui函数的默认参数
对于所有函数而言,前两个参数是消息和标题。按照这个规律,在某种情况下,这可能不是最有利于用户的安排(例如,对话框在获取目录
和文件名的时候 忽略消息参数),但我觉得保持这种一致性贯穿于所有的窗口部件是一种更为重要的考虑!
绝大部分的EasyGui函数都有默认参数,几乎所有的组件都会显示一个消息和标题。标题默认是空字符串,信息通常有一个简单的默认值。
这使得你可以尽量少的去设置参数,比如msgbox()函数标题部分的参数就是可选的,所以你调用msgbox()的时候可以只指定一个消息参数,例如:
>>> import easygui as g
>>> g.msgbox('你的名字')
>>> g.msgbox('你的名字','三叶')
在各类按钮组件中,默认的消息是"Shall I Continue?",所以你可以不带任何参数去调用它们。
这里我们演示不带任何参数的去调用ccbox(),当选择"cancel"或关闭窗口的时候返回一个布尔类型的值:
from easygui import *
import sys
if ccbox():
pass # user chose to continue
else:
sys.exit(0) # user chose to cancel
7、使用关键字参数调用EasyGui的函数
调用EasyGui函数还可以使用关键字参数哦。
现在假设你需要使用一个按钮,但你不想指定标题参数(第二个参数),
你仍可以使用关键字参数的方法指定choices参数(第三个参数),像这样:
>>> from easygui import *
>>> choices = ['Yes','No','Only on Firdat']
>>> reply = choicebox('Do you like to eat fish?',choices=choices)
8、使用按钮组件
根据需要,EasyGui在buttonbox()上建立了一系列的函数供调用。
8.1、msgbox()
msgbox(msg='(Your massage goes here)',title='',ok_button='OK',image=None,root=None)
msgbox()是显示一个消息和提供一个"OK"按钮,你可以指定任意的消息和标题,你甚至可以重写"OK"按钮的内容。
以下是msgbox()实例函数:
def msgbox(msg='(Your massage goes here)',title='',ok_button='OK'):
....
重写"OK"按钮的方法最简单的方法是使用关键字参数:
>>> from easygui import *
>>> msgbox("backup complete!",ok_button="Good job!")
8.2、ccbox()
ccbox(msg='Shall I continue?',title='',choice=('Continue','Cancel'),image=None)
ccbox()提供一个选择:continue或者cancel,并相应的返回1(选中Continue)或者0(选中Cancel)。
注意ccbox()是返回整数的1或0,而不是布尔类型的True或False。但你仍然可以这么写:
from easygui import *
import sys
if ccbox('要再来一次吗?',choices=('要啊要啊^_^','算了吧T_T')):
msgbox('不给玩了,再玩就玩坏了....')
else:
sys.exit(0)
8.3、ynbox()
ynbox(msg='Shall I Continue?',title='',choices=('Yes','No'),image=None)
同上,都不知道作者设计这两个玩意儿搞啥.....
8.4、buttonbox()
buttonbox(msg='',title='',choices=('Button1','Button2','Button3'),image=None,root=None)
可以使用buttonbox()定义自己的一组按钮,buttonbox()会显示一组你定义好的按钮。
当用户点击任意一个按钮的时候,buttonbox()返回按钮的文本内容。如果用户取消或者关闭窗口,那么会返回默认选项(第一个选项)。
请看例子:
from easygui import *
buttonbox('你喜欢以下哪种水果?','水果选择',choices=('草莓','西瓜','芒果'))
8.5、indexbox()
indexbox(msg='Shall I Continue?',title='',choices=('Yes','No'),image=None)
基本跟上边一样,区别就是当用户选择第一个按钮的时候返回序号0,选择第二个按钮的时候返回序号1。
8.6、boolbox()
boolbox(msg='Shall I Continue?',title='',choices=('Yes','No'),image=None)
如果第一个按钮被选中则返回1,否则返回0。
9、如何在buttonbox里边显示图片
当你调用一个buttonbox函数(例如msgbox(),ynbox(),indexbox()等等)的时候,你还可以为关键字参数image赋值,
这是设置一个.gif格式的图像(注意仅支持GIF格式):
from easygui import *
buttonbox('你喜欢以下哪种水果?','水果选择',image='E:\\huaban.gif',choices=('草莓','西瓜','芒果'))
10、为用户提供一系列选项
10.1、choicebox()
choicebox(msg='Pick something.',title='',choices=())
按钮组件方便提供用户一个简单的按钮选项,但如果有很多选项,或者选项的内容特别长的话,更好的策略是为它
们提供一个可选择的列表。
choicebox()为用户提供一个可选择的列表,使用序列(元组或列表)作为选项,这些选项显示前会按照不区分大小写的方法排好序。
- 例如当按下键盘上的“g”键,将会选中的第一个以“g”开头的选项。再按下“g”键,则会选中下一个以“g”开头的选项。在选中最后一个以“g”开头的选项的时候,再次按下“g”键将重新回到列表的开头的第一个以“g”开头的选项。
- 如果选项中没有以“g”开头的,则会选中字符排序在“g”之前(“f”)的那个字符开头的选项。
- 如果选项中没有字符的排序在“g”之前的,那么在列表中第一个元素将会被选中。
10.2、multchoicebox()
multchoicebox(msg='Pick as many items as you like.',title='',choices=(),**kwargs)
multchoicebox()函数也是提供一个可选择的列表,于choicebox()不同的是,multchoicebox()支持用户选择0个,1个或者同时选择多个选项。
multchoicebox()函数也是使用序列(元组或列表)作为选项,这些选项显示前会按照不区分大小写的方法排好序。
11、让用户输入消息
11.1、enterbox()
enterbox(msg='Enter something.',title='',default='',strip=True,image=None,root=None)
enterbox()为用户提供了一个最简单的输入框,返回值为用户输入的字符串。默认返回的值会自动去除首尾的空格,如果需要
保留首尾空格的话,请设置参数strip=False。
from easygui import *
enter_content = enterbox('Enter Somthing:',title='survey')
print(enter_content)
11.2、integerbox()
integerbox(msg='',title='',default='',lowerbound=0,upperbound=99,image=None,root=None,
**invalidKeywordArguments)
integerbox()为用户提供一个简单的输入框,用户只能输入范围内(lowerbound参数设置最小值,upperbound参数设置最大值)的整型数值,
否则会要求用户重新输入。
from easygui import *
enter_content = integerbox('Enter digital',title='survey',lowerbound=0,upperbound=5)
print(enter_content)
11.3、multenterbox()
multenterbox(msg='Fill in Values for fields.',title='',field=(),values=())
multenterbox()为用户提供多个简单的输入框,要注意以下几点:
- 如果用户输入的值比较少的话,则返回列表中的值用空字符串填充用户为输入的选项
- 如果用户输入的值比较多的话,则返回列表中的值将截断为选项的数量
- 如果用户取消操作,则返回域中的列表值或者None值
from easygui import *
msg = 'Enter your personal information'
title = 'Credit Card Application'
fieldNames = ['Name','Street Address','City','State','ZipCode']
fieldValues = []
fieldValues = multenterbox(msg,title,fieldNames)
print(fieldValues)
例子2:
from easygui import *
msg = '【*真实姓名】为必填项。\n\n【*手机号码】为必填项。\n\n【*E-mail】为必填项。'
title = '账号中心'
fieldNames = ['*用户名','*真实姓名','固定电话','*手机号码','QQ','*E-mail']
fieldValues = []
fieldValues = multenterbox(msg,title,fieldNames)
print(fieldValues)
例子3(有默认值):
from easygui import *
msg = '【*真实姓名】为必填项。\n\n【*手机号码】为必填项。\n\n【*E-mail】为必填项。'
title = '账号中心'
fieldNames = ['*用户名','*真实姓名','固定电话','*手机号码','QQ','*E-mail']
fieldValues = ['yuyu','Ethan','010-89674570','156****3366','********','*****@126.com']
fieldValues = multenterbox(msg,title,fields=fieldNames,values=fieldValues)
print(fieldValues)
from easygui import *
msg = '【*真实姓名】为必填项。\n\n【*手机号码】为必填项。\n\n【*E-mail】为必填项。'
title = '账号中心'
fieldNames = ['*用户名','*真实姓名','固定电话','*手机号码','QQ','*E-mail']
fieldValues = ['yuyu','Ethan','010-89674570','156****3366','********','*****@126.com']
fieldValues = multenterbox(msg,title,fieldNames,fieldValues)
print(fieldValues)
带有默认数据:
12、让用户输入密码
有时候我们需要让用户输入密码,就是用户输入的东西看上去就是'******'。
12.1、passwordbox()
passwordbox(msg='Enter your password.',title='',default='',image=None,root=None)
passwordbox()跟enterbox()样式一样,不同的是用户输入的内容用"*"显示出来,返回用户输入的字符串:
from easygui import *
msg = '请输入密码:'
title = '账号中心'
password = passwordbox(msg,title)
print(password)
12.2、multpasswordbox()
multpasswordbox(msg='Fill in Values for the fields.',title='',fields=(),values=())
multpasswordbox()跟multenterbox()使用相同的接口,但当它显示的时候,最后一个输入框显示为密码的形式("*"):
from easygui import *
msg = '请输入密码:'
title = '账号中心'
fieldNames = ['name','age','sex','password']
password = multpasswordbox(msg,title,fieldNames)
print(password)
13、显示文本
EasyGui还提供函数用于显示文本。
13.1、textbox()
textbox(msg='',title='',text='',codebox=0)
textbox()函数默认会以比例字体(参数codebox=0设置为等宽字体)来显示文本内容(会自动换行),这个函数适合用于显示一般的书面文字。
注:text参数(第三个参数)可以是字符串类型,列表类型,或者元组类型。
from easygui import *
msg = '文件【record.txt】的内容如下'
title = '显示文件内容:'
f = open('E:\\record.txt','r')
text = list(f)
f.close()
textbox(msg,title,text,codebox=0)
13.2、codebox()
codebox(msg='',title='',text'')
codebox()以等宽字体显示文本内容,相当于textbox(codebox=1)
注:等宽字体很丑。
from easygui import *
msg = '文件【record.txt】的内容如下'
title = '显示文件内容:'
f = open('E:\\record.txt','r')
text = list(f)
f.close()
codebox(msg,title,text)
14、目录与文件
GUI编程中一个常见的场景是要求用户输入目录及文件名,EasyGui提供了一些基本函数让用户来浏览文件系统,选择一个目录或文件。
14.1、diropenbox()
diropenbox(msg=None,title=None,default=None)
diropenbox()函数用于提供一个对话框,返回用户选择的目录名(带完整路径),如果用户选择"Cancel"则返回None。
default参数用于设置默认的打开目录(请确保设置的目录已存在)。
from easygui import *
f = diropenbox('选择一个文件夹')
print(f)
14.2、fileopenbox()
fileopenbox(msg=None,title=None,default='*',filetypes=None)
fileopenbox()函数用于提供一个对话框,返回用户选择的文件名(带完整路径),如果用户选择"Cancel"则返回None。
关于default参数的设置方法:
- default参数指定一个默认路径,通常包含一个或多个通配符。
- 如果设置了default参数,fileopenbox()显示默认的文件路径和格式。
- default默认的参数是'*',即匹配所有格式的文件。
例如:
- default="e:/yuyu/*.py",即显示e:\yuyu文件夹下所有的Python文件
- default="e:/yuyu/test*.py",即显示e:/yuyu/文件夹下所有的名字以test开头的Python文件。
- 可以是包含文件掩码的字符串列表,例如:filetypes = ["*.txt"]
- 可以是字符串列表,列表的最后一项字符串是文件类型的描述,例如:filetypes = ["*.css",["*.htm","*.html","HTML files"]]
from easygui import *
f = fileopenbox(default='035*.py')
14.3、filesavebox()
filesavebox(msg=None,title=None,default='',filetypes=None)
filesavebox()函数提供一个对话框,让用于选择文件需要保存的路径(带完整路径),如果用户选择"Cancel"则返回None。
default参数应该包含一个文件名(例如当前需要保存的文件名),当然你也可以设置为空的,或者包含一个文件格式掩码的通配符。 filetypes参数参考fileopenbox()。
from easygui import *
f = filesavebox(default='035_easygui_filesavebox_1.py')
15、记住用户的设置
15.1、EgStore
GUI编程中一个常见的场景就是要求用户设置一下参数,然后保存下来,以便下次用户使用你的程序的时候可以记住
他的设置。
为了实现对用户的设置进行存储和恢复这一过程,EasyGui提供了一个叫做EgStore的类。为了记住某些设置,
你的应用程序必须定义一个类(暂时称之为"设置"类,尽管你随意的使用你想要的名称设置它)继承自EgStore类。
然后你的应用程序必须创建一个该类的对象(暂时称之为"设置"对象)。
设置累的构造函数(__int__方法)必须初始化所有的你想要它所记住的那些值。
一旦你这样做了,你就可以在"设置"对象中通过设定值去实例化变量,从而很简单地记住设置。之后使用settings.store()方法在硬盘
上持久化设置对象。
下面是创建一个"设置"类的例子
from easygui import *
import os
class Settings(EgStore):
def __init__(self,filename):
self.userId = ""
self.targetServer = ""
self.filename = filename
self.restore()
settingsFilename = os.path.join('E:','settings.txt')
settings = Settings('E:\\settings.txt')
user = '奥巴马'
server = '白宫'
settings.userId = user
settings.targetServer = server
settings.store()
user = 'yuyu'
settings.userId = user
settings.store()
16、捕获异常
exceptionbox()
使用EasyGui编写GUI程序,有时候难免会产生异常。当然这取决于你如何运行你的应用程序,当你的应用程序
崩溃的时候,堆栈追踪可能会被抛出,或者被写入到stdout标准输出函数中。
EasyGui通过exceptionbox()函数提供了更好的方式去处理异常,异常出现的时候,exceptionbox()会显示堆栈追踪
在一个codebox()中并且允许你做进一步的处理。
exceptionbox()很容易使用,下面是一个例子:
from easygui import *
try:
1/0
except:
exceptionbox()