wxPythonでGUIアプリを作る イベント処理

メニューを選択したときのイベント処理を実装してみましょう・

イベント処理

import wx
class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(200,100))

        filemenu= wx.Menu()
        menuExit = filemenu.Append(wx.ID_EXIT, "&Exit","exit")
        #メニュー・イベント・イベントハンドラをリンクさせる
        self.Bind(wx.EVT_MENU, self.OnExit, menuExit)

        menuBar = wx.MenuBar()
        menuBar.Append(filemenu,"&File") 

        self.SetMenuBar(menuBar) 
    
        self.Show(True)
    #Exitメニュー選択時に行う処理
    def OnExit(self, event):
        self.Close()
            
app = wx.App(False)
frame = MyFrame(None, 'myFrame')
app.MainLoop()

各種イベントはwx.Eventクラスを継承したサブクラスとして定義されています。例えばメニューが選択された場合のイベントはwx.EVT_MENUです。メニューとメニューイベント、イベントを受け取った時に呼ばれる関数をそれぞれ結びつけるにはwx.FrameのBindメソッドを利用します。このとき引数にはイベント、イベント処理メソッド、選択するメニューアイテムを指定します。

self.Bind(wx.EVT_MENU, self.OnExit, menuExit)    

イベントは他にも様々なものが予め用意されています。利用できるイベントの一覧はこちらから確認できます。
ListOfEvents - wxPyWiki

ダイアログを表示させる例

メニューを押してダイアログを表示させる例です。
Openメニューでファイル選択ダイアログが、Exitメニューでメッセージボックスが表示されます。

import wx
class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(200,100))

        filemenu= wx.Menu()
        menuOpen = filemenu.Append(wx.ID_OPEN, "&Open","open project")
        menuExit = filemenu.Append(wx.ID_EXIT, "&Exit","exit project")       
      
        self.Bind(wx.EVT_MENU, self.OnOpen, menuOpen)      
        self.Bind(wx.EVT_MENU, self.OnExit, menuExit)   

        menuBar = wx.MenuBar()
        menuBar.Append(filemenu,"&File") 
        self.SetMenuBar(menuBar) 
    
        self.Show(True)
    def OnOpen(self, e):
        self.dirName = ''
        #ファイル選択ダイアログの表示
        dialog = wx.FileDialog(self, "Choose a file", self.dirName, "", "*.*", wx.OPEN)
        #OKボタンが押されるまで表示
        if dialog.ShowModal() == wx.ID_OK:
            self.fileName = dialog.GetFilename()
            self.dirName = dialog.GetDirectory()
            file = open(os.path.join(self.dirName, self.fileName), 'r')
            #ファイルデータ読み込み
            file.close()
        #ダイアログの破棄
        dialog.Destroy()
    def OnExit(self, e):
        #メッセージダイアログの表示
        dialog = wx.MessageDialog( self, "exit?", "Messege title", wx.OK)
        dialog.ShowModal()
        dialog.Destroy()
        self.Close()

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