Python桌面端应用最小化托盘开发实践指南

 更新时间:2026年03月24日 08:35:21   作者:唐叔在学习  
这篇文章主要为大家详细介绍了Python桌面端应用最小化托盘开发的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

最近,在实现「TodoList」应用最小化到系统托盘的功能时,踩了几个坑,记录一下。

前言

这个功能其实挺常见的:用户点击应用右上角的关闭按钮,应用不会直接退出,而是最小化到系统托盘,在后台继续运行。

这么做的好处也很直观——不占用桌面空间,同时保持后台运行,避免消息提醒失效。

不过真落地实现的时候,还是有几个需要注意的地方,下面展开聊聊~

代码核心实现

一开始让 AI 帮忙写,结果跑不起来。后来参考了文末补充内容,才把功能调通。

webview_process = None  
def run_webview():  
    webview.create_window('Webview', 'https://pywebview.flowrl.com/hello')  
    webview.start()  
if __name__ == '__main__':  
    def start_webview_process():  
        global webview_process  
        webview_process = Process(target=run_webview)  
        webview_process.start()  
    def on_open(icon, item):  
        global webview_process  
        if not webview_process.is_alive():  
            start_webview_process()  
    def on_exit(icon, item):  
        icon.stop()  
    start_webview_process()  
    image = Image.open('demo.png')  
    menu = Menu(MenuItem('Open', on_open), MenuItem('Exit', on_exit))  
    icon = Icon('Pystray', image, menu=menu)  
    icon.run()  
    webview_process.terminate()

整体思路是用到了 pystray 这个库:

  • 创建一个系统托盘图标
  • 图标支持右键菜单,包含“打开”和“退出”两个选项
  • 通过 icon.run() 保持应用在后台持续运行
  • 改造原有代码:
    • create_window 提取为独立方法,方便重复调用
    • 用全局变量 webview_process 管理子进程,点击“打开”时判断是否存活,避免重复启动
  • 只有调用 icon.stop(),托盘图标才会退出,应用才算真正关闭

注意事项

1. 单击托盘图标打开应用

MenuItem 中设置 default=True 即可实现单击托盘图标时触发打开操作。

这里有个小插曲:我用 DeepSeek 咨询时,它推荐的 default_action 函数一直不生效。后来换 Gemini,给出的方案是直接加 default=True,看引用来源是 Stack Overflow 上的回答。

估计这个问题在国内社区讨论不多,导致 DeepSeek 的训练数据里没覆盖到。

menu = Menu(MenuItem('打开应用', on_open, default=True), MenuItem('彻底退出', on_exit))

2. 解决重复打开应用的问题

这个问题也是靠 Gemini 解决的。DeepSeek 给的方案偏复杂,就没继续折腾。

if __name__ == '__main__':  
    # 用于解决打包后的多进程问题  
    multiprocessing.freeze_support()  
  
    # 其他代码  

重复打开的原因是子进程重新执行了 main 块。两个 AI 分析的根因基本一致:

主进程启动
    ↓
执行 if __name__ == '__main__': 块
    ↓
创建 webview_process (子进程A)
    ↓
webview_process.start() 触发:
    ├─ 创建新进程
    ├─ 重新导入 main.py
    ├─ 子进程A执行 if __name__ == '__main__'?
    │   └─ 是的!因为这是新进程的入口
    └─ 再次打印 "启动任务提醒服务..." (第2次)
    ↓
主进程继续执行 icon.run()
    ↓
icon.run() 阻塞主进程

3. 点击关闭按钮时弹出提醒

这个可以通过前端自定义弹窗 + 后端监听关闭事件来实现。不过 pywebview 本身提供了默认实现,我就直接偷懒用了:

webview.create_window(  
    'TodoList',  
    frontend_path,  
    js_api=api,  
    width=1400,  
    height=900,  
    text_select=True,  
    resizable=True,  
    confirm_close=True  # 增加该配置项
)

