42

システムトレイにPythonでアイコンを簡単に配置する方法の簡単な例が必要です。つまり、プログラムを実行しても、ウィンドウは表示されず、システム トレイにトレイ アイコン (png ファイルがあります) だけが表示され、それを右クリックすると、いくつかのオプションを含むメニューが表示されます (クリックすると、オプションでは、関数が実行されます)。それは可能ですか?窓が全然いらない…

例/コードスニペットは本当に感謝しています! :D

4

9 に答える 9

62

Windows と Gnome の場合

どうぞ!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()
于 2011-06-17T17:50:37.313 に答える
15

wx.PySimpleApp は廃止されました。代わりに wx.App を使用する方法は次のとおりです

これを理解するのに時間がかかったので、共有したいと思いました。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()
于 2015-10-11T19:54:09.567 に答える
6

ウィンドウを保証でき、wxの大きな依存関係を導入したくない場合は、pywin32拡張機能を使用してこれを行うことができます。

この質問も参照してください。

于 2011-06-17T19:58:14.880 に答える
2

Python ベースのプログラムをバックグラウンドで実行しようとしている場合の代替手段として、サービスとして実行できます。このアクティブな状態のレシピを確認してください。非常に便利です。オプションの 1 つは、py2exe または pyinstall を使用してアプリケーションを exe に変換することだと思います。

http://code.activestate.com/recipes/551780/

于 2013-11-14T17:13:23.957 に答える
2

はい。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 には小さな改造が必要です。

  • wx.adv をインポートする必要があります
  • wx.TaskBarIcon は wx.adv.TaskBarIcon になります
  • wx.IconFromBitmap は wx.Icon になります

Gnome 3 には TopIcons Plus のインストールが必要です。

ウィンドウを表示したくないので (「ウィンドウが表示されず、トレイ アイコンだけが表示されます」)、次の行をコメント アウトするだけです (ただし、wx.Frame の親はそのままにしておきます)。

frame.Show(True)

また、独自の .png アイコンを使用したいので、WXPdemo 画像と embeddedimage を削除して、

icon = self.MakeIcon(WXPdemo.GetImage())

たとえば、

icon = wx.Icon('icon.png')

私の経験では、これはさらに適応または拡張するための良い出発点となります。

于 2018-03-15T19:26:41.047 に答える