tray_manager 、Pystray(https://github.com/moses-palmer/pystray by MosesPalmér)に基づいたシステムトレイアイコンの作成に使用されるパッケージです。
tray_managerはpypi(https://pypi.org/project/tray-manager/)のpublisehdであり、端末の次のコマンドを使用してダウンロードできます。
pip install tray-manager注記
コンピューターにPythonをインストールする必要があります
Librairyの主なオブジェクトはtray_manager.TrayManagerオブジェクトです。これは中心的な要素であり、システムトレイ自体のアイコンと見なすことができ、アプリのすべての要素が含まれています。
1つを作成するには、 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 ]重要
あなたが殺したメニューとトレイマネージャーのオブジェクトは役に立たなくなります
警告
tray_manager.TrayManagerオブジェクトの作成は、作成されるとすぐに内側ループを実行します。これはtray_manager.TrayManagerオブジェクトを作成すると、残りのコードがブロックされることを意味します。それが起こらないようにするには、2つのオプションがあります。
tray_manager.TrayManagerオブジェクトのsetup引数として関数を指定できます。この関数は、オブジェクトを作成するときに新しいスレッドで開始されます。
(Windowsのみ) Windowsにいる場合、他のプラットフォームとの互換性について心配しない場合、 tray_manager.TrayManagerオブジェクトのrun_in_separate_thread引数tray_manager Trueに設定できます。
アイテムはアプリの要素であり、追加されたメニューに表示されます。それらは、すべて同様の方法で機能するが、それぞれにいくつかの特異性があるさまざまな種類のアイテムです。
これがすべてのアイテムのリストです。
ラベルは最も基本的なアイテムであり、テキストでのみ構成されています。
1つを作成するには、次のようにtray_manager.Labelクラスを使用します。
from tray_manager import Label
my_label = Label ( "My Label" )ボタンはラベルアイテムのようなものですが、ユーザーがボタンをクリックすると呼び出されるコールバック引数(functionType)を追加できます。また、ボタンがクリックされたときに関数に渡されるタプルとしていくつかの引数を指定することもできます。
1つを作成するには、次のように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" ,))チェックボックス項目は通常のボタンよりも少し複雑で、1つではなく2つの異なるコールバックがあり、1つは「無効」から「有効」状態(チェックされている」状態(チェックされていない)から「有効化」状態から「無効」状態(チェックされないチェックされないようにチェックされます)に切り替えるときの2つの異なる引数があります。
check_defaultの値をNoneに設定することにより、チェックボックスとの対話を「無効」できます。
注記
ユーザーが無効になったときにチェックボックスをクリックしても、コールバックは実行されません。
1つを作成するには、次のように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の組み込みオブジェクトであり、パラメーターはありません。
1つを作成するには、次のようにtray_manager.Separatorクラスを使用します。
from tray_manager import Separator
my_separator = Separator ()サブメニューはtray_manager.Menuオブジェクトのようなもので、他のサブメニューを含む他のアイテムを含めることができます。
注意
サブメニューをサブメニューに追加するサブメニューにサブメニューを追加するとき、お互いにサブメニューを追加するときは、 tray_manager.CircularAddExceptionエラーが生成されます。
フローチャートTD
a {my submenu} - > b(私のレーベル)
a-> c(私のボタン)
a-> d {私の2番目のサブメニュー}
d-> e(私の2番目のラベル)
d-> f(私のチェックボックス)
d-> | tray_manager.circularaddexception | a
1つを作成するには、次のように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はこのライブラリの中心的な要素の1つであり、サブメニューのように機能し、 tray_manager.TrayManagerオブジェクトとしてtray_manager.TrayManager.menuオブジェクトを作成すると自動的に作成され、削除できません。
警告
OSでの控えめについてtray_manager.OsSupport.HAS_MENUを確認してください。OSがメニューをサポートしていない場合、 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の画像として読み取って解釈できるファイルを渡します。また、アイコンを再生するためにアイコンDictionNaryのキーとして使用される名前を渡す必要があります。
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オブジェクトを殺す代わりに、システムトレイに表示され、新しいものの作成を停止し、再度必要な場合は、 tray_manager.TrayManagerオブジェクトの.show()および.hide()関数を使用して、システムトレイでアプリが表示されるかどうかを制御できます。
注記
tray_manager.TrayManagerオブジェクトを作成するときに、 tray_manager.TrayManagerオブジェクトのdefault_show引数をTrueまたはFalseに設定して、オブジェクトが作成されたらシステムトレイアイコンが表示されるかどうかを定義できます。
システムトレイにアプリを表示するには、次のように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属性を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が機能をサポートするかどうかを知るには、対応するOs_Support変数が真でなければなりません。
たとえば、OSがメニューをサポートしているかどうかを確認するには、次のように実行します。
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とバックエンドでサポートされていないと想定されており、想定されている機能のチャートです。
| 機能 OSとバックエンド | Windows(win32) | Linux(GTK) | Linux(Appindicator) | Linux(ayatana-appindicator) | Linux(xorg) | macos(ダーウィン) |
|---|---|---|---|---|---|---|
| メニュー | サポート | サポート | サポート | サポート | サポートされていません | サポート |
| デフォルト | サポート | サポート | サポートされていません | サポートされていません | サポート | サポートされていません |
| 無線 | サポート | サポート | サポート | サポート | サポート | サポートされていません |
| 通知 | 現在は無効です | 未知 | あなたは知られています | 未知 | サポートされていません | サポートされていません |
ユーザーの画面に通知を作成する場合は、 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 !" )遅延を指定してから、次のように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 ()注意
デフォルトでは、通知がそれ自体を閉じることはありません。新しいものを作成する前に、必ず閉じてください。
特定の機能が必要な場合は、 tray_manager.TrayManagerオブジェクトのbackend引数をtray_manager.Backends値の1つに設定できます。
注記
デフォルトでは、PystrayはOSで最適なバックエンドAvaibleを使用します。
注意
tray_manager.Backendsクラスのバックエンドを使用する必要があります。クラスのオブジェクトの1つの値を渡すと、エラーが発生します。
また、OSと互換性のあるバックエンドを使用する必要があります。
| OS | バックエンド |
|---|---|
| Windows | win32 |
| macos | darwin |
| Linux | gtk 、 appindicator 、 ayatana-appindicator 、 xorg |