ボタンに画像を貼る練習

GUIのボタンを作る場合、いつもボタン上に文字を表示するだけでは味気ないので、絵を表示したボタンを作ることにする。その練習。
いつもながら、wxPython Indexを参考にさせていただく。
今回は以下の節の内容を組み合わせる。
5.3.3 ビットマップボタン(wxBitmapButton)
15.1 wxArtProvider
10.2 ツールチップ

簡単なスクリプトで、実行結果が以下の絵のようになるものがある(昔作ったものの一部)。

これを、

  • ボタン上に文字でなく絵を表示する
  • ボタンにポインタを置くとツールチップが表れる

ようにする。
以下、ボタンの表示を修正したソースコード

import wx

class MyApp(wx.PySimpleApp):
    def OnInit(self):
        width, height = 250, 150
        self.Frm = wx.Frame(None, -1, "wxPython", size=wx.Size(width, height))
        VSizer = wx.BoxSizer(wx.VERTICAL)
        
        self.TxtCtl1 = wx.TextCtrl(self.Frm, -1, "", size=(235,-1),
                                   style=wx.TE_RIGHT)
#normal button        self.Btn = wx.Button(self.Frm, -1, "check")
    # new button (start)
        btnBmap = wx.ArtProvider.GetBitmap(wx.ART_FIND)
        self.Btn = wx.BitmapButton(self.Frm, -1, btnBmap, size=(25,25))
        self.Btn.SetToolTip(wx.ToolTip("Check"))
        # new button (end)
        self.Btn.Bind(wx.EVT_BUTTON, self.Decision)   
     
        VSizer.Add(self.TxtCtl1, 0, wx.ALL, 2)        
        VSizer.Add(self.Btn, 0, wx.ALL, 2)
        self.Frm.SetSizer(VSizer)
        self.Frm.Show()
        return True
        
    def Decision(self, event):
        print "pushed !"
        
app = MyApp()
app.MainLoop()

これを実行すると下の絵の通りになる。

ArtProviderの画像を使う代わりに、PNGファイルを貼り付けることもできる。一行変えるだけ。画像の大きさは事前に適当なものにしておく。貼り付けるときに変えようとしてもうまくいかなかった。

import wx

class MyApp(wx.PySimpleApp):
    def OnInit(self):
        width, height = 250, 150
        self.Frm = wx.Frame(None, -1, "wxPython", size=wx.Size(width, height))
        VSizer = wx.BoxSizer(wx.VERTICAL)
        
        self.TxtCtl1 = wx.TextCtrl(self.Frm, -1, "", size=(235,-1),
                                   style=wx.TE_RIGHT)
        btnBmap = wx.Bitmap('searchfile.png')
        self.Btn = wx.BitmapButton(self.Frm, -1, btnBmap)
        self.Btn.SetToolTip(wx.ToolTip("Check"))
        self.Btn.Bind(wx.EVT_BUTTON, self.Decision)        
        VSizer.Add(self.TxtCtl1, 0, wx.ALL, 2)        
        VSizer.Add(self.Btn, 0, wx.ALL, 2)
        self.Frm.SetSizer(VSizer)
        self.Frm.Show()
        return True
        
    def Decision(self, event):
        print "pushed !"
        
app = MyApp()
app.MainLoop()

実行結果。