打开cmd输入安装:
pip install easygui
如果提示
WARNING: You are using pip version 19.2.3, however version 20.2.1 is available.
更新pip:
只需要在cmd输入命令:python -m pip install --upgrade pip
可能由于python版本太高导致pip无法更新
解决pip更新问题.WARNING: You are using pip version 19.2.3, however version 20.2.1 is available.
首先在Github上下载EasyGui源码
Github-EasyGui
无法访问外网的可以在我的主页里资源哪里去找。
或者百度网盘地址:
链接:https://pan.baidu.com/s/1uDp7qRQnAxwv_XO4W9vdeQ
提取码:Nucd
安装解压后打开cmd
进入解压后的文件夹中
使用python调用setup.py后面跟install选项
如果设置过环境变量,直接
python setup.py install
下载完关闭即可
import easygui
easygui.msgbox("Hello")
#或者
import easygui as Box #取别名
Box.msgbox("Hello")
找到Python下载文件夹下我这里是下载到E盘了
E:\python\Lib\site-packages\easygui-0.98.2-py3.9.egg\easygui\boxes
这个文件夹下都是窗口配置文件
这里修改choice_box.py
import easygui as Box
import random
Box.msgbox("猜数字游戏开始","Dodamce")
secret=random.randint(1,10)#生成1到10随机数
msg="请输入要猜的数字(1-10):"
title="猜数字游戏"
guss=Box.integerbox(msg,title,lowerbound=1,upperbound=10)
#integerbox(msg='', title=' ', default=None, lowerbound=0, upperbound=99, image=None, root=None)
#integerbox() 为用户提供一个简单的输入框,用户只能输入范围内(lowerbound 参数设置最小值,upperbound 参数设置最大值)的整型数值,否则会要求用户重新输入。
#返回值为用户输入的字符串。
while True:
if guss==secret:
Box.msgbox("猜对了!")
break
else:
if guss>secret:
Box.msgbox("猜大了")
else:
Box.msgbox("猜小了")
guss=Box.integerbox(msg,title,lowerbound=1,upperbound=10)
Box.msgbox("退出游戏")
import easygui as Box
msg="请填写下列信息"
title="账号中心"
DateName=["*用户名","*真实姓名","*电话"," 固定电话"," QQ","*邮箱"]
DateValue=Box.multenterbox(msg,title,DateName)
#multenterbox(msg='Fill in values for the fields.', title=' ', fields=[], values=[], callback=None, run=True)
#multenterbox() 为用户提供多个简单的输入框,要注意以下几点:
#如果用户输入的值比选项少的话,则返回列表中的值用空字符串填充用户为输入的选项。
#如果用户输入的值比选项多的话,则返回的列表中的值将截断为选项的数量。
#如果用户取消操作,则返回域中的列表的值或者 None 值。
while True:
if DateValue ==None:
break
TxTMsg=""
for i in range(len(DateName)):#访问每一个标题
option=DateName[i].strip()#strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
if DateValue[i].strip()=="" and option[0]=="*":
TxTMsg+=("[%s]为必填项。\n\n"%DateName[i])
if TxTMsg=="":#说明所有的必填项都有了数据
break
#用之前的值再画一个窗口
DateValue=Box.multenterbox(TxTMsg,title,DateName,DateValue)
print("用户资料为:%s"%str(DateValue))
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() 返回按钮的文本内容。
如果用户点击取消或者关闭窗口,那么会返回默认选项(第一个选项None)
#-*-coding:GBK -*-
import easygui as Box
import os
FilePath=Box.fileopenbox(default="*.txt")
#fileopenbox(msg=None, title=None, default='*', filetypes=None, multiple=False)
#fileopenbox() 函数用于提供一个对话框,返回用户选择的文件名(带完整路径),如果用户选择 “Cancel” 则返回 None。
#默认显示所有txt文件
with open(FilePath,encoding='gbk',errors='ignore') as File:#with语句,自动关闭文件等操作
title=os.path.basename(FilePath)#返回文件名
msg="文件[%s]内容为:"%title
text=File.read()
text_after=Box.textbox(msg,title,text)
#textbox(msg='', title=' ', text='', codebox=False, callback=None, run=True)
#textbox() 函数默认会以比例字体(参数 codebox=True 设置为等宽字体)来显示文本内容(自动换行),这个函数适合用于显示一般的书面文字。
if text !=text_after[:-1]:#b = a[:-1]表示从a的第一个元素复制到最后一个元素之前给b
choice = Box.buttonbox("检测到文件内容发生改变,请选择以下操作:", "警告", ("覆盖保存", "放弃保存", "另存为..."))
if choice =="覆盖保存":
with open(FilePath,'w',encoding='gbk',errors='ignore') as File:
File.write(text_after[:-1])
if choice =="放弃保存":
pass #当你不清楚要写的内容时,就可以用pass来进行填坑。
if choice =="另存为...":
NewPath=Box.filesavebox(default=".txt")
#filesavebox(msg=None, title=None, default='', filetypes=None)
#filesavebox() 函数提供一个对话框,让用于选择文件需要保存的路径(带完整路径),如果用户选择 “Cancel” 则返回 None。
if os.path.splitext(NewPath)[1]!=".txt":
NewPath+=".txt"
with open(NewPath,'w',encoding='gbk',errors='ignore') as NewFile:
NewFile.write(text_after[:-1])
diropenbox(msg=None, title=None, default=None)
diropenbox() 函数用于提供一个对话框,返回用户选择的目录名(带完整路径),如果用户选择 “Cancel” 则返回 None。
default 参数用于设置默认的打开目录(请确保设置的目录已存在)。
import easygui as Box
import os
target=[".c",".cpp",".py",".cc",".java"]
File={}#空索引
Line={}
def PrintResult(Path):
lines=0
total=0
text=""
for Type in Line:
lines=Line[Type]
total+=lines
text+="[%s]文件%d个,代码%d行\n"%(Type,File[Type],lines)
title="统计结果"
msg="一共编写了%d行代码,完成进度:%.2f %%\n离10万行代码还差%d行!"%(total,total/1000,100000-total)
Box.textbox(msg,title,text)
def CoutLine(FileName):
lines=0
with open(FileName) as File:
print("正在统计%s文件......"%FileName)
try:
for eachLine in File:
lines+=1
except UnicodeDecodeError:
pass #如果遇到了奇怪文件,忽略
return lines
def SearchFile(Path):
os.chdir(Path)#更改工作目录
for eachFile in os.listdir(os.curdir):#目录下所有文件
Type=os.path.splitext(eachFile)[1]
if Type in target:
lines=CoutLine(eachFile)#统计文件内的行数
#统计文件数
try:#如果字典中不存,抛出 KeyError,则添加字典键
File[Type]+=1
except KeyError:
File[Type]=1
#统计代码行数
try:
Line[Type]+=lines
except KeyError:
Line[Type]=lines
if os.path.isdir(eachFile):#是文件夹
SearchFile(eachFile)
#递归结束后工作目录回到上一级目录
os.chdir(os.pardir)
#主函数
Box.msgbox("请打开要统计的文件夹!","统计代码量")
Path=Box.diropenbox("请选择要统计的代码库")
SearchFile(Path)
PrintResult(Path)