wx.MenuBar (wxPython) | Python-izm

MenuBar

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