あいさつ
つかさです。今回はタスクトレイアイコンの表示。
タスクトレイアイコンを
- 右クリックでメニューを表示
- 左ダブルクリックで表示、非表示のトグル
できるようにします。
以下のコードを保存。同じフォルダに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")
- タスクトレイアイコンのインスタンスを作成
- タスクトレイアイコンをクリックした時のイベントをセット
- アイコン画像をセット
というようにしてます。
左ダブルクリック
# タスクトレイ左ダブルクリック 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)
クリックした時のメニューは
- メニューインスタンスを作成
- そこに表示項目を追加し
- それに対応するイベントをセット
のように作成。このようにして作ったメニューを
# タスクトレイ右クリック def OnTbiRightUp(self, evt): self.tb_ico.PopupMenu(self.menu)
で登録してます。
0 件のコメント:
コメントを投稿