第 1 章 メインウィンドウ

◀ 1.21 ウィンドウアイコン   【目  次】  1.23 システムメニュー ▶

999999

 更新日:


 このホームページは Amazon Kindle 本の作成中の草稿です。日々、原稿を見直しているので、内容が変わることに留意して読んで下さい。本が出版され次第、このホームページは削除されます。

1.22 メニューバー(menu、tkinter.Menu、tkinter.Menu.add_command、tkinter.Menu.add_cascade)

 ウィンドウのタイトルバーの下に、アプリケーション独自のメニューを配置したメニューバーを設定することができます。「固有オプション」の「menu」にメニューウィジェットを登録します。メニューウィジェットは下記の「tkinter.Menu」クラスを用いて作成します。詳細は「メニューウィジェット」を参照して下さい。

tkinter.Menu(master=None, cnf={}, **kw)

 引数 master にメニューバーを設定するウィンドウを指定します。

 「menu」にメニューウィジェットを登録しただけではメニューバーは表示されません。メニュー項目を設定することでデフォルトでメニューバーにメニューが表示されます。メニュー項目の設定はメニューウィジェットの下記の「add_command」メソッドを用います。詳細は「メニューウィジェット」を参照して下さい。

object.add_command(cnf={}, **kw)

 引数の「label」オプションにメニュー項目として表示するテキストを、「command」オプションにメニューをマウスの左クリックしたときに実行する関数を指定します。メニューバーにメニュー項目として表示するテキストは、システムによって管理されるため、他のオプション設定はできません。タスクバーメニューの子メニューとして作成するメニューは他のオプション設定ができます。

 メニューオブジェクトに子メニューを設定するには下記の「add_cascade」メソッドを用います。詳細は「メニューウィジェット」を参照して下さい。

object.add_cascade(cnf={}, **kw)

 引数の「label」オプションにメニュー項目として表示するテキストを、「menu」オプションに設定する子メニューオブジェクトを指定します。子メニューのオプションは全て反映されます。

 次のプログラムは、メニューウィジェット「menu」を作成してウィンドウに登録しています。「add_command」メソッドでメニュー項目を設定して、関数を登録しています。関数はメニューテキストを「print」出力するようにしています。

1
import tkinter as tk
2
root = tk.Tk()
3
root.config(width=300, height=200)
4
menu = tk.Menu(root)
5
root['menu']=menu
6
def menufunc_1():
7
    print('menu_1')
8
def menufunc_2():
9
    print('menu_2')
10
menu.add_command(label='menu_1', command=menufunc_1)
11
menu.add_command(label='menu_2', command=menufunc_2)
12
root.mainloop()

 プログラムを実行すると、タイトルバーの下にメニューが設定されたメニューバーを持つ下図のウィンドウが表示されます。

A001_MainWindow_01-22

 次のプログラムは、メニューウィジェット「menu」に子メニュー「menu_1」と「menu_2」を設定しています。子メニュー「menu_1」に背景色として黄色を、「menu_2」に背景色として青色を設定しています。子メニュー「menu_1」に「add_command」メソッドでメニュー項目を設定して、関数を登録しています。関数はメニューテキストを「print」出力するようにしています。メニューウィジェット「menu」に、メニュー「menu_1」と「menu_2」を「add_cascade」メソッドで子メニューとして設定しています。

1
import tkinter as tk
2
root = tk.Tk()
3
root.config(width=300, height=200)
4
menu = tk.Menu(root)
5
root['menu']=menu
6
menu_1 = tk.Menu(menu, bg='yellow')
7
menu_2 = tk.Menu(menu, bg='blue')
8
def menufunc_11():
9
    print('menu_11')
10
def menufunc_12():
11
    print('menu_12')
12
menu_1.add_command(label='menu_11', command=menufunc_11)
13
menu_1.add_command(label='menu_12', command=menufunc_12)
14
menu.add_cascade(label='menu_1', menu=menu_1)
15
menu.add_cascade(label='menu_2', menu=menu_2)
16
root.mainloop()

 プログラムを実行すると、タイトルバーの下にメニューが設定されたメニューバーを持つ下図のウィンドウが表示されます。menu_1 のラベルをマウスので左クリックすると子メニューが表示されます。

A001_MainWindow_01-22-1

 子メニューの破線をクリックすると、子メニューは分離して独立のウィンドウとして表示されます。この分離をしないようにするには、メニューの作成時に「tearoff」オプションに「0」を指定します。このオプションについては、「メニューウィジェット」を参照して下さい。