最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python桌面端應(yīng)用最小化托盤開發(fā)實踐指南

 更新時間:2026年03月24日 08:35:21   作者:唐叔在學(xué)習(xí)  
這篇文章主要為大家詳細介紹了Python桌面端應(yīng)用最小化托盤開發(fā)的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

最近,在實現(xiàn)「TodoList」應(yīng)用最小化到系統(tǒng)托盤的功能時,踩了幾個坑,記錄一下。

前言

這個功能其實挺常見的:用戶點擊應(yīng)用右上角的關(guān)閉按鈕,應(yīng)用不會直接退出,而是最小化到系統(tǒng)托盤,在后臺繼續(xù)運行。

這么做的好處也很直觀——不占用桌面空間,同時保持后臺運行,避免消息提醒失效。

不過真落地實現(xiàn)的時候,還是有幾個需要注意的地方,下面展開聊聊~

代碼核心實現(xiàn)

一開始讓 AI 幫忙寫,結(jié)果跑不起來。后來參考了文末補充內(nèi)容,才把功能調(diào)通。

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 這個庫:

  • 創(chuàng)建一個系統(tǒng)托盤圖標
  • 圖標支持右鍵菜單,包含“打開”和“退出”兩個選項
  • 通過 icon.run() 保持應(yīng)用在后臺持續(xù)運行
  • 改造原有代碼:
    • create_window 提取為獨立方法,方便重復(fù)調(diào)用
    • 用全局變量 webview_process 管理子進程,點擊“打開”時判斷是否存活,避免重復(fù)啟動
  • 只有調(diào)用 icon.stop(),托盤圖標才會退出,應(yīng)用才算真正關(guān)閉

注意事項

1. 單擊托盤圖標打開應(yīng)用

MenuItem 中設(shè)置 default=True 即可實現(xiàn)單擊托盤圖標時觸發(fā)打開操作。

這里有個小插曲:我用 DeepSeek 咨詢時,它推薦的 default_action 函數(shù)一直不生效。后來換 Gemini,給出的方案是直接加 default=True,看引用來源是 Stack Overflow 上的回答。

估計這個問題在國內(nèi)社區(qū)討論不多,導(dǎo)致 DeepSeek 的訓(xùn)練數(shù)據(jù)里沒覆蓋到。

menu = Menu(MenuItem('打開應(yīng)用', on_open, default=True), MenuItem('徹底退出', on_exit))

2. 解決重復(fù)打開應(yīng)用的問題

這個問題也是靠 Gemini 解決的。DeepSeek 給的方案偏復(fù)雜,就沒繼續(xù)折騰。

if __name__ == '__main__':  
    # 用于解決打包后的多進程問題  
    multiprocessing.freeze_support()  
  
    # 其他代碼  

重復(fù)打開的原因是子進程重新執(zhí)行了 main 塊。兩個 AI 分析的根因基本一致:

主進程啟動
    ↓
執(zhí)行 if __name__ == '__main__': 塊
    ↓
創(chuàng)建 webview_process (子進程A)
    ↓
webview_process.start() 觸發(fā):
    ├─ 創(chuàng)建新進程
    ├─ 重新導(dǎo)入 main.py
    ├─ 子進程A執(zhí)行 if __name__ == '__main__'?
    │   └─ 是的!因為這是新進程的入口
    └─ 再次打印 "啟動任務(wù)提醒服務(wù)..." (第2次)
    ↓
主進程繼續(xù)執(zhí)行 icon.run()
    ↓
icon.run() 阻塞主進程

3. 點擊關(guān)閉按鈕時彈出提醒

這個可以通過前端自定義彈窗 + 后端監(jiān)聽關(guān)閉事件來實現(xiàn)。不過 pywebview 本身提供了默認實現(xiàn),我就直接偷懶用了:

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

另外,pywebview 的關(guān)閉彈窗支持中文化配置,但遺憾的是不支持動態(tài)切換。如果后續(xù)英文用戶不多,可能就不折騰了~

# 定義本地化字符串字典  
chinese_localization = {  
    'global.quitConfirmation': '溫馨提示:\n關(guān)閉后,程序?qū)⒆钚』较到y(tǒng)托盤以保持消息后臺提醒。\n如需徹底關(guān)閉,請在托盤右鍵退出~',  
    'global.ok': '確定',  
    'global.cancel': '取消'  
}

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

知識補充

使用pywebview創(chuàng)建后臺運行的桌面應(yīng)用

pywebview是一個輕量級的Python庫,專門用于創(chuàng)建跨平臺的桌面GUI應(yīng)用。它最大的優(yōu)勢在于能夠?qū)F(xiàn)代Web技術(shù)與傳統(tǒng)桌面應(yīng)用完美結(jié)合。通過集成pystray庫,你可以輕松為應(yīng)用添加系統(tǒng)托盤功能,讓用戶即使關(guān)閉主窗口也能保持應(yīng)用在后臺運行。

