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が入ります。