WxPython Notes (2) --- Set Icon

WxPython Notes (2) --- Set Icon

一、代码获取

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

svn -r 3 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)
        

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()

encode_bitmaps.py

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

import sys

from wx.tools import img2py

command_lines = [
    "-u -i -n Maxima bmp_source/maxima-icon.ico images.py"
]

if __name__ == "__main__":
    for line in command_lines:
        args = line.split()
        img2py.main(args)

二、img2py

wxPython-tools 模块提供了一系列有用的工具,其中之一为 img2py。它可以作为单独的 shell 命令使用,也可以在 python import 进来使用。其作用为把一个图形文件转换成 python 源代码,原来的图形转换成 python 中的一个数据结构(比如打开的图形文件)。

例如,在 shell 中执行

img2py bitmaps/splash.png img.py

则 splash.png 被嵌入到 img.py 中,而且还提供了若干个读取图片的接口,import img 后可用。

如果需要处理的文件很多,手工逐个逐个地处理会很麻烦。所以 wx2.8-example 写了一个 encode_bitmaps.py 用作批处理。把需要处理的图的路径都写入这个文件,然后一次进行转换。

在我的代码中,照葫芦画葫芦地写了一个 encode_bitmaps.py,执行后产生一个 images.py 文件。目前只嵌入了一个 maxima-icon.ico,从主文件 demo.py 中 import images 后可用。
三、 demo.py

本节的主题为设置程序的图标。

InfoMathDemo 类

在版本 2 中,窗体是通过 wx.Frame(None) 直接创建的。但在此版本中,建立了一个类: InfoMathDemo。它是从 wx.Frame. 继承得来的。

在  InfoMathDemo 的初始化函数中,设置了窗口的大小,并通过以下两句设置了窗口的图标。

[Copy to clipboard] [ - ]
CODE:
        icon=images.getMaximaIcon();
        self.SetIcon(icon)

getMaximaIcon 是 encode_bitmaps.py 生成 images.py 时创建的接口。

现在运行 demo.py, 显示窗口的图标应该是 maxima 的图标,而按 ctrl+tab 在在各个任务间转换时,显示的也是 maxiam 的图标。
好。