MenuBar
GUIアプリケーションの上部に表示され、終了や保存などの様々なアクションの起点ともなるMenuBarの紹介です。本項ではMenuおよびMenuItemについても扱います。
「Append」を使用して「Menu」を追加し、Frameの「SetMenuBar」にてメニューバーをセットします。
# -*- coding: utf-8 -*-
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", 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, u"ファイル")
menu_bar.Append(menu_edit, u"編集")
frame.SetMenuBar(menu_bar)
frame.Show()
application.MainLoop()
--実行結果--
まだ「MenuItem」を追加していないので、クリックしても何も表示されません。

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

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

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

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

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

メニューへイベントを設定するには「Bind」を使用します。引数には(イベント種別、イベント発生時に呼び出す関数)の順番で値を渡し、呼び出す関数内部では選択されたメニューアイテムのIDを出力しています。
# -*- coding: utf-8 -*-
import wx
def selectMenu(event):
frame.SetStatusText("MenuSelected! " + str(event.GetId()))
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", 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, u"保存")
exit_item = menu_file.Append(2, u"終了")
menu_edit = wx.Menu()
copy_item = menu_edit.Append(3, u"コピー")
paste_item = menu_edit.Append(4, u"貼り付け")
menu_bar = wx.MenuBar()
menu_bar.Append(menu_file, u"ファイル")
menu_bar.Append(menu_edit, u"編集")
frame.Bind(wx.EVT_MENU,selectMenu)
frame.SetMenuBar(menu_bar)
frame.Show()
application.MainLoop()
--実行結果--
メニューを選択すると、ステータスバーにそれぞれのアイテムのIDが入ります。

地味に役立ちます!
