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
相关产品推荐
相关产品推荐

