Windows pyinstaller wxPython pyecharts無法正常顯示問題

TY520發表於2024-05-25

Windows pyinstaller wxPython pyecharts無法正常顯示問題

最近遇到一個pyinstaller打包wxPython pyecharts無法顯示的問題,pyecharts生成的html頁面顯示空白。未使用pyinstaller打包時顯示正常。

問題原因

WebViewBackendDefault = b''
WebViewBackendEdge = b'wxWebViewEdge'
WebViewBackendIE = b'wxWebViewIE'
WebViewBackendWebKit = b'wxWebViewWebKit'
WebViewDefaultURLStr = b'about:blank'

在windows環境非打包情況下使用wxPythonwx.html2.WebView.New()使用的是WebViewBackendEdge的引擎,WebViewBackendEdgeChrome用的是同一個核心所以能正常顯示。 而透過pyinstaller打包後pyinstaller找不到對應的配置檔案,無法使用WebViewBackendEdge的引擎,所以預設打包的瀏覽器是IE,而pyecharts預設使用的是最新版本的echarts連結,IE不支援新版本的echarts的特性,導致頁面無法顯示的問題

方案一

  • 指定低版本的echarts版本,使用低於3.7.0的版本
from pyecharts.globals import CurrentConfig

CurrentConfig.ONLINE_HOST = "https://cdn.jsdelivr.net/npm/echarts@3.6.2/dist/"

方案二

  • pyinstaller打包時指定打包檔案, 下面提供兩種方法,二選一即可

    1. 命令列增加

       # 增加這個
       --add-binary "{HOMEPATH}/wx/WebView2Loader.dll:." 
      
    2. 配置檔案xxx.spec增加

      # -*- mode: python ; coding: utf-8 -*-
      from PyInstaller import HOMEPATH
      
      a = Analysis(
      	...
          # 增加這個
          binaries=[(f'{HOMEPATH}/wx/WebView2Loader.dll', '.')],
      	...
      )
      
  • 完整配置檔案xxx.spec

    # -*- mode: python ; coding: utf-8 -*-
    from PyInstaller import HOMEPATH
    
    a = Analysis(
        ['main.py'],
        pathex=[],
        binaries=[(f'{HOMEPATH}/wx/WebView2Loader.dll', '.')],
        datas=[('./static/datasets', 'pyecharts/datasets/'), ('./static/templates', 'pyecharts/render/templates/'), ('./static/js', 'static/js/')],
        hiddenimports=[],
        hookspath=[],
        hooksconfig={},
        runtime_hooks=[],
        excludes=[],
        noarchive=False,
        optimize=0,
    )
    pyz = PYZ(a.pure)
    
    exe = EXE(
        pyz,
        a.scripts,
        a.binaries,
        a.datas,
        [],
        name='mini-tool',
        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\\icon.png','static\\icon.png'],
    )
    
    

相關文章