PyInstaller编译托盘程序后任务栏频繁弹窗问题求助
问题分析
你的问题根源是打包后每次调用subprocess执行powercfg时,都会弹出临时控制台窗口。Python解释器运行时本身关联了控制台,subprocess会复用这个控制台,所以不会额外弹窗;但用--windowed参数打包后,程序没有绑定控制台,每次执行外部命令都会创建新的控制台窗口,也就是你看到的每5秒任务栏弹窗。
解决方案
1. 修复subprocess调用,隐藏控制台窗口
修改所有subprocess.check_output和subprocess.call的调用,添加creationflags=subprocess.CREATE_NO_WINDOW参数(Windows平台专属),禁止创建新窗口:
def inactive(): while True: # 修复check_output调用,隐藏窗口 output = subprocess.check_output( ["powercfg", "-getactivescheme"], creationflags=subprocess.CREATE_NO_WINDOW ) if (win32api.GetTickCount() - win32api.GetLastInputInfo()) > 300000: if not output == b'GUID \xe1\xe5\xa5\xac\xeb \xaf\xa8\xe2\xa0\xad\xa8\xef: 30edd295-bb03-4f04-9ca5-1d6625c371f5 (\x8f\xe0\xae\xe1\xe2\xae\xa9)': # 修复call调用,隐藏窗口 subprocess.call( "powercfg /s 30edd295-bb03-4f04-9ca5-1d6625c371f5", creationflags=subprocess.CREATE_NO_WINDOW ) print('power saving') systray.update(icon='C:/Users/LEGION/PycharmProjects/game/astolfo2dnd.ico') else: if not output == b'GUID \xe1\xe5\xa5\xac\xeb \xaf\xa8\xe2\xa0\xad\xa8\xef: 04d7a134-5010-4cd2-ac8e-0bd74104d4fa (\x8d\xa5 \xa8\xa3\xe0\xeb)': # 修复call调用,隐藏窗口 subprocess.call( "powercfg /s 04d7a134-5010-4cd2-ac8e-0bd74104d4fa", creationflags=subprocess.CREATE_NO_WINDOW ) print('balanced') systray.update(icon='C:/Users/LEGION/PycharmProjects/game/astolfo2.ico') time.sleep(5)
2. 额外优化:打包图标资源(可选)
当前代码使用绝对路径引用图标,打包后如果移动exe文件,图标会失效。可以把图标文件和脚本放在同一目录,通过sys._MEIPASS获取打包后的临时资源路径:
第一步:修改PyInstaller命令,添加图标打包参数
pyinstaller --noconfirm --onefile --windowed --icon "C:/Users/LEGION/PycharmProjects/game/astlofo4.ico" --name "Astlofo" --add-data "C:/Users/LEGION/PycharmProjects/game/astolfo2.ico;." --add-data "C:/Users/LEGION/PycharmProjects/game/astolfo2dnd.ico;." --add-data "C:/Users/LEGION/PycharmProjects/game/folder.ico;." "C:/Users/LEGION/PycharmProjects/game/helper.py"
第二步:修改代码中的图标路径逻辑
import sys import os def get_resource_path(relative_path): try: # 打包后的临时资源路径 base_path = sys._MEIPASS except Exception: # 开发环境下的本地路径 base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) # 初始化托盘时使用资源路径 systray = SysTrayIcon( get_resource_path("astolfo2.ico"), f"{len(os.listdir('C:/Users/LEGION/Pictures/Zoom/'))} Screens| {text}", menu, on_quit=onquit, default_menu_index=2 ) # 修改菜单中的图标路径 menu = ( ("Screens dir", get_resource_path("folder.ico"), open_dir), ('Switch', None, only_button), ) # inactive函数中更新图标时使用资源路径 # ... systray.update(icon=get_resource_path("astolfo2dnd.ico")) # ... systray.update(icon=get_resource_path("astolfo2.ico"))
验证效果
修改后重新用PyInstaller打包,运行生成的exe文件,任务栏的5秒弹窗会消失,托盘功能可正常运行。
内容的提问来源于stack exchange,提问作者nutipa
相关产品推荐
相关产品推荐

