教えていただいたコードの解読(2)
次にMyTaskbarクラスを定義。
アプリケーションを終了させるために、タスクトレイにアイコンを表示させておき右クリックで終了メニューを選べるようにする。wxTaskBarIconを使う。
そのための準備。
class MyTaskbar(wx.TaskBarIcon): # タスクトレイにアイコンを表示する def __init__(self, parent): wx.TaskBarIcon.__init__(self) self.parent = parent '''override TaskBarIcon (create menu each time)''' def CreatePopupMenu(self): # アイコン上で右クリックしたときにポップアップメニューを表示する return self.parent.GetPopupMenu()
ここを読んで初めて止め方を理解した。最初に動かしたとき、止め方がわからず焦った。
こんな感じで表示できるようになる。
次にメインの部分。
class MyApp(wx.App): def __init__(self): wx.App.__init__(self) self.w = GetSystemMetrics(SM_CXFULLSCREEN) # 最大化されたウィンドウのサイズ(たぶんx方向) self.h = GetSystemMetrics(SM_CYCAPTION) # タイトルバーの高さ self.lt = (0, GetSystemMetrics(SM_CYFULLSCREEN)) # SM_CXFULLSCREENと意味は同じ(たぶんy方向) self.msg = u'テスト日本語漢字てすと' self.frm = wx.Frame(None, -1, 'Message Board', pos=self.lt, size=(self.w, self.h), style=wx.BORDER_NONE | wx.STAY_ON_TOP | wx.FRAME_NO_TASKBAR) # 境界なし、常に上に表示、フレームにタスクバーなし(たぶん) self.frm.SetBackgroundColour(TRANSPARENT_COLOR) self.pnl = wx.Panel(self.frm, -1, size=(self.w, self.h)) self.frm.Show() self.tasktray = MyTaskbar(self) # インスタンスオブジェクト self.tasktray.SetIcon( # アイコンをセットする wx.ArtProvider_GetIcon(wx.ART_TIP, size=(16, 16)), self.msg) #画像はART_TIPにする # アイコンにマウスを近づけるとself.msgの内容が表示される hwnd = self.frm.GetHandle() # ウィンドウハンドルを得る(たぶん) gwl = GetWindowLong(hwnd, GWL_EXSTYLE) # 拡張ウィンドウハンドルを取得したい SetWindowLong(hwnd, GWL_EXSTYLE, (gwl | WS_EX_LAYERED | WS_EX_TRANSPARENT)) # ウィンドウの属性変更(gwlを変更する) c = wx.NamedColour(TRANSPARENT_COLOR) # 名前が付いた色を使う? crkey = (c.Red() << 16) | (c.Green() << 8) | c.Blue() alpha = int(ALPHA_RATIO * 255) flags = (LWA_ALPHA | LWA_COLORKEY) SetLayeredWindowAttributes(hwnd, crkey, alpha, flags) # ウィンドウの色を調整 self.l = self.w self.tid = wx.NewId() self.t = wx.Timer(self.frm, self.tid) self.Bind(wx.EVT_TIMER, self.OnTimer, id=self.tid) self.t.Start(int(1000 / FRAME_RATE))
残りの部分は大体わかる。
def OnTimer(self, event): self.l -= VELOCITY # comment self.pnl.DestroyChildren() self.txt = wx.StaticText(self.pnl, -1, u'%s %s' % (self.msg, time.strftime('%Y-%m-%d %H:%M:%S')), pos=(self.l, OFFSETY)) self.txt.SetBackgroundColour(TRANSPARENT_COLOR) self.txt.SetForegroundColour(TEXT_COLOR) if self.l <= -self.txt.GetSize().GetWidth(): self.l = self.w def OnQuit(self, event): self.tasktray.Destroy() self.t.Stop() self.Exit() def GetPopupMenu(self): menu = wx.Menu() id = wx.NewId() item = wx.MenuItem(menu, id=id, text=u'&Quit') self.Bind(wx.EVT_MENU, self.OnQuit, id=id) menu.AppendItem(item) return menu app = MyApp() app.MainLoop()