另外,pywebview 的关闭弹窗支持中文化配置,但遗憾的是不支持动态切换。如果后续英文用户不多,可能就不折腾了~

# 定义本地化字符串字典  
chinese_localization = {  
    'global.quitConfirmation': '温馨提示:\n关闭后,程序将最小化到系统托盘以保持消息后台提醒。\n如需彻底关闭,请在托盘右键退出~',  
    'global.ok': '确定',  
    'global.cancel': '取消'  
}

webview.start(bind, backend.globals.window, private_mode=False, ssl=True, debug=False, localization= chinese_localization)

知识补充

使用pywebview创建后台运行的桌面应用

pywebview是一个轻量级的Python库,专门用于创建跨平台的桌面GUI应用。它最大的优势在于能够将现代Web技术与传统桌面应用完美结合。通过集成pystray库,你可以轻松为应用添加系统托盘功能,让用户即使关闭主窗口也能保持应用在后台运行。

快速搭建系统托盘应用

让我们从基础开始,创建一个简单的系统托盘应用:

from PIL import Image
from pystray import Icon, Menu, MenuItem
import webview
def create_tray_icon():
    # 加载应用图标
    image = Image.open('logo/logo.png')
    # 创建托盘菜单
    menu = Menu(
        MenuItem('打开应用', on_open),
        MenuItem('退出', on_exit)
    )
    # 创建系统托盘图标
    icon = Icon('MyApp', image, menu=menu)
    return icon
def on_open(icon, item):
    # 显示应用窗口的逻辑
    pass
def on_exit(icon, item):
    # 退出应用的逻辑
    icon.stop()

到此这篇关于Python桌面端应用最小化托盘开发实践指南的文章就介绍到这了,更多相关Python桌面应用开发内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python实现Windows电脑定时关机

    python实现Windows电脑定时关机

    这篇文章主要为大家详细介绍了python实现Windows电脑定时关机功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Python删除Java源文件中全部注释的实现方法

    Python删除Java源文件中全部注释的实现方法

    这篇文章主要介绍了Python删除Java源文件中全部注释的实现方法,涉及Python读取文件、正则匹配、字符串查找、替换等相关操作技巧,需要的朋友可以参考下
    2017-08-08
  • Pandas中DataFrame的分组/分割/合并的实现

    Pandas中DataFrame的分组/分割/合并的实现

    这篇文章主要介绍了Pandas中DataFrame的分组/分割/合并的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • python障碍式期权定价公式

    python障碍式期权定价公式

    这篇文章主要为大家详细介绍了python障碍式期权定价公式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Pandas数据类型转换df.astype()及数据类型查看df.dtypes的使用

    Pandas数据类型转换df.astype()及数据类型查看df.dtypes的使用

    Python,numpy都有自己的一套数据格式,本文主要介绍了Pandas数据类型转换df.astype()及数据类型查看df.dtypes的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 浅谈python中get pass用法

    浅谈python中get pass用法

    这篇文章主要介绍了python中get pass用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Python利用pdfplumber库提取pdf中表格数据

    Python利用pdfplumber库提取pdf中表格数据

    pdfplumber是一个用于从PDF文档中提取文本和表格数据的Python库,它可以帮助用户轻松地从PDF文件中提取有用的信息,例如表格、文本、元数据等,本文介绍了如何通过Python的pdfplumber库提取pdf中表格数据,感兴趣的同学可以参考一下
    2023-05-05
  • matlab输出数据为excel文件的问题

    matlab输出数据为excel文件的问题

    这篇文章主要介绍了matlab输出数据为excel文件的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • python如何以表格形式打印输出的方法示例

    python如何以表格形式打印输出的方法示例

    这篇文章主要介绍了python如何以表格形式打印输出的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • Python缺失值处理方法

    Python缺失值处理方法

    这篇文章主要介绍了Python缺失值处理方法,文章围绕主题展开详细内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05

最新评论