如何用PyInstaller将多Tkinter窗口Python脚本打包为单可执行文件?
解决Tkinter多脚本打包为单exe的问题
问题原因
- 文件找不到错误:打包成单文件后,
window.py不会作为独立文件存在,os.startfile("window.py")自然找不到目标文件。 - 子窗口延迟弹出:两个
tk.Tk()实例各自运行mainloop(),主窗口的循环会阻塞子窗口的显示,只有主窗口关闭后,子窗口的循环才会执行。
正确解决方案
步骤1:重构代码,使用Toplevel作为子窗口
将子窗口改为基于Toplevel(依附主窗口的子窗口),并通过模块导入的方式调用,而非执行外部脚本。
修改后的main.py:
import tkinter as tk from window import create_sub_window root = tk.Tk() root.title("主窗口") def openwindow(): create_sub_window(root) root_b = tk.Button(root, text="打开子窗口", command=openwindow) root_b.grid(row=1, column=0, padx=20, pady=20) root.mainloop()
修改后的window.py:
import tkinter as tk def create_sub_window(parent): # 使用Toplevel创建子窗口,继承主窗口的上下文 sub_window = tk.Toplevel(parent) sub_window.title("子窗口") window_l = tk.Label(sub_window, text="Window 1") window_l.grid(row=0, column=0, padx=20, pady=20) # 无需单独调用mainloop,主窗口的mainloop已处理所有事件
步骤2:正确打包
执行以下PyInstaller命令,只需打包主脚本即可(window.py会通过import被自动包含进exe):
pyinstaller --onefile main.py
额外说明
- 若坚持使用独立的
tk.Tk()实例(不推荐,Tkinter多主窗口易引发异常),可通过线程启动子窗口,但需注意Tkinter并非线程安全,需用after()方法更新UI。 - 打包时若出现资源缺失,可通过
--add-data参数手动添加,但上述重构方式无需额外配置。
内容的提问来源于stack exchange,提问作者MikasaS1
相关产品推荐
相关产品推荐

