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

PyInstaller打包Tkinter程序为Exe后出现多窗口重复创建问题

解决PyInstaller打包Tkinter+多进程程序后重复创建窗口的问题

问题根源

程序启动时提前创建multiprocessing.Pool,在Windows的spawn启动方式下,会立即触发子进程启动。PyInstaller打包后的exe在子进程启动时会重新运行整个程序,导致子进程也执行if __name__ == '__main__':块中的GUI初始化代码,从而重复创建Tk窗口。

解决方案

延迟进程池的创建时机,直到用户点击按钮后再初始化进程池,确保子进程仅执行无GUI的计算逻辑,不会触发窗口初始化。同时简化代码逻辑,移除不必要的wait_variable阻塞。

修改后的代码

import tkinter as tk
import multiprocessing as mp
from tkinter import Label, IntVar

def worker_function(x):
    result = 42 * x
    return result

if __name__ == '__main__':
    mp.set_start_method('spawn')
    root = tk.Tk()
    root.geometry("300x300")
    aa = Label(root, text="Empty String", font=('arial', 15, 'bold'))
    aa.pack()

    def start_process():
        # 点击按钮后再创建进程池,避免子进程提前启动
        pool = mp.Pool(3)
        values = list(pool.map(worker_function, [1, 2, 3]))
        aa.config(text=str(values))
        pool.close()
        pool.join()  # 等待所有子进程完成后关闭进程池

    button = tk.Button(root, text="Start Process", command=start_process)
    button.pack()

    root.mainloop()

PyInstaller打包建议

如果需要生成无控制台窗口的exe,使用以下命令:

pyinstaller --onefile --noconsole your_script_name.py

内容的提问来源于stack exchange,提问作者Irtaza Hamid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 00:37:31