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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 09:16:04