wxPythonでアプリケーションアイコンを設定したい気がしないでもない

という訳で。
これから、素人なりに調べた結果のメモ。方法は全3種。

動作確認環境:

Windows:Windows7(64bit),Python2.7(64bit),wxPython2.8-unicode
Ubuntu:Ubuntu10.04(64bit),Python2.6.5,wxPython2.8-unicode
FreeBSD:FreeBSD 8.1(64bit),Python2.6.5,wxPython2.8-unicode

方法その1:PNGファイルをアイコンとして使う:

import wx

class MyApp(wx.App):
    def OnInit(self):
        frame = wx.Frame(None,-1,u"This is the title.")
        icon=wx.EmptyIcon()
        # BITMAP_TYPE_JPEGにすれば、JPEGも読めるんだなあ
        icon_source=wx.Image('fox.png',wx.BITMAP_TYPE_PNG)
        icon.CopyFromBitmap(icon_source.ConvertToBitmap())
        frame.SetIcon(icon)
        frame.Show(True)
        self.SetTopWindow(frame)
        return True

app = MyApp(0)
app.MainLoop()

動作確認済:Ubuntu,FreeBSD

方法その2:img2pyを使う:

まず、

% img2py -ni myicon.jpeg myicon.py

ってすれば、myicon.pyってファイルが出力される。その中身はと言うと、

#----------------------------------------------------------------------
# This file was generated by /usr/bin/img2py
#
from wx.lib.embeddedimage import PyEmbeddedImage

i = PyEmbeddedImage(
    "何かすげー英数字の羅列がばーっと。フォーマットはPNG")
getiData = i.GetData
getiImage = i.GetImage
getiBitmap = i.GetBitmap

って感じ。ここまで準備したら、

import wx
import myicon

class MyApp(wx.App):
    def OnInit(self):
        frame = wx.Frame(None,-1,u"This is the title.")
        icon=wx.EmptyIcon()
        icon.CopyFromBitmap(myicon.getiBitmap())
        frame.SetIcon(icon)
        frame.Show(True)
        self.SetTopWindow(frame)
        return True

app = MyApp(0)
app.MainLoop()

ってすれば、アイコン設定できる。ただし、当方での環境では正常に動作したのはUbuntuFreeBSDのみ。

方法その3:icoファイルを準備する:

恐らく、一番単純と思われる方法。たとえば、myicon.icoというMicrosoft Windows アイコンファイルがあったとしよう。

import wx

class MyApp(wx.App):
    def OnInit(self):
        frame = wx.Frame(None,-1,u"This is the title")
        icon=wx.Icon('myicon.ico',wx.BITMAP_TYPE_ICO)
        frame.SetIcon(icon)
        frame.Show(True)
        self.SetTopWindow(frame)
        return True

app = MyApp(0)
app.MainLoop()

こりだけ。ひとまず、これはWindowsUbuntuBSDのどれでも大丈夫だった。

結果:

Windowsも視野に入れるなら、素直にicoファイルを準備した方が楽っぽい。