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 |