リンク

2016年11月13日日曜日

pythonでGUIツールを作る ~ Menubar&Menu メニューバー&メニュー ~

ここではwxPythonのMenubar(メニューバー)とMenu(メニュー)をご紹介します。
# -*- coding: utf-8 -*-

import wx

def menu_event(event):
    """ メニュー項目選択イベント """
    menu_id = event.GetId()

    if menu_id == 1:
        print u'「保存」を選択しました'
    elif menu_id == 2:
        print u'「終了」を選択しました'
    elif menu_id == 3:
        print u'「コピー」を選択しました'
    elif menu_id == 4:
        print u'「貼り付け」を選択しました'
    elif menu_id == 5:
        print u'「進む」を選択しました'
    else:
        print u'「戻す」を選択しました'


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_bar = wx.MenuBar()

# 「ファイル」メニュー = = = = = = = = = = = = = = = = = = = = = = = = = = = =
menu_file = wx.Menu()

# メニューアイテムを作る
item_file_1 = wx.MenuItem(menu_file, 1, u'保存')
item_file_2 = wx.MenuItem(menu_file, 2, u'終了')

# 「ファイル」メニューにメニューアイテムを追加
menu_file.AppendItem(item_file_1)
menu_file.AppendItem(item_file_2)

# 「編集」メニュー = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
menu_edit = wx.Menu()

item_edit_1 = wx.MenuItem(menu_edit, 3, u'コピー')
item_edit_2 = wx.MenuItem(menu_edit, 4, u'貼り付け')

menu_edit.AppendItem(item_edit_1)
menu_edit.AppendItem(item_edit_2)

# 「操作」メニュー = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
menu_sousa = wx.Menu()

item_sousa_1 = wx.MenuItem(menu_sousa, 5, u'進む')
item_sousa_2 = wx.MenuItem(menu_sousa, 6, u'戻す')

menu_sousa.AppendItem(item_sousa_1)
menu_sousa.AppendItem(item_sousa_2)

# メニューバーにメニューを追加
menu_bar.Append(menu_file, u'ファイル')
menu_bar.Append(menu_edit, u'編集')

# 「編集』メニューの中に「操作」メニューを追加
menu_edit.AppendSubMenu(menu_sousa, u'操作')

# フレームにメニューバーをセット
frame.SetMenuBar(menu_bar)

# メニュー選択イベントを設定
frame.Bind(wx.EVT_MENU, menu_event)

frame.Show()

application.MainLoop()
<結果>

上記スクリプト内で、過去に解説した内容については省略致します。
ご確認いただきたい場合は、pythonでGUIツールを作る ~基礎編~をご覧ください。

続いて解説を行います。

- - - 詳細 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
フレームにメニューバー&メニューを追加するには下記のような一定の準備が必要になります。
 1.メニューバーを作る
 2.メニューを作る
 3.メニューアイテムを作る
 4.メニューアイテムをメニューに追加
 5.メニューをメニューバーに追加
 6.メニューバーをフレームに追加

以上を踏まえ、詳細を見ていきます。
# メニューバー
menu_bar = wx.MenuBar()
メニューバーをインスタンス化しています。
この時点ではまだ空っぽの状態です。

# 「ファイル」メニュー = = = = = = = = = = = = = = = = = = = = = = = = = = = =
menu_file = wx.Menu()

# メニューアイテムを作る
item_file_1 = wx.MenuItem(menu_file, 1, u'保存')
item_file_2 = wx.MenuItem(menu_file, 2, u'終了')

# 「ファイル」メニューにメニューアイテムを追加
menu_file.AppendItem(item_file_1)
menu_file.AppendItem(item_file_2)
メニューをインスタンス化し、メニューアイテムを追加しています。
メニューアイテムを作成するにはwx.MenuItemを使用し、その引数は(親ウィジット、識別子、表示文字列)となります。
後述するイベント内で識別子を取得し、どのメニューアイテムが選択されたか判断するため、わかりやすい数字を設定しています。
作成したメニューアイテムをメニューに追加するにはAppendItemメソッドを使用します。

# メニューバーにメニューを追加
menu_bar.Append(menu_file, u'ファイル')
menu_bar.Append(menu_edit, u'編集')
Appendメソッドでメニューバーにこれまで作成したメニューを追加します。
引数は(追加するメニュー、表示文字列) です。

# 「編集』メニューの中に「操作」メニューを追加
menu_edit.AppendSubMenu(menu_sousa, u'操作')
メニューの中にさらにメニューを入れたい場合はAppendSubMenuメソッドを使用します。
引数は (追加するメニュー、表示文字列) です。

# フレームにメニューバーをセット
frame.SetMenuBar(menu_bar)
完成したメニューバーをフレームに追加します。
これでやっとフレーム上部にメニューが表示されます。

# メニュー選択イベントを設定
frame.Bind(wx.EVT_MENU, menu_event)
メニューを作っただけではその効果を発揮しません。
メニューアイテムを選択した時に発生するイベントをここでハンドルします。

def menu_event(event):
    """ メニュー項目選択イベント """
    menu_id = event.GetId()

    if menu_id == 1:
        print u'「保存」を選択しました'
    elif menu_id == 2:
        print u'「終了」を選択しました'
    elif menu_id == 3:
        print u'「コピー」を選択しました'
    elif menu_id == 4:
        print u'「貼り付け」を選択しました'
    elif menu_id == 5:
        print u'「進む」を選択しました'
    else:
        print u'「戻す」を選択しました'
メニューアイテム選択時に発生するイベントの内容です。
押されたメニューアイテムの識別子(ID)を取得し、そのIDに応じた内容をコンソールに出力します。

ここからはメニューバー・メニュー・メニューアイテムそれぞれで使用する主な関数を列挙します。

<メニューバーの主な関数>
# 指定アイテムのラベルを取得する
menu_bar.GetLabel(アイテムID)

# 指定アイテムのラベルを設定する
menu_bar.SetLAbel(アイテムID, '新しいラベル')

# 指定アイテムを有効にする/無効にする
menu_bar.Enable(アイテムID, True)
menu_bar.Enable(アイテムID, False)

# メニューを削除する
menu_bar.Remove(インデックス値)

# メニューを指定位置に追加する
menu_bar.Insert(インデックス値, 指定メニュー, 'ラベル')

<メニューの主な関数>
# ラベルを取得する
menu_file.GetTitle()

# ラベルを設定する
menu_file.SetTitle('新しいラベル')

# 自身が持つアイテムリストを取得する
menu_file.GetMenuItems()

# 指定アイテムを有効/無効にする
menu_file.Enable(インデックス値, True)
menu_file.Enable(インデックス値, False)

# 指定アイテムの有効/無効の状態を取得する
menu_file.IsEnabled(1)

# 指定の位置にアイテムを挿入する
menu_file.InsertItem(インデックス値, 挿入するMenuItem)

# メニューを削除する
menu_file.Delete(インデックス値)

<メニューアイテムの主な関数>
# IDを取得する
item_file_1.GetId()

# IDを設定する
item_file_1.SetId(数値)

# ラベルを取得する
item_file_1.GetText()

# ラベルを設定する
item_file_1.SetText('新しいラベル')

# 有効/無効にする
item_file_1.Enable(True)
item_file_1.Enable(False)

# 有効/無効の状態を取得する
item_file_1.IsEnabled()

メニューバーはフレーム上のスペースを節約しつつ、様々な機能を追加できる便利なウィジットです。
選択系ウィジットでフレームが肥大化している場合はメニューバーの導入を検討してみてください。

0 件のコメント:

コメントを投稿