タスクトレイに常駐するアプリケーション

タスクトレイに常駐するアプリケーションを作るには、 wxTaskBarIcon を利用します。wx.TaskBarIcon のインスタンスを作っておいて SetIcon(icon, tooltip) でアイコンとマウスカーソルがアイコン上に乗ったときに表示するテキストを指定するとタスクトレイにアイコンが表示されます。

#coding: utf-8
import wx

# アイコンをロードする前にアプリケーションのインスタンスを作成しておく
app=wx.App(False)
# wx.BITMAP_TYPE_ICO でウィンドウズのアイコンファイルをロードする
ico=wx.Icon(fname, wx.BITMAP_TYPE_ICO)
tbi=wx.TaskBarIcon()
# タスクトレイにアイコンを表示
tbi.SetIcon(ico, 'tool tip text')

frm=wx.Frame(None)
app.SetTopWindow(frm)
frm.Show(True)
app.MainLoop()

とりあえずこれで目的は果たせるのですが、このまま実行してしまうとまずいことになります。まず、ウィンドウを閉じてもアプリケーションが終了しません(Ctrl+C で強制終了させます)。そして強制終了した後もタスクトレイにアイコンが残り続けます(このアイコンはマウスカーソルを重ねると消えます)。それから、タスクトレイに常駐するアプリケーションでは、タスクバーの方には表示して欲しくありません。

これらの問題点を解決したのが次のスクリプトです。

#coding: utf-8
import sys
import wx
import resource

class Frame(resource.xrcMainFrame):
    def __init__(self, parent=None):
        resource.xrcMainFrame.__init__(self, parent)
        # アイコンロード
        ico=wx.Icon("data/onigiri.ico", wx.BITMAP_TYPE_ICO)
        self.ico=ico
        # タスクトレイに入れるアイコン
        tb_ico=wx.TaskBarIcon()
        tb_ico.SetIcon(ico, u"tips comment")
        self.tb_ico=tb_ico
        # タスクトレイアイコンのイベント関連付け
        tb_ico.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, self.OnTbiLeftDoubleClicked)
        tb_ico.Bind(wx.EVT_TASKBAR_RIGHT_DCLICK, self.OnTbiRightDoubleClicked)
    def OnTbiLeftDoubleClicked(self, evt):
        frm=wx.Frame(self, -1, "sub window")
        frm.SetIcon(self.ico)
        frm.Show(True)
    def OnTbiRightDoubleClicked(self, evt):
        self.tb_ico.RemoveIcon()
        sys.exit(0)

def main():
    app=wx.App(False)
    frm=Frame()
    app.SetTopWindow(frm)
    app.MainLoop()

if __name__=='__main__':
    main()

XRCed で作成したリソースを利用しています(resource モジュール)。 xrcMainFrame には XRCed 上でスタイルを設定してあります。 Style の FRAME_NO_TASKBAR にチェックを入れることでこのウィンドウはタスクバーに表示されなくなります。

タスクトレイアイコンには、マウスの右ボタンと左ボタンのダブルクリックに対するイベントハンドラをバインドしています。イベントハンドラメソッドはメインフレーム側で用意しています。左ボタンをダブルクリックしたときは子ウィンドウを作って、アイコンを設定してから表示します。右ボタンをダブルクリックしたときはタスクトレイからアイコンを消去してアプリケーションを終了しています。

そして、アプリケーションの起動時にトップレベルのウィンドウを表示していません。アプリケーションが起動するとタスクトレイにアイコンだけが表示されます。

ちなみにアイコンのサイズは 16×16 で、作成にはEDGEを利用させていただきました。