快速搭建系統(tǒng)托盤應(yīng)用

讓我們從基礎(chǔ)開始,創(chuàng)建一個簡單的系統(tǒng)托盤應(yīng)用:

from PIL import Image
from pystray import Icon, Menu, MenuItem
import webview
def create_tray_icon():
    # 加載應(yīng)用圖標
    image = Image.open('logo/logo.png')
    # 創(chuàng)建托盤菜單
    menu = Menu(
        MenuItem('打開應(yīng)用', on_open),
        MenuItem('退出', on_exit)
    )
    # 創(chuàng)建系統(tǒng)托盤圖標
    icon = Icon('MyApp', image, menu=menu)
    return icon
def on_open(icon, item):
    # 顯示應(yīng)用窗口的邏輯
    pass
def on_exit(icon, item):
    # 退出應(yīng)用的邏輯
    icon.stop()

到此這篇關(guān)于Python桌面端應(yīng)用最小化托盤開發(fā)實踐指南的文章就介紹到這了,更多相關(guān)Python桌面應(yīng)用開發(fā)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python中關(guān)于面向?qū)ο笏接袑傩苑椒ǖ脑敿氈v解

    Python中關(guān)于面向?qū)ο笏接袑傩苑椒ǖ脑敿氈v解

    在實際開發(fā)中,對象的某些屬性或方法可能只希望在對象的內(nèi)部被使用,而不希望在外部被訪問到,私有屬性就是對象不希望公開的屬性,私有方法就是對象不希望公開的方法
    2021-10-10
  • python 計算概率密度、累計分布、逆函數(shù)的例子

    python 計算概率密度、累計分布、逆函數(shù)的例子

    這篇文章主要介紹了python 計算概率密度、累計分布、逆函數(shù)的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • pycharm+django創(chuàng)建一個搜索網(wǎng)頁實例代碼

    pycharm+django創(chuàng)建一個搜索網(wǎng)頁實例代碼

    這篇文章主要介紹了pycharm+django創(chuàng)建一個搜索網(wǎng)頁實例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Python使用Pillow庫批量處理圖片的示例詳解

    Python使用Pillow庫批量處理圖片的示例詳解

    Pillow是PIL(Python Imaging Library)的一個分支,但功能更強大、維護更活躍,本文將為大家介紹如何使用Pillow庫來批量處理圖片,包括調(diào)整圖片大小、添加水印和批量格式轉(zhuǎn)換,有需要的小伙伴可以了解下
    2026-01-01
  • python網(wǎng)頁請求urllib2模塊簡單封裝代碼

    python網(wǎng)頁請求urllib2模塊簡單封裝代碼

    這篇文章主要分享一個python網(wǎng)頁請求模塊urllib2模塊的簡單封裝代碼,有需要的朋友參考下
    2014-02-02
  • python訪問純真IP數(shù)據(jù)庫的代碼

    python訪問純真IP數(shù)據(jù)庫的代碼

    項目中有這樣的需求,通過IP地址判斷客戶端是網(wǎng)通的還是電信的。從同事那拿了個純文本的IP純真數(shù)據(jù)庫,用Python寫了一個小程序,感覺挺好的。
    2011-05-05
  • PyQt5使用QTimer實現(xiàn)電子時鐘

    PyQt5使用QTimer實現(xiàn)電子時鐘

    這篇文章主要為大家詳細介紹了PyQt5使用QTimer實現(xiàn)電子時鐘,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Python讀取Excel數(shù)據(jù)并生成圖表過程解析

    Python讀取Excel數(shù)據(jù)并生成圖表過程解析

    這篇文章主要介紹了Python讀取Excel數(shù)據(jù)并生成圖表過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • 使用python從三個角度解決josephus問題的方法

    使用python從三個角度解決josephus問題的方法

    這篇文章主要介紹了使用python從三個角度解決josephus問題的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • python編寫圖書管理系統(tǒng)

    python編寫圖書管理系統(tǒng)

    這篇文章主要為大家詳細介紹了python編寫圖書管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論

县级市| 长汀县| 垦利县| 志丹县| 鄄城县| 贞丰县| 贵德县| 迁西县| 胶州市| 滨州市| 叶城县| 龙陵县| 清镇市| 湟源县| 甘肃省| 荥经县| 锦屏县| 新丰县| 屏山县| 凭祥市| 桐梓县| 盐津县| 安吉县| 海兴县| 武邑县| 门头沟区| 扎囊县| 保山市| 枣阳市| 易门县| 嵊泗县| 西青区| 略阳县| 乌审旗| 时尚| 新津县| 溆浦县| 如东县| 增城市| 元阳县| 十堰市|