wxPythonにてメニューバーを弄ってみたい坊っちゃま

参考URL:wxPythonチュートリアル

まあ基本的にこのチュートリアルが大変素晴らしいものなので、こんなとこを参照するよりはよほど情報量が多いことでしょう。

さて、こっちは本題へと移ります。
実際に様々な情報を糧に、色々と試してみた結果ということで、今回のメモ。

動作検証環境:BSD

今回は、以下の内容の検証に的を絞りました。

  • 第一に、メニューバーのカスタマイズの方法。
  • メニューバーに登録したイベントのショートカットキーの登録法。
  • メニューの作り方と、その登録法。

ソースコード

早速、ソースコードから。

#!/usr/bin/env python
#coding: utf-8
import wx

class TestFrame(wx.Frame):
    def __init__(self,parent,id,title):
        wx.Frame.__init__(self,parent,title=title,size=(320,240))

        # Setting up the menu on menubar.
        FileMenu = wx.Menu()

        # It is easy technique + alpha.
        menuAbout = FileMenu.Append(wx.ID_ABOUT,"&About\tCtrl+A"," Informations")
        # "wx.MenuItem" are made by oneself.
        menuItemMsg = wx.Menu()
        menuItemMsg = wx.MenuItem(FileMenu, 1, '&Message\tCtrl+M')
        menuItemMsg.SetBitmap(wx.Bitmap('fox.png'))
        FileMenu.AppendItem(menuItemMsg)
        # It is easily technique.
        menuExit = FileMenu.Append(wx.ID_EXIT,"E&xit"," Exit program")

        # Creating menu bar.
        MenuBar = wx.MenuBar()
        MenuBar.Append(FileMenu,"&File")
        self.SetMenuBar(MenuBar)

        # Set Events.
        self.Bind(wx.EVT_MENU,self.OnAbout,menuAbout)
        self.Bind(wx.EVT_MENU,self.OnMsg,menuItemMsg)
        self.Bind(wx.EVT_MENU,self.OnExit,menuExit)

        # Show window.
        self.Show(True)

    def OnAbout(self,e):
        # create message dialog.
        dlg=wx.MessageDialog(self,"This is the test code.","Dialog Title.",wx.OK)
        # Show dialog.
        dlg.ShowModal()
        # Finally destroy it when finished.
        dlg.Destroy()

    # Copy from onAbout().
    def OnMsg(self,e):
        # create message dialog.
        dlg=wx.MessageDialog(self,"This is the test code.","Dialog Title.",wx.OK)
        # Show dialog.
        dlg.ShowModal()
        # Finally destroy it when finished.
        dlg.Destroy()

    def OnExit(self,e):
        # Exit the frame.
        self.Close(True)

class MyApp(wx.App):
    def OnInit(self):
        frame=TestFrame(None,wx.ID_ANY,"Menubar Test")
        self.SetTopWindow(frame)
        return True

app=MyApp(0)
app.MainLoop()

簡易メモ:

ええと、詳細は偉い人たちに丸投げするとして、簡便に、簡潔に、まとめて置こうと思います。

まず、これを実行すると、メニューバーに「File」ボタンが1つあるだけのウィンドウが生成されます。
この「File」ボタンをクリックすると、「About」、「Message」、「Exit」の3つのメニューが展開されます。この関係をツリー構造で表すと、

[File]
  |---[About]
  |---[Message]
  ----[Exit]

こんな感じです。

結果:

この検証結果と言うか、プログラムを書いている間に気になったことのリストアップ。

  1. '&About\tCtrl+A'で、簡単にキーバインドを登録できる。
  2. wx.ID_EXITなどの中には、既にキーバインドが登録されているものもある。(wx.ID_EXITならCtrl-Q)
  3. menuItemMsg.SetBitmapでは、メニューにアイコンを設定しているが、これは元画像の大きさがそのまま反映されてしまうので、あらかじめ24x24くらいに画像を縮小しておいた方が良い。