PyInstaller打包Tkinter程序后窗口循环创建问题求助
问题解决:PyInstaller打包Tkinter程序后不断创建窗口
问题现象
- 在IDLE中运行
System-Toolkit.py完全正常,无任何报错 - 使用命令
pyinstaller --onefile -w System-Toolkit.py(注:原命令中的pyinstall为拼写错误)打包无报错,但运行打包后的程序会不断创建窗口,仅在任务管理器关闭其中一个窗口后,才会显示正常界面 - 尝试用
input()保持窗口或调整root.destroy()位置均无效
核心原因
代码缺少if __name__ == "__main__":的入口保护逻辑。PyInstaller打包时,主脚本会被作为模块导入执行,没有这个判断的话,创建窗口的代码会被重复触发,导致无限生成新窗口。
修复后的完整代码
import platform import psutil import cpuinfo import wmi import selenium from tkinter import * class Window(Frame): def __init__(self, master=None): Frame.__init__(self, master, bg="#393939") self.master = master self.pack(fill=BOTH, expand=1) text = Label(self, text="Version (0.0.0)", bg="#393939", fg="#f73030", font=("Helvetica", 12, "bold")) text.pack(padx=0,pady=0, anchor="w") text = Label(self, text="System Toolkit", bg="#393939", fg="#f73030", font=("Helvetica", 32, "bold")) text.pack(padx=12,pady=10) text = Label(self, text="Operating System: ", bg="#393939", fg="#30F752", font=("Helvetica", 18)) text.pack(padx=12,pady=10) ostype = f"{platform.architecture()}" text = Label(self, text="Architecture: " + str(ostype), bg="#393939", fg="white", font=("Helvetica", 18)) text.pack(padx=20,pady=10, anchor="w") net = f"{platform.node()}" text = Label(self, text="Network Name: " + str(net), bg="#393939", fg="white", font=("Helvetica", 18)) text.pack(padx=20,pady=10, anchor="w") processor = f"{platform.platform()}" text = Label(self, text="Version: " + str(processor), bg="#393939", fg="white", font=("Helvetica", 18)) text.pack(padx=20,pady=10, anchor="w") text = Label(self, text="CPU: ", bg="#393939", fg="#30F752", font=("Helvetica", 18)) text.pack(padx=12,pady=10) mycpu = cpuinfo.get_cpu_info() text = Label(self, text="Model: " + mycpu['brand_raw'], bg="#393939", fg="white", font=("Helvetica", 18)) text.pack(padx=20,pady=10, anchor="w") process = f"{platform.processor()}" text = Label(self, text="Model Info: " + str(process), bg="#393939", fg="white", font=("Helvetica", 18)) text.pack(padx=20,pady=10, anchor="w") text = Label(self, text="Clock Speed: " + mycpu['hz_actual_friendly'], bg="#393939", fg="white", font=("Helvetica", 18)) text.pack(padx=20,pady=10, anchor="w") text = Label(self, text="RAM: ", bg="#393939", fg="#30f752", font=("Helvetica", 18)) text.pack(padx=12,pady=10) ram = f"{psutil.virtual_memory().total / 1024 / 1024 / 1024:.2f}Gb \n" text = Label(self, text="Total: " + str(ram), bg="#393939", fg="white", font=("Helvetica", 18)) text.pack(padx=20,pady=10, anchor="w") # 添加入口保护,避免打包后重复执行创建窗口的逻辑 if __name__ == "__main__": root = Tk() app = Window(root) root.wm_title("System Toolkit - (v0.0.0") #root.wm_attributes('-transparentcolor', '#ab23ff') root.geometry("800x600") root.mainloop() # mainloop结束后窗口已自动销毁,无需额外调用destroy()
额外说明
- 打包命令需修正为
pyinstaller --onefile -w System-Toolkit.py,原命令中的pyinstall是拼写错误 root.destroy()可以删除,因为mainloop()会在窗口关闭后才结束,此时窗口已自动销毁
内容的提问来源于stack exchange,提问作者Galactic Geek
相关产品推荐
相关产品推荐

