tray_manager -это пакет, используемый для создания значка для системного лотка, основанного на Pyray (https://github.com/moses-palmer/pyray от Moses Palmér), этот пакет является «более легкой» версией Pyrayray для манипулирования, поскольку он основан на использовании объектов.
tray_manager Is PubliseHD на pypi (https://pypi.org/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 варианта:
Вы можете указать функцию как аргумент setup объекта tray_manager.TrayManager , эта функция будет начата в новом потоке при создании вашего объекта.
(Только Windows) Если вы находитесь в Windows и не беспокоитесь о совместимости с другими платформами, вы можете установить аргумент run_in_separate_thread о объекте tray_manager.TrayManager для True , это запустит цикл tray_manager в новом потоке, а остальная часть вашего кода будет правильно выполнена в основном цикле.
Элементы являются элементами вашего приложения, они будут отображаться в меню, в которое они добавлены. Это разные виды предметов, которые все работают аналогичным образом, но у каждого есть некоторые особенности.
Вот список всех элементов:
Метка является самым основным элементом, он состоит только из текста.
Чтобы создать один, используйте класс 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 |
Когда флажок отключен, он остается в своем предыдущем состоянии и перестает взаимодействовать, это означает, что если флажок был проверен до отключения, флажок останется проверенным, но ничего не произойдет, если пользователь нажмет на него.
Сепаратор является встроенным объектом Pyray, у него нет никаких параметров.
Чтобы создать один, используйте класс tray_manager.Separator , который последовал:
from tray_manager import Separator
my_separator = Separator () Sumenu похож на объект tray_manager.Menu и может содержит другие элементы, включая другие подменю.
Осторожность
Будьте затруднены при добавлении подменю в друг друга в качестве добавления подменю в подменю, который содержатся в подменю, который вы добавляете, будет генерировать ошибку tray_manager.CircularAddException .
Блок -схема TD
A {my summenu} -> 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 не будет.
Чтобы использовать меню, Acces the 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() , а затем установите значок в качестве нового значка, используя функцию .set_icon() объекта tray_manager.TrayManager .
Примечание
По умолчанию значок представляет собой белый квадрат 32x32 пикселей. Значок по умолчанию всегда загружается в памяти и может быть снова установлен путем передачи tray_manager.Values.DEFAULT в качестве name аргумента функции .set_icon() .
Чтобы загрузить значок, используйте функцию .load_icon() и пропустите его путь файла, кодированное изображение, объект PIL.Image или любой файл, который можно прочитать и интерпретировать как изображение PIL . Вам также необходимо передать имя, которое будет использоваться в качестве ключа в Dicknary Icons, чтобы вернуть ваш значок.
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 Используйте DictionNary для сохранения загруженных значков, это означает, что загрузка изображения с использованием уже используемого имени перезаписывает изображение, которое было ранее загружено с этим именем. Единственным исключением из этого является значок по умолчанию, который не может быть отредактирован.
Чтобы установить значок, используйте функцию .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" ) Вместо того, чтобы убивать объект tray_manager.TrayManager , когда вы хотите, чтобы он прекратил отображаться в системном лотке, и создание нового, когда вам это снова понадобится, вы можете использовать функции .show() и .hide() для объекта tray_manager.TrayManager , чтобы контролировать, видно ли приложение в системном лопке или нет.
Примечание
Вы можете установить аргумент default_show объекта tray_manager.TrayManager на True или False при создании объекта tray_manager.TrayManager , чтобы определить, будет ли отображаться значок системного лотка или нет, как только объект будет создан.
Чтобы показать приложение в системном лотке, используйте функцию .show() объекта tray_manager.TrayManager .
from tray_manager import TrayManager
my_tray = TrayManager ( "My App" , run_in_seperate_thread = True )
my_tray . show () Чтобы скрыть приложение в системном лотке, используйте функцию .hide() объекта tray_manager.TrayManager .
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 () Чтобы сделать ваш элемент элементом по умолчанию меню / подменю и придать ему смелый вид, вы можете установить атрибут default при создании / редактировании элемента на True .
Примечание
Вы можете иметь только 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 ) Если вы хотите дать новый взгляд на свой обычный флажок Crossmark, вы можете установить атрибут use_radio_look флажона в 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 вы должны проверить, совместимы ли они с вашей ОС. Для этого используйте объект 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 (приложение) | Linux (Ayatana-Appindicator) | Linux (xorg) | MacOS (Дарвин) |
|---|---|---|---|---|---|---|
| Меню | Поддерживается | Поддерживается | Поддерживается | Поддерживается | Не поддерживается | Поддерживается |
| По умолчанию | Поддерживается | Поддерживается | Не поддерживается | Не поддерживается | Поддерживается | Не поддерживается |
| Радио | Поддерживается | Поддерживается | Поддерживается | Поддерживается | Поддерживается | Не поддерживается |
| Уведомление | В настоящее время не существует | Неизвестный | Ты известен | Неизвестный | Не поддерживается | Не поддерживается |
Если вы хотите создать уведомление на экране пользователя, вы можете использовать объект tray_manager.TrayManager.notification .
Чтобы создать уведомление, используйте функцию .notify() tray_manager.TrayManager.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 !" ) Вы можете remove_after_s задержку .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 !" , 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 ()Осторожность
По умолчанию уведомление никогда не закроется сами по себе, обязательно закройте его, прежде чем создать новое.
Если вам нужны конкретные функции, вы можете установить backend аргумент объекта tray_manager.TrayManager на один из значений tray_manager.Backends .
Примечание
По умолчанию Pyray будет использовать лучшую бэкэнд на вашей ОС.
Осторожность
Вы должны использовать бэкэнд из класса tray_manager.Backends , передавая значение одного из объектов класса, вынесет ошибку.
Вы также должны использовать бэкэнд, совместимую с вами ОС.
| ОС | Бэкэнды |
|---|---|
| Окна | win32 |
| MacOS | darwin |
| Linux | gtk , appindicator , ayatana-appindicator , xorg |