用Gooey GUI生成界面
Gooey 一款为命令行工具制作图形界面的工具。如果看了网上关于Gooey的宣传或介绍,你一定很想试试,但是使用之后才发现全是坑。问题不是Gooey不行,而是没有更深入、更详细的教程。
Gooey入门
源码和教程,最好参考github上的。
https://github.com/chriskiehl/Gooey
如果看着不方便,可以参考部分中文教程。但没有哪个教程足够详细,能够真实指导使用的。中文教程参考如下:
https://blog.csdn.net/qq_33682575/article/details/103584885 https://www.jianshu.com/p/b2c1552cd407
简单介绍几句:
#help是屏幕上提示的文字 --表示可选参数。不加--就是必选
ffmpeg_parser.add_argument('--fps',
help='set frame rate (default = 25)',
type=str)
Gooey使用
真正想搞明白Gooey的使用,还得拿个例子试试。链接如下:
https://github.com/chriskiehl/GooeyExamples
推荐使用例子中的subparser_demo.py 该代码运行后是这样:
源码中的display_message()需要引用其他文件,直接编译不过,都可以换成print(parser.parse_args())
生成exe
官网上给出了方法和spec文件。但介绍的太简单并且运行有错,也没有合适的文章。可以参考以下:
pyinstaller使用
pyinstaller -F –windowed build-win.spec
这里有一份写好的,用于编译Gooey的spec文件,要想编译别的文件还得单独去写。
https://ai.aianaconda.com/blog/exe/dabao/build-win.spec
-F 表明要生成1个整文件
如何防止pyinstaller包过大
1.新建虚环境,尽量不要使用特别新的库。
conda create --name dabao38 python=3.8
2.在新环境里运行py代码。保证所有包安装好。
3.重新打包。
遇到的pyinstaller坑
pyinstaller 打包运行后,出问题的解决方法。
修改spec文件
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
options,
gooey_languages, # Add them in to collected files
gooey_images, # Same here.
name='genkitti', # 打包文件名称
debug=False,
strip=None,
upx=True,
console=False,
icon=os.path.join(gooey_root, 'images', 'program_icon.ico'))
将console 和 debug 改成True,再重新生成,即可从控制台看到错误。
pyinstaller打包Gooey GUI时出现编码错误
错误如下:
Exception in thread Thread-1:
Traceback (most recent call last):
File "threading.py", line 932, in _bootstrap_inner
File "threading.py", line 870, in run
File "gooey\gui\processor.py", line 70, in _forward_stdout
File "gooey\gui\processor.py", line 84, in _extract_progress
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte
解决办法参考下面链接:
https://www.cnblogs.com/KingRainGrey/p/15269347.html
该链接改的不够彻底,打包完还得改回去。可以用下面的方式来改,效果会更好。例如文件:
D:\ProgramData\Anaconda3\envs\dabao38\Lib\site-packages\gooey\gui\processor.py
修改:
pub.send_message(events.PROGRESS_UPDATE, progress=_progress)
if _progress is None or self.hide_progress_msg is False:
try:
pub.send_message(events.CONSOLE_UPDATE,
msg=line.decode(self.encoding))
except UnicodeDecodeError :
pub.send_message(events.CONSOLE_UPDATE,
msg=line.decode("gbk"))
pub.send_message(events.EXECUTION_COMPLETE)
def _extract_progress(self, text):
'''
Finds progress information in the text using the
user-supplied regex and calculation instructions
'''
# monad-ish dispatch to avoid the if/else soup
try:
find = partial(re.search, string=text.strip().decode(self.encoding))
except UnicodeDecodeError :
find = partial(re.search, string=text.strip().decode("gbk"))
更多的错误参考
可以自行尝试,链接如下:
https://blog.csdn.net/u012219045/article/details/115397646