第 1 章 メインウィンドウ

◀ 1.22 メニューバー   【目  次】  1.24 Windows 固有の属性 ▶

999999

 更新日:


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

1.23 システムメニュー(menu、tkinter.Menu、tkinter.Menu.add_command、tkinter.Menu.add_cascade)

 ウィンドウのタイトルバーにあるシステムメニューに、アプリケーション独自のメニュー項目を追加することができます。ただ、システムメニューは基本的に OS が設定するので、アプリケーションでの設定は OS の制限を受けます。最初に、1.22 項のメニューバーと同様に、「固有オプション」の「menu」にメニューウィジェットを登録します。メニューウィジェットは下記の「tkinter.Menu」クラスを用いて作成します。詳細は 「メニューウィジェット」を参照して下さい。

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

 引数 master 登録するウィンドウを指定します。

 システムメニューにメニュー項目を追加するには、ウィンドウに登録したメニューにシステムメニューとしての子メニューを設定し、子メニューに追加するメニュー項目を設定します。子メニューはメニューウィジェットの作成と同じ「tkinter.Menu」クラスを用いて作成します。このとき、システムメニューに配置するために「name」オプションに文字列「system」を指定します。

 子メニューを親メニューのウィジェットに登録するには、メニューウィジェットの下記の「add_cascade」メソッドを用います。詳細は 「メニューウィジェット」を参照して下さい。

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

 引数の「menu」オプションに登録する子メニューオブジェクトを指定します。

 1.22 項のメニューバーと同様に、「menu」に子メニューオブジェクトを登録しただけではメニュー項目は表示されません。メニュー項目を設定することでシステムメニューにメニュー項目が表示されます。1.22 項のメニューバーと同様に、メニューの設定は子メニューオブジェクの下記の「add_command」メソッドを用います。詳細は 「メニューウィジェット」を参照して下さい。

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

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

 次のプログラムは、メニューウィジェット「menu」を作成してウィンドウに登録しています。次いで、システムメニューに登録するための子のメニューオブジェクト「smenu」を作成して、「add_cascade」メソッドでメニューウィジェット「menu」に登録しています。子メニューオブジェクトに「add_command」メソッドでメニュー項目を設定して、関数を登録しています。関数はメニューテキストを「print」出力するようにしています。
 ここで、プログラム 6 行目で、子メニューオブジェクトを作成するときに「tearoff」オプションに 0 を指定しています。このオプションは子メニューを切り離して表示することができるかの設定で、0 を指定することで切り離しを不可としています。詳細は 「メニューウィジェット」を参照して下さい。

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
smenu = tk.Menu(menu, name='system',tearoff=0)
7
menu.add_cascade(menu=smenu)
8
def menufunc_1():
9
    print('menu_1')
10
def menufunc_2():
11
    print('menu_2')
12
smenu.add_command(label='menu_1', command=menufunc_1)
13
smenu.add_command(label='menu_2', command=menufunc_2)
14
root.mainloop()

 プログラムを実行すると、システムメニューにメニュー項目が追加された下図のウィンドウが表示されます。

A001_MainWindow_01-23

 次のプログラムは、アプリケーションで登録した子のシステムメニューに孫メニューを設定しています。最初に、メニューウィジェット「menu」を作成してウィンドウに登録しています。次いで、システムメニューに登録するための子のメニューオブジェクト「smenu」を作成して、「add_cascade」メソッドでメニューウィジェット「menu」に登録しています。「smenu」は背景色としてピンク色を指定しています。
 システムに登録した「smenu」に更に孫メニュー「menu_1」と「menu_2」を設定しています。孫メニュー「menu_1」に背景色として黄色を、「menu_2」に背景色として青色を設定しています。
 孫メニューオブジェクトに「add_command」メソッドでメニュー項目を設定して、関数を登録しています。関数はメニューテキストを「print」出力するようにしています。
 ここで、プログラム 6 行目で、子メニューオブジェクト「smenu」を作成するときに「tearoff」オプションは設定していません。デフォルトで切り離しが可能となっています。アプリケーションで登録したシステムメニューの孫メニューは OS の制限でメニューが切り離されないと有効になりません。 子メニューオブジェクト「smenu」に、メニュー「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
smenu = tk.Menu(menu, name='system', bg='pink')
7
menu.add_cascade(menu=smenu)
8
menu_1 = tk.Menu(menu, bg='yellow')
9
menu_2 = tk.Menu(menu, bg='blue')
10
def menufunc_11():
11
    print('menu_11')
12
def menufunc_12():
13
    print('menu_12')
14
menu_1.add_command(label='menu_11', command=menufunc_11)
15
menu_1.add_command(label='menu_12', command=menufunc_12)
16
smenu.add_cascade(label='menu_1', menu=menu_1)
17
smenu.add_cascade(label='menu_2', menu=menu_2)
18
root.mainloop()

 プログラムを実行すると、システムメニューにメニュー項目が追加された下図のウィンドウが表示されます。

A001_MainWindow_01-23-1

 追加したメニューの上に表示される(tear-off)のテキストをマウスで左クリックすると追加したメニューが分離して独立のウィンドウとして表示されます。このメニューの menu_1 のラベルをマウスので左クリックすると下図のように孫メニューが表示されます。
 ここで、子および孫メニューの表示位置とサイズは設定していないので、システムが設定しています。メニューの設定の詳細は「メニューウィジェット」を参照して下さい。

A001_MainWindow_01-23-2