点击按钮打开其他文件:多Python脚本打包为单EXE运行需求
实现按钮打开子窗口并打包为单个独立EXE的解决方案
一、修正代码并适配打包需求
先把现有代码里的错误和适配打包的部分调整好:
修改后的Main.py
import sys import os import subprocess from tkinter import Tk, Button def open_next_script(): if getattr(sys, 'frozen', False): # 打包后运行时,获取临时解压目录 base_path = sys._MEIPASS else: # 作为脚本运行时,获取当前文件所在目录 base_path = os.path.dirname(os.path.abspath(__file__)) script_path = os.path.join(base_path, 'Next.py') try: startupinfo = None # Windows下隐藏控制台窗口 if os.name == 'nt': startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW subprocess.Popen([sys.executable, script_path], startupinfo=startupinfo) except FileNotFoundError as e: print(f"找不到文件: {e}") except Exception as e: print(f"发生错误: {e}") root.withdraw() root = Tk() button = Button(root, text="打开Next窗口", command=open_next_script) button.pack() root.mainloop()
修改后的Next.py
from tkinter import Tk, Label print("Hello") root = Tk() root.title("Next窗口") Label(root, text="这是从Main打开的子窗口").pack() root.mainloop()
二、用PyInstaller打包成单个独立EXE
- 先安装PyInstaller:
pip install pyinstaller
- 执行打包命令(Windows系统):
pyinstaller --onefile --windowed --add-data "Next.py;." Main.py
参数说明:
--onefile:强制打包成单个EXE文件--windowed:运行时不弹出控制台窗口(如果需要查看print输出,去掉这个参数即可)--add-data "Next.py;.":把Next.py作为资源打包进去,程序运行时会自动解压到和EXE同层级的目录(Linux/macOS下把分号改成冒号)
- 打包完成后,去项目目录下的
dist文件夹找生成的EXE文件,直接复制到其他Windows电脑就能独立运行。
三、更简洁的替代方案
如果不需要单独启动Next.py进程,完全可以把Next的窗口逻辑直接写到Main.py里,省掉subprocess调用的步骤,打包也更简单:
修改Main.py如下:
import sys import os from tkinter import Tk, Button, Label def open_next_window(): root.withdraw() # 直接创建新窗口 next_root = Tk() next_root.title("Next窗口") Label(next_root, text="这是子窗口").pack() next_root.mainloop() root = Tk() button = Button(root, text="打开Next窗口", command=open_next_window) button.pack() root.mainloop()
打包时直接执行:
pyinstaller --onefile --windowed Main.py
这种方式不需要处理额外的文件路径,打包出来的EXE更简洁。
内容的提问来源于stack exchange,提问作者srijan chakraborty
相关产品推荐
相关产品推荐

