Python wxPython入門|wx.MenuBarで本格的なメニューバーを作成する方法

Python

Pythonでデスクトップアプリケーションを開発する際、ユーザーインターフェース(UI)の使い勝手を左右する重要な要素が「メニューバー」です。wxPythonライブラリを使用すれば、OS標準のような本格的なメニューバーを短時間で実装できます。

この記事では、wx.MenuBar の基本構造から、イベント処理、ショートカットキーの設定といった応用テクニックまで、初心者の方でもコピー&ペーストで動作を確認できるよう丁寧に解説します。この記事を読み終える頃には、あなたのアプリにプロ仕様の操作系を組み込めるようになっているはずです。

wxPythonのメニューバー(wx.MenuBar)の基本構造

結論から言うと、wxPythonのメニューバーは**「MenuBar > Menu > MenuItem」という3層の親子関係**で成り立っています。この階層構造を理解することが、実装への最短距離です。各クラスの公式ドキュメントは次の通りです。(wx.MenuBar Reference, wx.Menu Reference, wx.MenuItem Reference)

MenuBar、Menu、MenuItemの親子関係を理解する

メニューバーの実装において、混乱しやすいのが各クラスの役割です。以下のように整理して覚えましょう。

  1. wx.MenuBar(メニューバー本体): ウィンドウの最上部に横長く表示される「枠」です。
  2. wx.Menu(個別のメニュー): 「ファイル」「編集」など、クリックした時に下に展開される「リスト」です。
  3. wx.MenuItem(メニュー項目): 「開く」「保存」「終了」など、リストの中に並ぶ具体的な「選択肢」です。

この3つを順番に組み立て、最終的に親ウィンドウ(wx.Frame)にセットすることで画面に表示されます。

開発環境とwxPythonのバージョンについて

本記事のサンプルコードは、**Python 3.7以降およびwxPython 4.x(Phoenix)**を対象としています。wxPython 4系は現在の主流であり、多くの環境で安定して動作します。まだインストールしていない場合は、以下のコマンドで準備してください。

pip install wxPython

【基本編】シンプルなメニューバーを実装する3ステップ

メニューバーを作成する手順は、常に以下の3ステップが基本となります。

手順1:wx.Menu(各メニュー)を作成する

まずは、項目を格納するための「メニュー」オブジェクトを作成し、そこに「メニュー項目」を追加していきます。

# メニューオブジェクトの作成
file_menu = wx.Menu()

# 項目の追加(ID, ラベル, 説明文)
# wx.ID_EXITはwxPythonが用意している標準の「終了」IDです
exit_item = file_menu.Append(wx.ID_EXIT, "終了(&X)", "アプリケーションを閉じます")

&X という記述は、Alt + X キーでそのメニューを即座に開くための「アクセラレータ(アクセスキー)」の指定です。

手順2:wx.MenuBarにメニューを追加する

次に、作成した個別のメニューを、横長のメニューバー本体に登録します。

# メニューバー本体の作成
menu_bar = wx.MenuBar()

# メニューバーに「ファイル」という名前で登録
menu_bar.Append(file_menu, "ファイル(&F)")

手順3:Frameにメニューバーをセットする

最後に、メインウィンドウである wx.Frame に対して、作成したメニューバーを表示するように指示します。

# selfはwx.Frameを継承したクラスのインスタンスを指します
self.SetMenuBar(menu_bar)

メニュークリック時のイベント(wx.EVT_MENU)を処理する

メニューを作っただけでは、項目をクリックしても何も起きません。**「クリックされた」というイベントを、具体的な処理(関数)に紐付ける(バインドする)**必要があります。

IDを使用したイベントバインドの方法

各メニュー項目には「ID」が割り当てられています。このIDをフックにして、動作を記述します。

# イベントの紐付け
# self.Bind(イベント種類, 呼び出す関数, ソースとなる項目のID)
self.Bind(wx.EVT_MENU, self.on_exit, exit_item)

def on_exit(self, event):
    """終了メニューが押された時の処理"""
    self.Close(True)

終了処理やダイアログ表示の具体例

実際のアプリでは、いきなり閉じるのではなく「本当に終了しますか?」といった確認を挟むのが一般的です。

def on_about(self, event):
    """「このアプリについて」を表示する例"""
    wx.MessageBox("これはwxPythonのMenuBarサンプルです。",
                  "バージョン情報",
                  wx.OK | wx.ICON_INFORMATION)

