wxPythonでGUIアプリを作る フレーム&メニュー

参考サイトGetting Started - wxPyWiki
wxPythonは、マルチプラットフォームGUIアプリを比較的簡単に作成することができるモジュールです。wxPythonの使い方について簡単にまとめてみます。

まずはフレームを単に表示するプログラム。

import wx

app = wx.App(False)  #アプリケーションを作成する
frame = wx.Frame(None, wx.ID_ANY, "Hello World") #フレームを作成する
frame.Show(True)     #フレーム表示
app.MainLoop()

frameのクラス化

wx.Frameクラスを継承させたMyFrameクラスを作成して、上と同じ処理を行います。

import wx
class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(200,100))
        #ここにGUIコントロールを追加する処理
        self.Show(True)

app = wx.App(False)
frame = MyFrame(None, 'myFrame')
app.MainLoop()

ステータスバーの追加

初期化子__init__()内で、CreateStatusBarを呼び出すとステータスバーを追加することができます。

self.CreateStatusBar()

メニューの追加

初めにwx.Menuクラスを使ってメニューを作成します。このクラスをインスタンス化して、Appendメソッドで新たな選択項目を追加することができます。引数には、イベント(の識別子)、メニュー名、メニュー選択でステータスバーに表示される文字列を設定します。また、メニューの区切りはAppendSeparatorメソッドを利用します。
ここでは試しにファイルと編集メニューを作成してみましょう。

#ファイルメニュー
filemenu= wx.Menu()
filemenu.Append(wx.ID_NEW, "&New","create new project")
filemenu.Append(wx.ID_OPEN, "&Open","open project")
filemenu.AppendSeparator()     #メニューの区切り線
#編集メニュー
editmenu= wx.Menu()     
editmenu.Append(wx.ID_CUT, "&Cut","cut strings")
editmenu.Append(wx.ID_COPY, "&Copy","copy strings")       

次にwx.MenuBarを使ってメニューバーを作ります。先ほど作成したメニューをwx.MenuBarクラスのインスタンスに順次追加していきます。
このAppendメソッドの2番目の引数には、メニューバーの名前を指定します。
先ほど作成したとファイル・編集メニューを追加してみましょう。

#メニューバーを作成
menuBar = wx.MenuBar()
#ファイルメニューを登録
menuBar.Append(filemenu,"&File") # Adding the "filemenu" to the MenuBar
#編集メニューを登録
menuBar.Append(editmenu,"&Edit") # Adding the "filemenu" to the MenuBar
self.SetMenuBar(menuBar)

最後に、作成したメニューバーをMyFrameに登録します。登録するにはSetMenuBarメソッドを呼び出します。

self.SetMenuBar(menuBar)

ここまでで作成したソースコードは次のようになりました。あとは実行させてみると、フレームとメニューが確かに作成されていることが確認できると思います。

import wx
class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(200,100))
        #ステータスバーの追加
        self.CreateStatusBar() 
        #ファイルメニューの作成
        filemenu= wx.Menu()
        filemenu.Append(wx.ID_OPEN, "&Open","open project")
        filemenu.AppendSeparator()        
        filemenu.Append(wx.ID_CLOSE, "&Close","close project")
        #編集メニューの作成
        editmenu= wx.Menu()        
        editmenu.Append(wx.ID_CUT, "&Cut","cut strings")
        editmenu.Append(wx.ID_COPY, "&Copy","copy strings")       
        #メニューバーの作成
        menuBar = wx.MenuBar()
        menuBar.Append(filemenu,"&File") 
        menuBar.Append(editmenu,"&Edit") 
        #メニューバーの登録
        self.SetMenuBar(menuBar) 
        
        self.Show(True)

app = wx.App(False)
frame = MyFrame(None, 'myFrame')
app.MainLoop()