WxPython Notes (3) --- TaskBarIcon

WxPython Notes (3) --- TaskBarIcon

一、代码获取

本节使用版本 4 的代码,提取命令为:

svn -r 4 co http://wxpy-study.googlecode.com/svn/trunk/

主模块代码:

demo.py

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/env python
#coding=utf8

import wx
import images

class InfoMathDemo(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, -1, title, size = (970, 720),
                          style=wx.DEFAULT_FRAME_STYLE);
        icon=images.getMaximaIcon();
        self.SetIcon(icon)
        img=images.getMaximaImage().Scale(22,22)
        icon_tb = wx.IconFromBitmap(img.ConvertToBitmap())
        self.tbicon = wx.TaskBarIcon()
        self.tbicon.SetIcon(icon_tb, "InfoMath Demo")
        

class MySplashScreen (wx.SplashScreen):
    def __init__(self):
        bmp = wx.Image("bitmaps/splash.png").ConvertToBitmap()
        
        wx.SplashScreen.__init__(self, bmp,
                                 wx.SPLASH_CENTRE_ON_SCREEN|wx.SPLASH_TIMEOUT,
                                 2500, None, -1)
        self.Bind(wx.EVT_CLOSE, self.OnClose)
        # 过 2000 才显示主窗口
        self.fc=wx.FutureCall(2000, self.ShowMain)

    def OnClose(self, evt):
        # evt.Skip() 的含义有待研究
        evt.Skip()
        self.Hide()

        # 如果还没到 2000(比如用户用鼠标点了 splash 图,引发 splash 图关闭),
        # 则显示主窗口
        if self.fc.IsRunning():
            self.fc.Stop()
            self.ShowMain()

    def ShowMain(self):
        # 构造主窗口,并显示
        frame=InfoMathDemo(None, "InfoMathDemo")
        frame.Show()


class MyApp(wx.App):
    def OnInit(self):
        print "App init"
        self.SetAppName("InfoMath Demo")
        splash=MySplashScreen()
        return True

    def OnExit(self):
        print "Existing"
        
# 定义主函数
def main():
    app=MyApp(False)
    app.MainLoop()

# 调用主函数
main()

二、TaskBarIcon

本节主题为创建 TaskBarIcon,就是一般称为"系统托盘“的东西。

在 wx2.8-examples 中,设计了一个类 DemoTaskBarIcon,它是从标准类 wx.TaskBarIcon 继承下来的。为便于理解,在这里我们先不使用自行设计的类,直接创建 TaskBarIcon 的实例。

只要调用 TaskBarIcon 创建 tbicon,然后 self.tbicon.SetIcon(图标,信息) 就可以了。但图标要处理一下。在 Gnome 中,TaskBarIcon 图标的大小要求为 22x22,在 windowxp 中是 16x16,而在 MacOX 中是自适应的。由于 wxpython 没有为 ico 文件提供缩放功能。所以我们要把 maxima-icon.ico 当普通图读入(忽略其 ICON 特性), 然后并缩放,再转回 ico。

img=images.getMaxiamImage()
img=img.Scale(22,22)

然后转回 ico

wx.IconFromBitmap(img.ConvertToBitmap())

有一点要注意,tbicon 必须是 InfoMathDemo 的成员,其前面的 self 不可去掉,否则图标不会显示。

现在运行 demo.py,将在屏幕右下角托盘上显示一个 maxima 图标,把鼠标光标停留在图标上时,会显示一行信息 "InfoMath Demo".


由于 TaskBarIcon 类除了在托盘上显示图标外,还提供了其它功能,所以设计一个从它继承下来的类是有必要的。在版本 5  代码中,仿照 wx2.8-examples 的方法,用一个  DemoTaskBar 来封装托盘模块。版本 5 不再作单独说明。

对于怎么使用svn更感兴趣……
呵呵,下了一本wx的书正准备看。