tklib.tkgui.tkmenu_popup のソースコード
"""
Tkinterポップアップメニューモジュール。
このモジュールは、特定のTkinterウィジェットにマウスカーソルがホバーした際に
自動的に表示されるポップアップメニュー機能を提供します。
マウスがウィジェットから離れるとメニューは非表示になります。
関連リンク:
:doc:`tkmenu_popup_usage`
"""
import tkinter
[ドキュメント]
class tkMenu_popup:
"""
Tkinterウィジェットに関連付けられたポップアップメニューを管理するクラス。
このクラスは、指定されたウィジェットにマウスカーソルがホバーしたときに
メニューを表示し、カーソルがウィジェットから離れたときにメニューを非表示にする機能を実装します。
メニューの項目は、ラベルと対応するコールバック関数を持つ辞書のリストとして定義されます。
"""
def __init__(self, parent = None, app = None, title = '', submenus = []):
"""
tkMenu_popupクラスの新しいインスタンスを初期化します。
:param parent: tkinter.Tkまたはtkinter.Toplevel - メニューが属する親ウィジェット。
:param app: object - アプリケーションのインスタンス(任意)。
:param title: str - メニューのタイトル(現在未使用)。
:param submenus: list[dict] - メニュー項目を定義する辞書のリスト。
各辞書は'label'(str)と'callback'(callable)キーを持つ必要があります。
このリストが空の場合、メニューには項目が追加されません。
"""
self.parent = parent
self.app = app
self.title = title
self.shifty = 0
self.shifty = 0
self.menu = self.create_menu(submenus)
[ドキュメント]
def show(self, event):
"""
メニューを指定された位置に表示します。
このメソッドは、バインドされたウィジェットのルート座標と設定されたシフト値に基づいて
ポップアップメニューを表示します。通常、ウィジェットへのマウスEnterイベントにバインドされます。
:param event: tkinter.Event - メニュー表示をトリガーしたイベントオブジェクト。
イベントのx, y座標は使用されず、バインドされたウィジェットの位置が使われます。
"""
# x = event.x
# y = event.y
x = self.widget.winfo_rootx() + self.shifty
y = self.widget.winfo_rooty() + self.shifty
self.menu.post(x, y)
[ドキュメント]
def hide(self, event):
"""
表示されているメニューを非表示にします。
このメソッドは、現在表示されているポップアップメニューを非表示にします。
通常、ウィジェットからのマウスLeaveイベントにバインドされます。
:param event: tkinter.Event - メニュー非表示をトリガーしたイベントオブジェクト。
"""
self.menu.unpost()
[ドキュメント]
def bind_to_widget(self, widget, shiftx = 0, shifty = 0):
"""
指定されたウィジェットにポップアップメニューの表示/非表示イベントをバインドします。
このメソッドは、提供されたウィジェットに'<Enter>'イベントと'<Leave>'イベントをバインドし、
それぞれ`show`メソッドと`hide`メソッドを呼び出すように設定します。
メニューの表示位置は、`shiftx`と`shifty`によってオフセット調整できます。
:param widget: tkinter.Widget - メニューをバインドする対象のTkinterウィジェット。
:param shiftx: int - メニュー表示位置のX軸方向のオフセット(現在未使用)。デフォルトは0。
:param shifty: int - メニュー表示位置のY軸方向のオフセット。デフォルトは0。
"""
self.widget = widget
self.shiftx = shiftx
self.shifty = shifty
# widget.bind("<Button-1>", show_menu)
widget.bind('<Enter>', self.show)
widget.bind('<Leave>', self.hide)
# widget.bind("<Motion>", self.motion)
[ドキュメント]
def main():
"""
このモジュールの簡単なデモンストレーションを実行します。
この関数はTkinterのルートウィンドウを作成し、tkMenu_popupクラスのインスタンスを初期化しますが、
提供されたソースコードの通り、メニュー項目が定義されていないため、実際に表示されるメニューには何も含まれません。
注: 'tk.Tk()'が使用されていますが、'tkinter'のみがインポートされているため、このままでは`NameError`が発生します。
また、`tkMenu_popup`の第二引数`'test'`は`app`として渡され、`submenus`はデフォルトの空リストが使用されます。
このコードは提供されたソースコードのロジックを変更しないというルールに従っています。
"""
root = tk.Tk()
menu = tkMenu_popup(root, 'test')
root.mainloop()
if __name__ == "__main__":
main()