日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 系统托盘_使用 PySide 实现 Python 系统托盘图示

發布時間:2024/9/19 python 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 系统托盘_使用 PySide 实现 Python 系统托盘图示 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

系統托盤圖示 (system tray icon) 通常用來在桌面應用程序最小化后,不希望在任務列(task

bar)出現時,提供一個簡單跟使用者交互的接口。 透過這樣的用戶接口,應用程序可以在有重要事件發生時,即時通知用戶。因此,系統托盤圖示常被諸如“郵件檢查”、“股票報價”等不需要復雜接口的桌面應用所使用。本文山姆鍋說明 Python 如何使用 PySide 來實現一個跨平臺 (cross-platform) 的系統托盤圖示應用程序。

目前三種主要的桌面操作系統,也就是 Windows, Mac OSX, 以及 Linux,都有支持托盤圖示接口,但是名稱跟支持程度稍有不同。 PySide (QT) 提供一個跨平臺的方案,對大部分的 Python

桌面應用來說,這是適合的方案。如果真的不需要其他接口組件, 可以針對各個平臺分別來實現系統托盤程序,對于這樣的情況,山姆鍋建議使用下列組合:

Windows: PyWin32

Ubuntu(Linux): PyGObject

注意:其中 PyGObject 只適合 GTK3 桌面環境。

執行環境

山姆鍋假設以下的執行環境:

Python 2.7.x

PySide 1.2.2

QT 4

范例程序

本文使用 PySide 完成一個單純的桌面程序 AvaShell,可以做到下列功能:

在系統托盤顯示一個圖示。

用戶點選圖示后,會彈跳 (pop-up) 一個菜單。

用戶可以從菜單選擇離開程序。

是的,目前就只能完成上述功能。

為了封裝代碼, 先定義一個 Shell 抽象類作為后續實現的基礎,這樣以后可以依照不同環境選用不同實現:

shell_base.pyview raw1

2

3

4

5

6

7

8

9

10

11

12

13from __future__ import absolute_import, division, print_function, unicode_literals

from abc import abstractmethod

class (object):

def (self):

"""Starts up the shell.

"""

pass

抽象方法(method) run 必須由繼承的子類來實現。底下是采用 PySide 的實現類:

shell_pyside.pyview raw1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81from __future__ import absolute_import, print_function, unicode_literals

import sys

import logging

from PySide.QtGui import *

from avashell.shell_base import ShellBase

from avashell.utils import resource_path

_logger = logging.getLogger(__name__)

class MainWnd(QMainWindow):

def __init__(self, shell, icon):

super(MainWnd, self).__init__()

self._shell = shell

self.icon = icon

self.context_menu = None

self.tray_icon = None

if not QSystemTrayIcon.isSystemTrayAvailable():

msg = "I couldn't detect any system tray on this system."

_logger.error(msg)

QMessageBox.critical(None, "AvaShell", msg)

sys.exit(1)

self.init_ui()

def init_ui(self):

self.setWindowIcon(self.icon)

self.setWindowTitle('AvaShell')

self.create_tray_icon(self.icon)

self.tray_icon.show()

def on_tray_activated(self, reason=None):

_logger.debug("Tray icon activated.")

def on_quit(self):

self._shell.quit_app()

def create_context_menu(self):

self.quit_action = QAction("&Quit AvaShell", self, triggered=self.on_quit)

menu = QMenu(self)

menu.addAction(self.quit_action)

return menu

def create_tray_icon(self, icon):

self.context_menu = self.create_context_menu()

self.tray_icon = QSystemTrayIcon(self)

self.tray_icon.setContextMenu(self.context_menu)

self.tray_icon.setIcon(icon)

self.tray_icon.activated.connect(self.on_tray_activated)

class Shell(ShellBase):

""" Shell implementation using PySide

"""

def __init__(self):

super(Shell, self).__init__()

self.app = QApplication(sys.argv)

self.app.setQuitOnLastWindowClosed(False)

self.icon = QIcon(resource_path('res/icon.png'))

self.menu = None

self.wnd = MainWnd(self, self.icon)

def quit_app(self):

self.app.quit()

def run(self):

_logger.info("Shell is running...")

self.app.exec_()

if __name__ == '__main__':

shell = Shell()

shell.run()

Shell 為 ShellBase 的子類,負責建構 QApplication 以及主窗口(MainWnd); 主窗口負責建立 QSystemTrayIcon 這個代表系統托盤的對象,以及它使用的彈出式菜單,同時注冊相關事件處理器。由于主窗口并不顯示,且不希望主窗口被關閉的時候, 程序自動離開,標號 1 的敘述就是通知 PySide 不要自動離開程序。

為了找到圖檔資源(resource),另外定義了一個公用函數 resource_path,以便之后在使用 PyInstaller 打包后能正常運行。此公用函數定義在 utils.py 這個文件中。

utils.pyview raw1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18from __future__ import absolute_import, division, print_function, unicode_literals

import os

import sys

def resource_path(relative):

"""Gets the resource's absolute path.

:param relative: the relative path to the resource file.

:return: the absolute path to the resource file.

"""

if hasattr(sys, "_MEIPASS"): # 1

return os.path.join(sys._MEIPASS, relative)

abspath = os.path.abspath(os.path.join(__file__, "..")) # 2

abspath = os.path.dirname(abspath)

return os.path.join(abspath, relative)

標號 1 的敘述判斷是否在經過 PyInstaller 打包好的環境執行,如果是則直接使用 sys._MEIPASS 這個特殊屬性值作為資源路徑; 如果不是, resource_path 則假設資源文件放在它的上層目錄。 因此,標號 2 的敘述需要根據 utils.py 與資源的相對位置作調整。

參考數據

結語

使用 PySide 或者 PyQT 可以很方便地實現跨平臺的圖形接口,對于大部分的桌面應用來說,這是好事。但是對于只需要一個簡單的系統托盤圖示的應用來說,使用 PySide 意味著額外需要十幾 MB 的空間來散布所開發的應用程序。 即使如此,相對于針對各個平臺開發所需的時間來說,使用 PySide 通常是比較合理的作法。

總結

以上是生活随笔為你收集整理的python 系统托盘_使用 PySide 实现 Python 系统托盘图示的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。