为什么带Tkinter GUI的Python程序打包成exe运行时出现Thread-1错误
错误原因
docx2pdf底层依赖Windows COM接口调用Microsoft Word实现格式转换,COM组件要求每个使用COM接口的独立线程必须先手动初始化COM运行环境。
VS Code开发环境下运行时,子线程会默认继承控制台环境的COM初始化状态因此不会报错,但使用--windowed参数打包为无控制台exe后,新建的工作线程没有默认初始化COM库,就会抛出CoInitialize has not been called错误。
解决方案
1. 修改业务代码,手动初始化COM
引入pythoncom模块,在转换逻辑执行前初始化当前线程的COM环境,执行完成后释放对应资源,修正后代码如下:
import tkinter from tkinter import ttk, Tk from threading import * from docx2pdf import convert import pythoncom # 新增COM库导入 def mProcess(): # 初始化当前线程的COM环境 pythoncom.CoInitialize() try: input_path = "C:\\test.docx" output_path = "C:\\file.pdf" convert(input_path, output_path) finally: # 线程退出前释放COM资源 pythoncom.CoUninitialize() def mainTask(): t = Thread(target=mProcess) t.daemon = True t.start() ### GUI win = Tk() ttk.Button(win, text = 'Start', command = mainTask).pack(pady=20) win.mainloop()
2. 重新打包exe
正常情况下直接使用原打包命令重新生成exe即可:pyinstaller test.py --onefile --windowed
如果打包后运行提示pythoncom相关依赖缺失,可以在打包命令中增加隐藏导入参数:pyinstaller test.py --onefile --windowed --hidden-import pythoncom
内容的提问来源于stack exchange,提问作者BadRobot
相关产品推荐
相关产品推荐

