tray_manager是一種用於創建系統托盤圖標的軟件包,基於PySstray(https://github.com/moses-palmer/pystray byMosesPalmér),此軟件包是基於對象的使用,因此可以操縱Pystray的“更簡單”版本。
tray_manager是PubliseHd在PYPI上(https://pypi.org/project/project/tray-manager/),可以通過在您的終端中使用以下命令來下載:
pip install tray-manager筆記
您需要在計算機上安裝Python
庫的主要對像是tray_manager.TrayManager對象,它是中心元素,可以被視為系統托盤本身中的圖標,它包含我們應用程序的所有元素。
要創建一個,您需要導入tray_manager.TrayManager類並創建一個托盤對象:
from tray_manager import TrayManager
my_tray = TrayManager ( app_name = "My App" )要停止應用程序,您需要使用以下內容的.kill()函數:
筆記
.kill()函數返回菜單中包含的所有項目作為項目列表
from tray_manager import TrayManager , Label , Button
my_tray = TrayManager ( "My App" , run_in_seperate_thread = True )
my_menu = my_tray . menu
def my_callback ():
print ( "Hello" )
my_label = Label ( "My Label" )
my_button = Button ( "My Button" , my_callback )
my_menu . add ( my_label )
my_menu . add ( my_button )
my_tray . kill ()
- > [ my_label , my_button ]重要的
您已殺死的菜單和Traymanager對象將變得無用
警告
創建tray_manager.TrayManager對象將在創建後立即運行其內部循環。這意味著創建tray_manager.TrayManager對象將阻止您的其餘代碼。為了防止這種情況發生,您有2個選擇:
您可以將函數指定為tray_manager.TrayManager對象的setup參數,此函數將在創建對象時以新線程啟動。
(僅Windows)如果您在Windows上並且不必擔心與其他平台的兼容性,則可以將run_in_separate_thread參數tray_manager.TrayManager對象設置為True ,這將在新線程中啟動tray_manager loop,並且代碼的其餘部分將在loop中正確執行。
這些項目是您應用程序的元素,它們將顯示在添加到的菜單中。它們是各種各樣的項目,它們都以類似的方式工作,但每個項目都有一些特殊性。
這是所有項目的列表:
標籤是最基本的項目,僅由文本組成。
要創建一個,請使用tray_manager.Label類如下:
from tray_manager import Label
my_label = Label ( "My Label" )該按鈕就像標籤項目一樣,但是您可以添加一個回調參數(functionType),當用戶單擊按鈕時將調用。您還可以將一些參數指定為元組,當單擊按鈕時,該參數將傳遞給您的功能。
要創建一個,請使用tray_manager.Button類如下:
from tray_manager import Button
def my_callback ( text : str ) -> None :
print ( text )
my_button = Button ( "My Button" , my_callback , args = ( "Hello" ,))複選框項目比常規按鈕要復雜一些,它具有2個不同的回調,而不是1個不同的回調,每一個都有不同的參數,一個是從“禁用”到“啟用”狀態的複選框切換(未檢查到已選中),而從“啟用”切換到“啟用”到“禁用”狀態時(未檢查)(未檢查)。
您可以通過將check_default的值設置為None 。
筆記
如果用戶在禁用該複選框上,則不會執行回調。
要創建一個,請使用tray_manager.CheckBox類如下:
from tray_manager import CheckBox
def checked ( text : str ) -> None :
print ( f"In procedure 'checked' : { text } " )
def unchecked ( text : str ) -> None :
print ( f"In procedure 'unchecked' : { text } " )
my_checkbox = CheckBox ( "My CheckBox" , check_default = False , checked_callback = checked , checked_callback_args = ( "I'm now checked" ,),
unchecked_callback = unchecked , unchecked_callback_args = ( "I'm now unchecked" ,))要獲取複選框的當前狀態,您可以使用以下內容使用.get_status()函數:
from tray_manager import CheckBox
my_checkbox = CheckBox ( "My CheckBox" )
my_checkbox . get_status ()
- > bool | None您還可以使用.set_status()函數如下:
from tray_manager import CheckBox
my_checkbox = CheckBox ( "My CheckBox" )
my_checkbox . set_status ( True )
- > Checked
my_checkbox . set_status ( False )
- > Unchecked
my_checkbox . set_status ( None )
- > Disabled 筆記
| 複選框 | 地位 |
|---|---|
| 檢查 | True |
| 未選中 | False |
| 禁用 | None |
當禁用複選框時,它停留在以前的狀態並停止交互,這意味著,如果在禁用之前檢查了複選框,則將保留該複選框,但是如果用戶單擊它,則不會發生任何事情。
分離器是pystray的內置對象,它沒有任何參數。
要創建一個,請使用tray_manager.Separator類如下:
from tray_manager import Separator
my_separator = Separator ()子菜單就像tray_manager.Menu對象,可以包含其他項目,包括其他子菜單。
警告
在將子菜單添加到彼此中時,要添加子菜單,因為將子菜單添加到您所添加的子菜單中包含的子菜單將生成tray_manager.CircularAddException錯誤。
流程圖TD
a {我的子菜單} - > b(我的標籤)
a-> c(我的按鈕)
a-> d {我的第二個子菜單}
D-> e(我的第二個標籤)
D-> F(我的複選框)
D-> | tray_manager.circularaddexception |一個
要創建一個,請使用tray_manager.Submenu如下:
from tray_manager import Submenu
my_submenu = Submenu ( "My Submenu" )要在子菜單中添加一個項目,請使用以下內容的.add()函數:
from tray_manager import Submenu , Label
my_submenu = Submenu ( "My Submenu" )
my_label = Label ( "My Label" )
my_submenu . add ( my_label )要從子菜單中刪除項目,請使用.remove()函數如下:
from tray_manager import Submenu , Label
my_submenu = Submenu ( "My Submenu" )
my_label = Label ( "My Label" )
my_submenu . add ( my_label )
my_submenu . remove ( my_label )
- > my_label 筆記
.remove()函數返回已刪除的項目
要獲取子菜單中包含的項目,請使用.get_items()函數如下:
from tray_manager import Submenu , Label , Button
def my_callback ()
print ( "Hello" )
my_submenu = Submenu ( "My Submenu" )
my_label = Label ( "My Label" )
my_button = Button ( "My Button" , my_callback )
my_submenu . add ( my_label )
my_submenu . add ( my_button )
my_submenu . get_items ()
- > [ my_label , my_button ]tray_manager.Menu是此庫的中心元素之一,它的工作原理就像一個子菜單,當您創建tray_manager.TrayManager對像作為tray_manager.TrayManager.menu對象時會自動創建,並且無法刪除。
警告
檢查tray_manager.OsSupport.HAS_MENU是否在操作系統上的可用性,如果您的操作系統不支持菜單,則tray_manager.TrayManager.menu像是無。
要使用菜單,請訪問tray_manager.TrayManager.menu對像如下:
from tray_manager import TrayManager
my_tray = TrayManager ( "My App" , run_in_seperate_thread = True )
my_menu = my_tray . menu要將項目添加到菜單中,請使用以下內容的.add()函數:
from tray_manager import TrayManager , Label
my_tray = TrayManager ( "My App" , run_in_seperate_thread = True )
my_menu = my_tray . menu
my_label = Label ( "My Label" )
my_menu . add ( my_label )要從菜單中刪除項目,您可以使用.remove()函數如下:
from tray_manager import TrayManager , Label
my_tray = TrayManager ( "My App" , run_in_seperate_thread = True )
my_menu = my_tray . menu
my_label = Label ( "My Label" )
my_menu . add ( my_label )
my_menu . remove ( my_label )
- > my_label 筆記
.remove()函數返回已刪除的項目。
要獲取菜單中包含的項目,您可以使用.get_items()函數如下:
from tray_manager import TrayManager , Menu , Label , Button
def my_callback ()
print ( "Hello" )
my_tray = TrayManager ( "My App" , run_in_seperate_thread = True )
my_menu = my_tray . menu
my_label = Label ( "My Label" )
my_button = Button ( "My Button" , my_callback )
my_menu . add ( my_label )
my_menu . add ( my_button )
my_menu . get_items ()
- > [ my_label , my_button ]要更新菜單項(菜單中包含的項目),請使用.update()函數。
from tray_manager import TrayManager
my_tray = TrayManager ( "My App" , run_in_seperate_thread = True )
my_menu = my_tray . menu
my_menu . update ()筆記
每次您編輯,從菜單中添加或刪除項目時,會自動觸發.update()函數。
您可以以不同的方式自定義traymanager對象,例如:
要為您的應用程序設置新名稱,請使用.set_app_name()函數如下:
from tray_manager import TrayManager
my_tray = TrayManager ( "My App" , run_in_seperate_thread = True )
my_tray . set_app_name ( "My new App" )tray_manager使用一個用於圖標的內存系統,為您的應用程序設置新圖標,首先需要使用.load_icon()函數加載它,然後使用tray_manager.TrayManager對象的.set_icon()函數將圖標設置為新圖標。
筆記
默認情況下,圖標是32x32像素的白色正方形。默認圖標始終加載到內存中,可以通過將tray_manager.Values.DEFAULT作為.set_icon()函數的name參數進行再次設置。
要加載圖標,請使用.load_icon()函數,然後傳遞文件路徑,編碼圖像, PIL.Image對像或可以通過pil讀取並解釋為映像的任何文件。您還需要傳遞一個名稱,該名稱將用作圖標字典中的鍵,以重述您的圖標。
from tray_manager import TrayManager
my_tray = TrayManager ( "My App" , run_in_seperate_thread = True )
my_tray . load_icon ( "my_icon_file_path.png" , "my_new_icon" )警告
tray_manager使用字典來保存您的加載圖標,這意味著使用已經使用的名稱加載圖像將覆蓋以前用該名稱加載的圖像。唯一的例外是無法編輯的默認圖標。
要設置圖標,請使用.set_icon()函數,然後將其在加載圖標時設置的圖標的名稱(鍵)傳遞。
from tray_manager import TrayManager
my_tray = TrayManager ( "My App" , run_in_seperate_thread = True )
my_tray . load_icon ( "my_icon_file_path.png" , "my_new_icon" )
my_tray . set_icon ( "my_new_icon" )當您希望它停止在系統托盤中顯示並創建新的traymanager對象,而不是殺死tray_manager.TrayManager對象,您可以使用.show()和.hide()和.hide()函數的tray_manager.TrayManager對象來控制應用程序是否可在系統托盤中可見。
筆記
您可以在創建tray_manager.TrayManager對象時將tray_manager.TrayManager對象的default_show參數設置為True或False ,以定義一旦創建對象,是否將顯示系統托盤圖標。
要在系統托盤中顯示該應用程序,請使用the tray_manager.TrayManager對象的.show()函數如下:
from tray_manager import TrayManager
my_tray = TrayManager ( "My App" , run_in_seperate_thread = True )
my_tray . show ()要將應用程序隱藏在系統托盤中,請使用tray_manager.TrayManager對象的.hide()函數如下:
from tray_manager import TrayManager
my_tray = TrayManager ( "My App" , run_in_seperate_thread = True )
my_tray . hide ()要編輯已經創建的項目,請使用項目的.edit()函數,在此操作時,您只需要指定要更改的參數,而其他參數將與它們保持不變。
要編輯項目,請按照以下操作:
from tray_manager import Button
def my_first_callback ():
print ( "Hello" )
my_button . edit ( callback = my_second_callback )
def my_second_callback ():
print ( "World !" )
my_button = Button ( "My Button" , my_first_callback )
# When clicking on the button, this will display :
# First click
- > Hello
# Second click
- > World !您可以以不同的方式自定義項目,例如:
如果要顯示該項目,但希望它具有無反應性(對於按鈕,複選框和子菜單),並且看起來像是禁用項目,則可以使用項目的.enable()和.disable()函數。
筆記
默認情況下,每個項目都啟用
除分離器外,每個項目都可以禁用。
要啟用您的物品,請使用以下內容的項目的.enable()函數:
from tray_manager import CheckBox
def checked_callback ():
print ( "Checked" )
def unchecked_callback ():
print ( "Unchecked" )
my_checkbox = CheckBox ( "My CheckBox" , checked_callback = checked_callback , unchecked_callback = unchecked_callback )
my_checkbox . enable ()要禁用您的項目,請使用以下項目的.disable()函數:
from tray_manager import CheckBox
def checked_callback ():
print ( "Checked" )
def unchecked_callback ():
print ( "Unchecked" )
my_checkbox = CheckBox ( "My CheckBox" , checked_callback = checked_callback , unchecked_callback = unchecked_callback )
my_checkbox . disable ()為了使您的項目成為菜單 /子菜單的默認項目並給它大膽的外觀,您可以在創建 /編輯項目為True時設置default屬性。
筆記
您只能通過菜單 /子菜單有1個默認項目。默認情況下,沒有默認項目。
要設置項目的default屬性,請按照以下操作:
創建項目時:
from tray_manager import Label
my_label = Label ( "My Label" , default = True )編輯項目時:
from tray_manager import Label
my_label = Label ( "My Label" )
my_label . edit ( default = True )如果您想對常規的複選框橫向標記進行新的外觀,則可以將復選框的use_radio_look attribut設置為True /創建 /編輯複選框時。
要設置項目的use_radio_look屬性,請執行以下操作:
創建項目時:
from tray_manager import CheckBox
def checked_callback ():
print ( "Checked" )
def unchecked_callback ():
print ( "Unchecked" )
my_checkbox = CheckBox ( "My CheckBox" , checked_callback = checked_callback , unchecked_callback = unchecked_callback , use_radio_look = True )編輯項目時:
from tray_manager import CheckBox
def checked_callback ():
print ( "Checked" )
def unchecked_callback ():
print ( "Unchecked" )
my_checkbox = CheckBox ( "My CheckBox" , checked_callback = checked_callback , unchecked_callback = unchecked_callback )
my_checkbox . edit ( use_radio_look = True )在使用tray_manager package的功能之前,必須檢查它們是否與OS兼容。為此,請使用tray_manager.Os_Support對象。在使用之前,您需要檢查4個不同的功能:
要知道您的操作系統是否支持功能,相應的Os_Support變量必須為真。
例如,要檢查您的操作系統是否支持菜單,請執行以下操作:
from tray_manager import Os_Support
if Os_Support . SUPPORT_MENU :
print ( "The menu is supported by your OS" )
else :
print ( "The menu isn't supported by your OS" )筆記
這是每個操作系統和後端都應該支持和不應該支持的功能的圖表。
| 功能 OS和後端 | Windows(Win32) | Linux(GTK) | Linux(appindicator) | Linux(Ayatana-Appindicator) | Linux(XORG) | macos(達爾文) |
|---|---|---|---|---|---|---|
| 菜單 | 支持 | 支持 | 支持 | 支持 | 不支持 | 支持 |
| 預設 | 支持 | 支持 | 不支持 | 不支持 | 支持 | 不支持 |
| 收音機 | 支持 | 支持 | 支持 | 支持 | 支持 | 不支持 |
| 通知 | 目前Unavailbe | 未知 | 眾所周知 | 未知 | 不支持 | 不支持 |
如果要在用戶的屏幕上創建通知,則可以使用tray_manager.TrayManager.notification對象。
要創建通知,請使用tray_manager.TrayManager.notification對象的.notify()函數如下:
from tray_manager import TrayManager
my_tray = TrayManager ( "My App" , run_in_separate_thread = True )
notification = my_tray . notification
notification . notify ( "My App" , "Hello World !" )您可以指定一個延遲,然後通過將值(以秒為單位)傳遞給.notify()函數作為remove_after_s ,如下:
from tray_manager import TrayManager
my_tray = TrayManager ( "My App" , run_in_separate_thread = True )
notification = my_tray . notification
notification . notify ( "My App" , "Hello World !" , remove_after_s = 10 )
# The notification will close by itself after 10 seconds您也可以使用.remove_notification()函數手動刪除如下的通知:
from tray_manager import TrayManager
my_tray = TrayManager ( "My App" , run_in_separate_thread = True )
notification = my_tray . notification
notification . notify ( "My App" , " Hello World !)
# Some code here
notification . remove_notification ()警告
默認情況下,通知將永遠不會單獨關閉,請確保在創建新的通知之前將其關閉。
如果您需要特定的功能,則可以將tray_manager.TrayManager對象的backend參數設置為tray_manager.Backends values之一。
筆記
默認情況下,Pystray將在操作系統上使用最佳的後端。
警告
您必須使用tray_manager.Backends class的後端,傳遞了類的一個對象的值將引起錯誤。
您還必須使用與操作系統兼容的後端。
| 作業系統 | 後端 |
|---|---|
| 視窗 | win32 |
| macos | darwin |
| Linux | gtk , appindicator , ayatana-appindicator , xorg |