背景说明:

最近使用nicegui做了一个图形网站

由于有桌面软件展示需求,所以使用pyinstaller进行打包。

首先nicegui自己做了一个pyinstaller封装:https://nicegui.io/documentation/section_configuration_deployment#package_for_installation

其实和直接用pyinstaller好像没啥区别。

具体讲pyinstaller

1,生成spec文件

方法1:

nicegui-pack --onefile --name "myapp" main.py

方法2:

pyinstaller xxxx.py

都会生成spec文件

2,添加资源文件夹

比如我有一个static文件夹,里面有各种图片和其他文件

那么可以

a = Analysis(
    ['rosnode.py'],
    pathex=[],
    binaries=[],
    datas=[
        ('C:\\niceguivenv\\mycode\\static\\*', 'static'),
        ('C:\\niceguivenv\\venv\\lib\\site-packages\\nicegui', 'nicegui'),
        ('C:\\niceguivenv\\venv\\lib\\site-packages\\nicegui_highcharts', 'nicegui_highcharts'),
        ],

datas里面前面是原始位置,后面是运行程序的相对位置,也就是会在实际程序运行的目录创建一个static

主程序里面:✅

# #静态
from pathlib import Path
from starlette.staticfiles import StaticFiles
static_folder = Path(__file__).parent / 'static'
# static_folder = Path(__file__).resolve().parent / 'static'
app.add_static_files('/static', str(static_folder))

我原来这个就不行:❌

#原路径
# app.add_static_files('/static', 'static')

python正常程序里面直接找‘./static’就可以使用了。

3,添加软件LOGO

前面添加了static,我的logo在那里面

然后spec里面,添加icon=’static/yannuo.ico’, 即可

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.datas,
    [],
    name='yannuo',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=False,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
    icon='static/yannuo.ico',
)

4,spec的参数介绍

runtime_tmpdir=None,

这个是运行时的目录,默认win appdata里,可以自己指定。

console=False,

这个是控制台是否显示

debug=False,

这个会在build里面生成log文件

5,添加splash

spec里面自己写一行,是全局变量

splash = Splash('image.png',
                binaries=a.binaries,
                datas=a.datas,
                text_pos=(10, 50),
                text_size=12,
                text_color='black')是

exe = EXE(pyz,
          a.scripts,
          splash,                   # <-- both, splash target
          splash.binaries,          # <-- and splash binaries
          ...)

主程序里面,用于关闭splash(默认自己不关闭)

# try:
import pyi_splash
# import time
# for i in range(0, 100, 5):
#     text = f"加载中……进度{i}%"
#     time.sleep(0.1) # 模拟一个速度比较慢的加载过程
    
#     pyi_splash.update_text(text) # 更新显示的文本

pyi_splash.close() # 关闭闪屏
            
# except ImportError:
#     pass

程序关闭后,会有报错,不知道为什么