调用打包后的Python计算器exe时弹出CMD且主窗口失活问题
问题原因
你遇到的两个问题分别由以下原因导致:
- 主悬浮窗口锁定无法操作:
os.system()是同步阻塞方法,调用后会等待被启动的exe程序完全退出才会返回结果,这段时间主程序的tkinter事件循环会被完全阻塞,无法响应用户的任何操作。 - 弹出CMD窗口:
os.system()本质是调用系统的cmd.exe来执行目标命令,默认会唤起控制台窗口执行指令。
解决方法
将所有os.system()调用替换为subprocess.Popen异步调用,同时添加Windows平台专属的无窗口启动参数即可同时解决两个问题,修改步骤如下:
- 引入subprocess模块,可替换代码头部的
import os,如果还需要保留os模块的其他功能也可以同时保留两个导入 - 将所有按钮点击函数内的
os.system('xxx.exe')替换为以下格式的调用:
subprocess.Popen( ['目标程序名.exe'], creationflags=subprocess.CREATE_NO_WINDOW, shell=False )
关键代码修改示例
# 头部导入修改 import subprocess import tkinter as tk from tkinter import * from tkinter import messagebox # 点击函数修改示例,所有同类函数都按这个格式修改即可 def click_basic(): subprocess.Popen( ['Basic_Calculator.exe'], creationflags=subprocess.CREATE_NO_WINDOW, shell=False ) def click_scientific(): subprocess.Popen( ['Scientific_Calculator.exe'], creationflags=subprocess.CREATE_NO_WINDOW, shell=False )
额外注意事项
如果你需要将主悬浮窗口也打包成exe,打包时添加--noconsole(或者简写-w)参数,可以避免主程序本身弹出CMD窗口,打包指令示例:pyinstaller -w -i calculator.png 你的主程序文件名.py
内容的提问来源于stack exchange,提问作者Bishal Kumar Ghosh
相关产品推荐
相关产品推荐