【応用編】メニューバーをより使いやすくするカスタマイズ

基本が完成したら、さらにユーザビリティを高めるカスタマイズを加えましょう。

ショートカットキー(アクセラレータ)の設定

「Ctrl + S」で保存といったショートカットキーは、ラベルの中に \t(タブ)を使って記述するだけで自動的に有効になります。

# \tCtrl+O と書くだけでショートカットが登録される
open_item = file_menu.Append(wx.ID_OPEN, "開く(&O)...\tCtrl+O")

セパレーター(区切り線)でメニューを整理する

項目が多くなると見づらくなるため、関連する項目ごとに区切り線を入れます。

file_menu.Append(wx.ID_SAVE, "保存(&S)\tCtrl+S")
file_menu.AppendSeparator()  # ここで区切り線が入る
file_menu.Append(wx.ID_EXIT, "終了(&X)")

チェックボックスやラジオボタン付きのメニュー

設定の切り替えなどに便利な、チェック形式のメニューも作成可能です。

# Kindにwx.ITEM_CHECKを指定
view_menu = wx.Menu()
show_statusbar_item = view_menu.Append(wx.ID_ANY, "ステータスバーを表示", 
                                       kind=wx.ITEM_CHECK)
# 初期状態でチェックを入れておく
view_menu.Check(show_statusbar_item.GetId(), True)

実践サンプルコード:多機能なメニューバーのフルスクリプト

これまでの内容をすべて盛り込んだ、すぐに実行可能なコードです。

import wx

class MyFrame(wx.Frame):
    def __init__(self):
        super().__init__(None, title="wx.MenuBar 実践サンプル", size=(600, 400))
        
        # 1. メニューバーの作成
        menu_bar = wx.MenuBar()
        
        # --- ファイルメニュー ---
        file_menu = wx.Menu()
        open_item = file_menu.Append(wx.ID_OPEN, "開く(&O)...\tCtrl+O")
        save_item = file_menu.Append(wx.ID_SAVE, "保存(&S)\tCtrl+S")
        file_menu.AppendSeparator()
        exit_item = file_menu.Append(wx.ID_EXIT, "終了(&X)\tAlt+F4")
        
        # --- 表示メニュー (チェック項目) ---
        view_menu = wx.Menu()
        self.show_time_item = view_menu.Append(wx.ID_ANY, "時刻を表示", kind=wx.ITEM_CHECK)
        
        # --- ヘルプメニュー ---
        help_menu = wx.Menu()
        about_item = help_menu.Append(wx.ID_ABOUT, "このアプリについて")
        
        # 2. メニューバーに各メニューを登録
        menu_bar.Append(file_menu, "ファイル(&F)")
        menu_bar.Append(view_menu, "表示(&V)")
        menu_bar.Append(help_menu, "ヘルプ(&H)")
        
        # 3. フレームにメニューバーをセット
        self.SetMenuBar(menu_bar)
        
        # 4. イベントのバインド
        self.Bind(wx.EVT_MENU, self.on_open, open_item)
        self.Bind(wx.EVT_MENU, self.on_exit, exit_item)
        self.Bind(wx.EVT_MENU, self.on_about, about_item)
        
        self.CreateStatusBar() # 動作確認用のステータスバー
        self.Show()

    def on_open(self, event):
        wx.LogMessage("『開く』が選択されました")

    def on_about(self, event):
        wx.MessageBox("wx.MenuBarのデモアプリです。", "情報", wx.OK | wx.ICON_INFORMATION)

    def on_exit(self, event):
        self.Close(True)

if __name__ == "__main__":
    app = wx.App()
    MyFrame()
    app.MainLoop()

まとめ:wx.MenuBarでユーザー利便性を高めよう

本記事では、wxPythonにおける wx.MenuBar の実装方法を解説しました。

  • 構造: MenuBar > Menu > MenuItem の階層を意識する。
  • 基本: Append で項目を追加し、SetMenuBar でフレームに適用する。
  • イベント: wx.EVT_MENUを使ってクリック時の動作を定義する。
  • UX向上: ショートカットキー(\t)やセパレーターを活用する。

メニューバーは、アプリケーションの機能を整理し、ユーザーが迷わず操作できるようにするための道標です。まずは基本の「ファイル」メニューから作成し、徐々にアプリ独自の機能を拡張していきましょう。

コメント

タイトルとURLをコピーしました