システムトレイにPythonでアイコンを簡単に配置する方法の簡単な例が必要です。つまり、プログラムを実行しても、ウィンドウは表示されず、システム トレイにトレイ アイコン (png ファイルがあります) だけが表示され、それを右クリックすると、いくつかのオプションを含むメニューが表示されます (クリックすると、オプションでは、関数が実行されます)。それは可能ですか?窓が全然いらない…
例/コードスニペットは本当に感謝しています! :D
どうぞ!wxPython は爆弾です。私のフィード通知アプリケーションのソースから適応。
import wx
TRAY_TOOLTIP = 'System Tray Demo'
TRAY_ICON = 'icon.png'
def create_menu_item(menu, label, func):
item = wx.MenuItem(menu, -1, label)
menu.Bind(wx.EVT_MENU, func, id=item.GetId())
menu.AppendItem(item)
return item
class TaskBarIcon(wx.TaskBarIcon):
def __init__(self):
super(TaskBarIcon, self).__init__()
self.set_icon(TRAY_ICON)
self.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.on_left_down)
def CreatePopupMenu(self):
menu = wx.Menu()
create_menu_item(menu, 'Say Hello', self.on_hello)
menu.AppendSeparator()
create_menu_item(menu, 'Exit', self.on_exit)
return menu
def set_icon(self, path):
icon = wx.IconFromBitmap(wx.Bitmap(path))
self.SetIcon(icon, TRAY_TOOLTIP)
def on_left_down(self, event):
print 'Tray icon was left-clicked.'
def on_hello(self, event):
print 'Hello, world!'
def on_exit(self, event):
wx.CallAfter(self.Destroy)
def main():
app = wx.PySimpleApp()
TaskBarIcon()
app.MainLoop()
if __name__ == '__main__':
main()
これを理解するのに時間がかかったので、共有したいと思いました。wx.PySimpleApp は、wxPython 2.9 以降では非推奨です。代わりに wx.App を使用した FogleBird のオリジナル スクリプトを次に示します。
import wx
TRAY_TOOLTIP = 'System Tray Demo'
TRAY_ICON = 'icon.png'
def create_menu_item(menu, label, func):
item = wx.MenuItem(menu, -1, label)
menu.Bind(wx.EVT_MENU, func, id=item.GetId())
menu.AppendItem(item)
return item
class TaskBarIcon(wx.TaskBarIcon):
def __init__(self, frame):
self.frame = frame
super(TaskBarIcon, self).__init__()
self.set_icon(TRAY_ICON)
self.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.on_left_down)
def CreatePopupMenu(self):
menu = wx.Menu()
create_menu_item(menu, 'Say Hello', self.on_hello)
menu.AppendSeparator()
create_menu_item(menu, 'Exit', self.on_exit)
return menu
def set_icon(self, path):
icon = wx.IconFromBitmap(wx.Bitmap(path))
self.SetIcon(icon, TRAY_TOOLTIP)
def on_left_down(self, event):
print 'Tray icon was left-clicked.'
def on_hello(self, event):
print 'Hello, world!'
def on_exit(self, event):
wx.CallAfter(self.Destroy)
self.frame.Close()
class App(wx.App):
def OnInit(self):
frame=wx.Frame(None)
self.SetTopWindow(frame)
TaskBarIcon(frame)
return True
def main():
app = App(False)
app.MainLoop()
if __name__ == '__main__':
main()
ウィンドウを保証でき、wxの大きな依存関係を導入したくない場合は、pywin32拡張機能を使用してこれを行うことができます。
この質問も参照してください。
Python ベースのプログラムをバックグラウンドで実行しようとしている場合の代替手段として、サービスとして実行できます。このアクティブな状態のレシピを確認してください。非常に便利です。オプションの 1 つは、py2exe または pyinstall を使用してアプリケーションを exe に変換することだと思います。
はい。macOS High Sierra (10.13.3)、Windows 7、および gnome 3/centos7 で Python 2.7 (minconda インストール) でテストしたクロスプラットフォームの例が wiki.wxpython.org にあります。ここにあります (ページ タイトルは無視してください): https://wiki.wxpython.org/Custom%20Mac%20OsX%20Dock%20Bar%20Icon
Python 3.6 には小さな改造が必要です。
Gnome 3 には TopIcons Plus のインストールが必要です。
ウィンドウを表示したくないので (「ウィンドウが表示されず、トレイ アイコンだけが表示されます」)、次の行をコメント アウトするだけです (ただし、wx.Frame の親はそのままにしておきます)。
frame.Show(True)
また、独自の .png アイコンを使用したいので、WXPdemo 画像と embeddedimage を削除して、
icon = self.MakeIcon(WXPdemo.GetImage())
たとえば、
icon = wx.Icon('icon.png')
私の経験では、これはさらに適応または拡張するための良い出発点となります。