零基础入门学习Python(33)-图形用户界面编程(GUI编程)EasyGui

  • 用户界面编程,即平时说的GUI(Graphical User Interface)编程,那些带有按钮、文本、输入框的窗口的编程
  • EasyGui是一个非常简单的GUI模块,一旦导入EasyGui模块,Python实现界面开发就很简单,只是调用EasyGui函数并附上几个参数即可
    EasyGUI 是 Python 中一个非常简单的 GUI 编程模块,不同于其他的 GUI 生成器,它不是事件驱动的。相反,所有的 GUI 交互都是通过简地函数调用就可以实现
    EasyGUI 为用户提供了简单的 GUI 交互接口,不需要程序员知道任何有关 tkinter,框架,部件,回调或 lambda 的任何细节。
    EasyGUI 可以很好地兼容 Python 2 和 3,并且不存在任何依赖关系。
    EasyGUI 是运行在 Tkinter 上并拥有自身的事件循环,而 IDLE 也是 Tkinter 写的一个应用程序并也拥有自身的事件循环。因此当两者同时运行的时候,有可能会发生冲突,且带来不可预测的结果。因此如果你发现你的 EasyGUI 程序有这样的问题,请尝试在 IDLE 外去运行你的程序。

EasyGui超详细中文文档

安装EasyGui

1.配置pip的环境变量
【1】 选择pip.exe所在的文件夹,在安装的python文件夹下的Scripts子文件夹中,对其路径进行复制;

【2】右击“此电脑”→“高级系统设置” →“高级“→“环境变量”;

【3】在用户变量和系统变量中,添加变量。变量名为“path”的变量,变量值为复制的路径;此时确保pyhon也要添加在环境变量中;
【4】 一定要重新打开cmd窗口,然后输入pip即可

2.pip install easygui安装
在这里插入图片描述
3.导入easygui
【1】方法一

import easygui

如果使用上面这种形式导入的话,那么你使用 EasyGUI 的函数的时候,必须在函数的前面加上前缀 easygui,像这样:

easygui.msgbox(...)

在这里插入图片描述

【2】方法二:导入整个 EasyGUI 包

from easygui import *

这样可以更容易调用 EasyGUI 的函数,可以直接这样编写代码:

msgbox(...)

在这里插入图片描述
注意:这样的弊端是导入之后,跟你原来的名字相同的函数有重叠,覆盖了是不好的

【3】方法三:推荐哦

import easygui as g

导入之后就可以这么调用 EasyGUI 的函数:

g.msgbox(...)

在这里插入图片描述
这种方法既可以保持easygui的命名空间,同样可以减少打字数量,导入之后就可以这样来调用里面的函数

EasyGui的功能演示

  • 运行EasyGui的演示程序
python easygui.py
  • 可以从 IDE(例如 IDLE, PythonWin, Wing, 等等)上调用:
>>> import easygui
>>> easygui.egdemo()

使用EasyGui

import easygui as g
import sys

while 1:
        g.msgbox("嗨,欢迎进入第一个界面小游戏")

        msg = "请问你希望在鱼C工作室学习到什么知识呢?"
        title = "小游戏互动"
        choices = ["谈恋爱","编程","OOXX","琴棋书画"]

        choice = g.choicebox(msg,title,choices)

        #注意,msgbox的参数是一个字符串
        #如果用户选择Cancel,该函数返回None
        g.msgbox("你的选择是:" + str(choice),"结果")

        msg = "你希望重新开始小游戏吗?"
        title = "请选择"

        #弹出一个Continue/Cancel对话框
        if g.ccbox(msg,title):
            pass #如果用户选择Coninue
        else:
            sys.exit(0) #如果用户选择Canel

1.EasyGui函数的默认参数

  • 绝大部分的EasyGui函数都有默认参数,几乎所有组件都会显示消息主体和对话框标题
  • 标题默认是空字符串,消息主题通常有一个简单的默认值,这使得你可以尽可能少的去设置参数,比如 msgbox() 函数标题部分的参数是可选的,因此你调用 msgbox() 的时候只需要指定一个消息参数即可。
