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 create_menu(self, submenus): """ ポップアップメニューウィジェットを作成します。 このメソッドは、指定されたサブメニュー項目に基づいてtkinter.Menuウィジェットを構築します。 各サブメニュー項目は、メニュー内のコマンドとして追加されます。 :param submenus: list[dict] - メニュー項目を定義する辞書のリスト。 各辞書は'label'(str)と'callback'(callable)キーを持つ必要があります。 :returns: tkinter.Menu - 作成されたtkinter.Menuウィジェットのインスタンス。 """ self.submenus = submenus.copy() self.menu = tkinter.Menu(self.parent, tearoff = 0) for i in range(len(submenus)): self.menu.add_command(label = self.submenus[i]['label'], command = self.submenus[i]['callback']) return self.menu
[ドキュメント] 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()