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

如何用PyInstaller将多Tkinter窗口Python脚本打包为单可执行文件?

解决Tkinter多脚本打包为单exe的问题

问题原因

  1. 文件找不到错误:打包成单文件后,window.py不会作为独立文件存在,os.startfile("window.py")自然找不到目标文件。
  2. 子窗口延迟弹出:两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 17:42:07