GUIアプリケーションの上部に表示され、終了や保存などの様々なアクションの起点ともなるMenuBarの紹介です。本項ではMenuおよびMenuItemについても扱います。
基本的な使い方
Appendを使用してMenuを追加し、FrameのSetMenuBarにてメニューバーをセットします。
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', size=(300, 200))
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour('#AFAFAF')
menu_file = wx.Menu()
menu_edit = wx.Menu()
menu_bar = wx.MenuBar()
menu_bar.Append(menu_file, 'ファイル')
menu_bar.Append(menu_edit, '編集')
frame.SetMenuBar(menu_bar)
frame.Show()
application.MainLoop()
まだMenuItemを追加していないので、クリックしても何も表示されません。

メニューアイテムの追加
MenuクラスのAppendを使用してアイテムを追加します。引数は(識別子, タイトル)の順番です。
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', size=(300, 200))
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour('#AFAFAF')
menu_file = wx.Menu()
menu_file.Append(1, '保存')
menu_file.Append(2, '終了')
menu_edit = wx.Menu()
menu_edit.Append(3, 'コピー')
menu_edit.Append(4, '貼り付け')
menu_bar = wx.MenuBar()
menu_bar.Append(menu_file, 'ファイル')
menu_bar.Append(menu_edit, '編集')
frame.SetMenuBar(menu_bar)
frame.Show()
application.MainLoop()
メニューバーの項目をクリックすると、追加したアイテムが展開されます。

セパレータの追加
メニューにセパレータを追加するにはAppendSeparatorを利用しましょう。
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', size=(300, 200))
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour('#AFAFAF')
menu_file = wx.Menu()
menu_file.Append(1, '保存')
menu_file.Append(2, '終了')
menu_edit = wx.Menu()
menu_edit.Append(3, 'コピー')
menu_edit.AppendSeparator()
menu_edit.Append(4, '貼り付け')
menu_bar = wx.MenuBar()
menu_bar.Append(menu_file, 'ファイル')
menu_bar.Append(menu_edit, '編集')
frame.SetMenuBar(menu_bar)
frame.Show()
application.MainLoop()
コピーと貼り付けの間にセパレータが追加されました。

チェックボックスアイテムの追加
メニューに対してチェックボックスを追加する事も可能です。追加したチェックボックスアイテムの値を制御するにはCheckを使用します。
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', size=(300, 200))
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour('#AFAFAF')
menu_file = wx.Menu()
menu_file.Append(1, '保存')
menu_file.Append(2, '終了')
menu_edit = wx.Menu()
menu_edit.Append(3, 'コピー')
menu_edit.Append(4, '貼り付け')
check_item = menu_edit.AppendCheckItem(5, 'チェック')
check_item.Check(True)
menu_bar = wx.MenuBar()
menu_bar.Append(menu_file, 'ファイル')
menu_bar.Append(menu_edit, '編集')
frame.SetMenuBar(menu_bar)
frame.Show()
application.MainLoop()
チェックの付いている項目をクリックすると、チェックが外れます。

ラジオボタンアイテムの追加
ラジオボタンの追加も可能です。AppendRadioItemを使いましょう。
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', size=(300, 200))
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour('#AFAFAF')
menu_file = wx.Menu()
menu_file.Append(1, '保存')
menu_file.Append(2, '終了')
menu_edit = wx.Menu()
menu_edit.Append(3, 'コピー')
menu_edit.Append(4, '貼り付け')
menu_edit.AppendSeparator()
menu_edit.AppendRadioItem(5, 'ラジオ1')
menu_edit.AppendRadioItem(6, 'ラジオ2')
menu_bar = wx.MenuBar()
menu_bar.Append(menu_file, 'ファイル')
menu_bar.Append(menu_edit, '編集')
frame.SetMenuBar(menu_bar)
frame.Show()
application.MainLoop()
通常のラジオボタンと同様、どちらか1つしか選択出来ません。

サブメニューの追加
メニュー内へサブメニューを追加するにはAppendSubMenuを使用しましょう。階層化して表示する事で、画面をすっきりと見せる事が出来ます。
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', size=(400, 200))
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour('#AFAFAF')
menu_file = wx.Menu()
menu_file.Append(1, '保存')
menu_file.Append(2, '終了')
menu_edit = wx.Menu()
menu_edit.Append(3, 'コピー')
menu_edit.Append(4, '貼り付け')
menu_edit_do = wx.Menu()
menu_edit_do.Append(5, 'undo')
menu_edit_do.Append(6, 'redo')
menu_edit.AppendSubMenu(menu_edit_do, '操作')
menu_bar = wx.MenuBar()
menu_bar.Append(menu_file, 'ファイル')
menu_bar.Append(menu_edit, '編集')
frame.SetMenuBar(menu_bar)
frame.Show()
application.MainLoop()
サブメニューが追加されました。操作へマウスカーソルを合わせると展開します。

イベント設定
メニューへイベントを設定するにはBindを使用します。引数には(イベント種別、イベント発生時に呼び出す関数)の順番で値を渡し、呼び出す関数内部では選択されたメニューアイテムのIDを出力しています。
import wx
def selectMenu(event):
frame.SetStatusText('MenuSelected! ' + str(event.GetId()))
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', size=(300, 200))
frame.CreateStatusBar()
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour('#AFAFAF')
menu_file = wx.Menu()
save_item = menu_file.Append(1, '保存')
exit_item = menu_file.Append(2, '終了')
menu_edit = wx.Menu()
copy_item = menu_edit.Append(3, 'コピー')
paste_item = menu_edit.Append(4, '貼り付け')
menu_bar = wx.MenuBar()
menu_bar.Append(menu_file, 'ファイル')
menu_bar.Append(menu_edit, '編集')
frame.Bind(wx.EVT_MENU,selectMenu)
frame.SetMenuBar(menu_bar)
frame.Show()
application.MainLoop()
メニューを選択すると、ステータスバーにそれぞれのアイテムのIDが入ります。

