You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么带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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:45:03