Tkinter现代主题对话框经PyInstaller打包后风格失效问题求助
根因说明
这个问题是由最新开发版PyInstaller的Windows打包逻辑变更导致的:新版本默认不会为tkinter程序自动嵌入适配现代Windows控件的manifest配置,系统会调用旧版本的公共控件库comctl32.dll渲染对话框,因此出现复古样式。
可直接使用的解决方案
方法1:打包时附加自定义manifest文件
- 在项目目录下创建名为
app.manifest的配置文件,填入以下内容:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> </assembly>
- 打包时添加manifest参数即可,命令示例:
pyinstaller --onefile --windowed --manifest app.manifest 你的脚本名.py
方法2:代码层强制启用现代控件样式
如果不想修改打包参数,可以在代码开头添加以下逻辑,运行时自动激活现代控件样式:
import ctypes from ctypes import wintypes # 初始化公共控件 class INITCOMMONCONTROLSEX(ctypes.Structure): _fields_ = [ ("dwSize", wintypes.DWORD), ("dwICC", wintypes.DWORD) ] icc = INITCOMMONCONTROLSEX() icc.dwSize = ctypes.sizeof(INITCOMMONCONTROLSEX) icc.dwICC = 0x00000080 | 0x00000004 | 0x00000100 # 覆盖常用控件类 ctypes.windll.comctl32.InitCommonControlsEx(ctypes.byref(icc))
方法3:修改spec文件配置
如果你使用spec文件进行打包配置,直接在EXE段添加manifest参数即可:
exe = EXE( pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='你的程序名', 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, # 新增下面这行 manifest='app.manifest' )
内容的提问来源于stack exchange,提问作者Billy Cao
相关产品推荐
相关产品推荐