>>> import easygui as g
>>> g.msgbox('我爱pdd')

在这里插入图片描述
指定标题参数和消息参数,如

>>> g.msgbox('我爱pdd','峰哥心声')

在这里插入图片描述
不带任何参数地去调用 ccbox(),当选择 “cancel” 或关闭窗口的时候返回一个布尔类型的值:
在这里插入图片描述

2.使用关键字参数调用 EasyGUI 的函数

你需要使用一个按钮组件,但你不想指定标题参数(第二个参数),你仍可以使用关键字参数的方法指定 choices 参数(第三个参数),像这样:

>>> choices = ['愿意','不愿意','给钱就愿意']
>>> reply = g.choicebox('你愿意购买资源打包支持小甲鱼吗',choices = choices)

在这里插入图片描述

3.使用按钮组件

  • EasyGUI 在 buttonbox() 上建立了一系列的函数供调用。

[1]mgsbox()

msgbox(msg=’(Your message goes here)’, title=’ ', ok_button=‘OK’, image=None, root=None)

  • msgbox() 显示一个消息和提供一个 “OK” 按钮,你可以指定任意的消息和标题,你甚至可以重写 “OK” 按钮的内容。

  • 重写 “OK” 按钮最简单的方法是使用关键字参数:

>>> g.msgbox('我一定要学会Pyhon!!!',ok_button="加油,冲他爸的")

在这里插入图片描述

[2]ccbox()

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() 提供一个选择:“C[o]ntinue” 或者 “C[a]ncel”,并相应的返回 True 或者 False。

  • 注意:“C[o]ntinue” 中的 [o] 表示快捷键,也就是说当用户在键盘上敲一下 o 字符,就相当于点击了 “C[o]ntinue” 按键

>>> g.ccbox('Shall I continue?',title = '下一步',choices = ('o','a'))

在这里插入图片描述

[3]ynbox()

ynbox(msg=‘Shall I continue?’, title=’ ‘, choices=(’[]Yes’, ‘[]No’), image=None, default_choice=’[]Yes’, cancel_choice=’[]No’)

在这里插入代码片
  • 跟 ccbox() 一样,只不过这里默认的 choices 参数值不同而已,[] 表示将键盘上的 F1 功能按键作为 “Yes” 的快捷键使用。
>>> g.ynbox('Shall I continue?', title=' ', choices=('[<F1>]Yes', '[<F2>]No'), image=None, default_choice='[<F1>]Yes', cancel_choice='[<F2>]No')

在这里插入图片描述

[4]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() 定义自己的一组按钮,buttonbox() 会显示一组由你自定义的按钮。

  • 当用户点击任意一个按钮的时候,buttonbox() 返回按钮的文本内容。

  • 如果用户点击取消或者关闭窗口,那么会返回默认选项(第一个选项)

>>> g.buttonbox('','',choices = ('pdd是帅哥','pdd不帅','pdd很丑'),image=None, images=None, default_choice=None, cancel_choice=None, callback=None, run=True)

在这里插入图片描述

[5]indexbox()

indexbox(msg=‘Shall I continue?’, title=’ ', choices=(‘Yes’, ‘No’), image=None, default_choice=‘Yes’, cancel_choice=‘No’)

  • 基本跟 buttonbox() 一样,区别就是当用户选择第一个按钮的时候返回序号 0, 选择第二个按钮的时候返回序号 1。
    在这里插入图片描述

[6]boolbox()

boolbox(msg=‘Shall I continue?’, title=’ ‘, choices=(’[Y]es’, ‘[N]o’), image=None, default_choice=‘Yes’, cancel_choice=‘No’)

g.boolbox(msg='Shall I continue?', title=' ', choices=('[Y]es', '[N]o'), image=None, default_choice='Yes', cancel_choice='No')
  • 如果第一个按钮被选中则返回 True,否则返回 False。

4.在 buttonbox 里边显示图片

  • 当你调用一个 buttonbox 函数(例如 msgbox(), ynbox(), indexbox() 等等)的时候,你还可以为关键字参数 image 赋值,可以设置一个 .gif 格式的图像(PNG 格式的图像也是支持的哦_):
buttonbox('大家说我长得帅吗?', image='turtle.gif', choices=('帅', '不帅', '!@#$%'))

先安装一下PIL库

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pillow
from PIL import Image

在这里插入图片描述

5.为用户提供一系列选项

[1]choicebox()

choicebox(msg=‘Pick an item’, title=’’, choices=[], preselect=0, callback=None, run=True)

  • 按钮组件方便提供用户一个简单的按钮选项,但如果有很多选项,或者选项的内容特别长的话,更好的策略是为它们提供一个可选择的列表。

  • choicebox() 为用户提供了一个可选择的列表,使用序列(元祖或列表)作为选项,这些选项会按照字母进行排序。

  • 另外还可以使用键盘来选择其中一个选项(比较纠结,但一点儿都不重要):例如当按下键盘上的 “g” 键,将会选中的第一个以 “g” 开头的选项。再次按下 “g” 键,则会选中下一个以 “g” 开头的选项。在选中最后一个以 “g” 开头的选项的时候,再次按下 “g” 键将重新回到在列表的开头的第一个以 “g” 开头的选项。
    如果选项中没有以 “g” 开头的,则会选中字符排序在 “g” 之前(“f”)的那个字符开头的选项
    如果选项中没有字符的排序在 “g” 之前的,那么在列表中第一个元素将会被选中。
    在这里插入图片描述

[2]multchoicebox()

multchoicebox(msg=‘Pick an item’, title=’’, choices=[], preselect=0, callback=None, run=True)

  • multchoicebox() 函数也是提供一个可选择的列表,与 choicebox() 不同的是,multchoicebox() 支持用户选择 0 个,1 个或者同时选择多个选项。

  • multchoicebox() 函数也是使用序列(元祖或列表)作为选项,这些选项显示前会按照不区分大小写的方法排好序。
    在这里插入图片描述

6.让用户输入信息

[1].enterbox()

enterbox(msg=‘Enter something.’, title=’ ‘, default=’’,strip=True,image=None,root= None)

  • enterbox() 为用户提供一个最简单的输入框,返回值为用户输入的字符串。

  • 默认返回的值会自动去除首尾的空格,如果需要保留首尾空格的话请设置参数 strip=False。

g.enterbox(msg='请输入你最想对小甲鱼说的一句话')

在这里插入图片描述

[2].integerbox()

integerbox(msg=’’, title=’ ', default=None, lowerbound=0, upperbound=99, image=None, root=None)

  • integerbox() 为用户提供一个简单的输入框,用户只能输入范围内(lowerbound 参数设置最小值,upperbound 参数设置最大值)的整型数值,否则会要求用户重新输入

[3].multenterbox

multenterbox(msg=‘Fill in values for the fields.’, title=’ ', fields=[], values=[], callback=None, run=True)

  • multenterbox() 为用户提供多个简单的输入框,要注意以下几点:

【1】如果用户输入的值比选项少的话,则返回列表中的值用空字符串填充用户为输入的选项。
【2】如果用户输入的值比选项多的话,则返回的列表中的值将截断为选项的数量。
【3】如果用户取消操作,则返回域中的列表的值或者 None 值。
在这里插入图片描述

7.让用户输入密码

[1]passwordbox()

passwordbox(msg=‘Enter your password.’, title=’ ‘, default=’’, image=None, root=None)

  • passwordbox() 跟 enterbox() 样式一样,不同的是用户输入的内容用星号(*)显示出来,该函数返回用户输入的字符串
g.passwordbox(msg='请输入密码')

在这里插入图片描述

[2]multpasswordbox()

multpasswordbox(msg=‘Fill in values for the fields.’, title=’ ', fields=(), values=(), callback=None, run=True)

  • multpasswordbox() 跟 multenterbox() 使用相同的接口,但当它显示的时候,最后一个输入框显示为密码的形式(*):
    在这里插入图片描述

8.显示文本

[1]textbox()

textbox(msg=’’, title=’ ‘, text=’’, codebox=False, callback=None, run=True)

  • textbox() 函数默认会以比例字体(参数 codebox=True 设置为等宽字体)来显示文本内容(自动换行),这个函数适合用于显示一般的书面文字。

注:text 参数设置可编辑文本区域的内容,可以是字符串、列表或者元祖类型。
在这里插入图片描述

[2]codebox()

codebox(msg=’’, title=’ ‘, text=’’)

  • codebox() 以等宽字体显示文本内容(不自动换行),相当于 textbox(codebox=True)

9.目录与文件

  • GUI 编程中一个常见的场景是要求用户输入目录及文件名,EasyGUI 提供了一些基本函数让用户来浏览文件系统,选择一个目录或文件。

[1]diropenbox()

diropenbox(msg=None,title=None,default=None)

  • diropenbox() 函数用于提供一个对话框,返回用户选择的目录名(带完整路径哦),如果用户选择 “Cancel” 则返回 None。

  • default 参数用于设置默认的打开目录(请确保设置的目录已存在)

在这里插入图片描述

[2]fileopenbox()

fileopenbox(msg=None,title=None,default=’*’,filetypes=None,multiple=False)

  • fileopenbox() 函数用于提供一个对话框,返回用户选择的文件名(带完整路径哦),如果用户选择 “Cancel” 则返回 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”]]

最后是 multiple 参数,如果为 True 则表示可以同时选择多个文件。
在这里插入图片描述

[3]filesavebox()

filesavebox(msg=None,title=None,default=’’,filetypes=None)

  • filesavebox() 函数提供一个对话框,让用于选择文件需要保存的路径(带完整路径哦),如果用户选择 “Cancel” 则返回 None。

  • default 参数应该包含一个文件名(例如当前需要保存的文件名),当然也可以设置为空的,或者包含一个文件格式掩码的通配符。

  • filetypes 参数的设置方法同fileopenbox() 函数。

10.记住用户的设置

[1]EgStore

  • GUI 编程中一个常见的场景就是要求用户设置一下参数,然后保存下来,以便下次用户使用你的程序的时候可以记住他的设置。

  • 为了实现对用户的设置进行存储和恢复这一过程,EasyGUI 提供了一个叫做 EgStore 的类。

  • 为了记住某些设置,你的应用程序必须定义一个类(下面案例中的 “Settings”)继承自 EgStore 类。

  • 然后你的应用程序必须创建一个该类的实例化对象(下面案例中的 “settings”)。

  • 设置类的构造函数(init 方法)必须初始化所有的你想要它所记住的那些值。

  • 一旦你这样做了,你就可以在 settings 对象中通过设定值去实例化变量,从而很简单地记住设置。

  • 之后使用 settings.store() 方法在硬盘上持久化保存。

  • 下面创建一个叫做 “Settings” 的类:

from easygui import EgStore

# 定义一个叫做“Settings”的类,继承自EgStore类
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 = "小甲鱼"
book = "《零基础入门学习Pyhon》"

# 将上面两个变量的值保存到“settings”对象中
settings.author = author
settings.book = book
settings.store()
print("\n保存完毕\n")

11.捕获异常

[1]exceptionbox()

  • 使用 EasyGUI 编写 GUI 程序,有时候难免会产生异常。当然这取决于你如何运行你的应用程序,当你的应用程序崩溃的时候,堆栈追踪可能会被抛出,或者被写入到 stdout 标准输出函数中。

  • EasyGUI 通过 exceptionbox() 函数提供了更好的方式去处理异常。

  • 当异常出现的时候,exceptionbox() 会将堆栈追踪显示在一个 codebox() 中,并且允许你做进一步的处理。

try:
	print('I love PDD')
	int('pdd')
except:
	g.exceptionbox()

在这里插入图片描述

TASK

0. 先练练手,把我们的刚开始的那个猜数字小游戏加上界面吧?

在这里插入图片描述

import random
import easygui as g

g.msgbox("嗨,欢迎进入第一个界面小游戏")
secret = random.randint(1,10)

msg = '不妨猜一下小甲鱼现在心里想的是哪个数字(1~10):'
title = '数字小游戏'
guess = g.integerbox(msg,title,lowerbound=1,upperbound=10)

while 1:
    if guess == secret:
        g.msgbox('卧槽,你是小甲鱼心里的蛔虫吗?!!')
        g.msgbox('哼,猜中了也没有奖励!')
        break
    else:
        if guess > secret:
            g.msgbox('哥,大了大了~~~')
        else:
            g.msgbox('嘿,小了小了~~~')
        guess = g.integerbox(msg,title,lowerbound=1,upperbound=10)
g.msgbox('游戏结束,不玩啦')#只有猜中后才会结束循环,退出游戏

1. 如下图,实现一个用于登记用户账号信息的界面(如果是带 * 号的必填项,要求一定要有输入并且不能是空格)
在这里插入图片描述

import easygui as g

msg = '请填写以下联系方式'
title = '账号中心'
fieldNames = [' *用户名',' *真实姓名',' 固定电话',' *手机号码',' QQ',' *E-mail']
fieldValues = []#是要自己填的值
fieldValues = g.multenterbox(msg,title,fieldNames)

while 1:
    if fieldValues == None:#不是什么也不输入哦,是输入none才会退出循环
        break
    errmsg = ''#初始化报错内容
    for i in range(len(fieldNames)):#一个一个检查
                   
        option = fieldNames[i].strip()#str.strip()  : 去除字符串两边的空格
        if fieldValues[i].strip() == ''and option[0] == '*':#带有星号的输入为空
            errmsg += ('【%s】为必填项。\n\n' % fieldNames[i])#两个\n表示提示完一个空一行
    if errmsg == '':
        break
    fieldValues = g.multenterbox(errmsg,title,fieldNames,fieldValues)
print('用户资料如下: %s' %  str(fieldValues))
                    
                       


2. 提供一个文件夹浏览框,让用户选择需要打开的文本文件,打开并显示文件内容。
在这里插入图片描述

import os.path
import easygui as g

file_path = g.fileopenbox(default = '*.txt')#输入文件路径

with open(file_path) as f:#打开文件
    title = os.path.basename(file_path)#去除路径获得文件名
    msg = '文件【%s】的内容如下:' % title
    text = f.read()
    g.textbox(msg,title,text)


3. 在上一题的基础上增强功能:当用户点击“OK”按钮的时候,比较当前文件是否修改过,如果修改过,则提示“覆盖保存”、”放弃保存”或“另存为…”并实现相应的功能。
(提示:解决这道题可能需要点耐心,因为你有可能会被一个小问题卡住,但请坚持,自己想办法找到这个小问题所在并解决它!)

import os.path
import easygui as g

file_path = g.fileopenbox(default = '*.txt')#输入文件路径

with open(file_path) as old_f:#打开文件
    title = os.path.basename(file_path)#去除路径获得文件名
    msg = '文件【%s】的内容如下:' % title
    text = old_f.read()
    text_new = g.textbox(msg,title,text)
if text != text_new[:-1]:#textbox的返回值会追加一个换行符
    choice = g.buttonbox('检测到文件内容发生改变。请选择以下操作:','警告',('覆盖保存','放弃保存','另存为...'))
    if choice == '覆盖保存':
        with open(file_path,'w') as old_f:
            old_f.write(text_new[:-1])
    if choice == '放弃保存':
        pass #用 pass 进行占位,使程序不报错,不会进行任何操作
    if choice == '另存为...':
        new_path = g.filesavebox(default = '.txt')
        if os.path.splitext(new_path)[1] != '.txt':#splitext分离文件名与拓展名,取拓展名比较
            new_path += '.txt'

        with open(new_path,'w') as new_f:
            new_f.write(text_new[:-1])

4. 写一个程序统计你当前代码量的总和,并显示离十万行代码量还有多远?
要求一:递归搜索各个文件夹
要求二:显示各个类型的源文件和源代码数量
要求三:显示总行数与百分比

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值