GUI

Python Tkinter Menus(4) ポップアップメニュー

ポップアップメニュー(コンテクストメニュー)は、通常、アプリケーション内のオブジェクトをマウスの右ボタンでクリックすることで呼び出される。メニューはマウスカーソルのある場所にポップアップする。ユーザーはメニューからアイテムを選択できる(または、アイテムを選択せずにメニューの外側をクリックすると、メニューが閉じる)。

ポップアップメニューを作成するには、メニューバーのメニューを作成したときとまったく同じコマンドを使用する。一般的には、いくつかのコマンドアイテムとカスケードメニューアイテムとその関連メニューを持つ1つのメニューを作成する。

メニューをアクティブにするには、ユーザーはコンテキストメニュークリックを実行する。そのクリックを捕捉するために、イベントバインディングを作成する必要がある。しかし、これはプラットフォームによって異なる。WindowsとX11では、マウスの右ボタン(マウスの第3ボタン)をクリックすること。macOSでは、コントロールキーを押しながら左ボタン(または唯一のボタン)をクリックするか、マルチボタンマウスで右クリックする。WindowsやX11とは異なり、macOSでは、これを第3ボタンではなく、第2ボタンと呼ぶため、このイベントをプログラムで見ることになる。

ポップアップメニューのイベントを正しくキャプチャすることに加えて、マウスの位置もキャプチャする必要がある。これは、クリックしたウィンドウやウィジェットのローカル座標(ローカル座標)ではなく、画面全体からの相対座標(グローバル座標)で行う必要がある。Tk のイベントバインディングシステムの %X と %Y の置換が、これらを捕捉する。

最後のステップは、postメソッドで特定の場所にメニューを表示するように指示する。以下は、アプリケーションのメインウィンドウにポップアップメニューを使用した全体のプロセスの例。

from tkinter import *


root = Tk()
menu = Menu(root)
for i in ('1', '2', '3'):
    menu.add_command(label=i)
if (root.tk.call('tk', 'windowingsystem')=='aqua'):
    root.bind('<2>', lambda e: menu.post(e.x_root, e.y_root))
    root.bind('<Control-1>', lambda e: menu.post(e.x_root, e.y_root))
else:
    root.bind('<3>', lambda e: menu.post(e.x_root, e.y_root))
root.mainloop()