2014年2月9日日曜日

wxPythonで常駐ランチャをつくろう!第三回 タスクトレイアイコンの表示

あいさつ


つかさです。今回はタスクトレイアイコンの表示。


タスクトレイアイコンを

  • 右クリックでメニューを表示
  • 左ダブルクリックで表示、非表示のトグル

できるようにします。

以下のコードを保存。同じフォルダにhomu.icoという名前の適当なアイコンをおいてから、実行してください。


hlnch03.py

# -*- encoding: utf-8 -*-

import wx,subprocess,os,sys,SocketServer,socket,threading

class MyTxtCtr(wx.PySimpleApp):
    
    def OnInit(self):
        HOST, PORT = socket.gethostname(), 61955
        argvs = sys.argv

        instance_name = u"%s-%s" % (self.GetAppName(), wx.GetUserId())
        self.instance = wx.SingleInstanceChecker(instance_name)
        if self.instance.IsAnotherRunning():
            if len(argvs) >= 2:
                self.client(HOST, PORT, argvs)
            wx.Exit()
        else:
            server = self.start_server(HOST, PORT)

        # タスクトレイ
        self.tb_ico=wx.TaskBarIcon()
        self.tb_ico.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, self.OnTbiLeftDClick)
        self.tb_ico.Bind(wx.EVT_TASKBAR_RIGHT_UP, self.OnTbiRightUp)
        self.ico = wx.Icon("homu.ico", wx.BITMAP_TYPE_ICO)
        self.tb_ico.SetIcon(self.ico, u"homuhomu")

        # タスクトレイ用メニューの作成
        self.menu = wx.Menu()
        self.menu.Append(1,   u"Exit(&X)")
        wx.EVT_MENU(self.menu, 1, self.OnClose)

        self.Frm = wx.Frame(None, -1, "homuLauncher", size=(400,60),pos=(400,400))
        self.TxtCtr = wx.TextCtrl(self.Frm, -1)
        self.Frm.Show()
        return 1

    def start_server(self,host, port):

        server = ThreadedTCPServer((host, port), ThreadedTCPRequestHandler)
        ip, port = server.server_address
        server_thread = threading.Thread(target=server.serve_forever)
        server_thread.setDaemon(True)
        server_thread.start()

    def client(self,ip, port, argvs):
        message = os.path.abspath(' '.join(argvs[1:]))
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.connect((ip, port))
        sock.send(message)
        response = sock.recv(1024)
#        print "Received: %s" % response
        sock.close()

    # タスクトレイ左ダブルクリック
    def OnTbiLeftDClick(self, evt):
        if self.Frm.IsShown():
            self.Frm.Show(False)
        else:
            self.Frm.Show()
            self.Frm.Raise()
            
    # タスクトレイ右クリック
    def OnTbiRightUp(self, evt):
        self.tb_ico.PopupMenu(self.menu)

    def OnClose(self, evt):
        self.tb_ico.RemoveIcon()
        wx.Exit()

class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        data = self.request.recv(1024)
        wx.GetApp().TxtCtr.SetValue(data)
        response = 'string length: %d' % len(data)
#        print 'responding to',data,'with',response
        self.request.send(response)
        
class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    pass

app = MyTxtCtr()
app.MainLoop()

解説


        self.tb_ico=wx.TaskBarIcon()
        self.tb_ico.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, self.OnTbiLeftDClick)
        self.tb_ico.Bind(wx.EVT_TASKBAR_RIGHT_UP, self.OnTbiRightUp)
        self.ico = wx.Icon("homu.ico", wx.BITMAP_TYPE_ICO)
        self.tb_ico.SetIcon(self.ico, u"homuhomu")

  1. タスクトレイアイコンのインスタンスを作成
  2. タスクトレイアイコンをクリックした時のイベントをセット
  3. アイコン画像をセット

というようにしてます。

左ダブルクリック


    # タスクトレイ左ダブルクリック
    def OnTbiLeftDClick(self, evt):
        if self.Frm.IsShown():
            self.Frm.Show(False)
        else:
            self.Frm.Show()
            self.Frm.Raise()

メインウィンドウが表示されてるかどうかを取得し、表示されていれば非表示に。非表示ならば表示にしてます。

右クリック


        # タスクトレイ用メニューの作成
        self.menu = wx.Menu()
        self.menu.Append(1,   u"Exit(&X)")
        wx.EVT_MENU(self.menu, 1, self.OnClose)

クリックした時のメニューは

  1. メニューインスタンスを作成
  2. そこに表示項目を追加し
  3. それに対応するイベントをセット

のように作成。このようにして作ったメニューを

    # タスクトレイ右クリック
    def OnTbiRightUp(self, evt):
        self.tb_ico.PopupMenu(self.menu)

で登録してます。

0 件のコメント:

コメントを投稿