ハンドラーは、アイテムの状態が変化したときにコールバックを送信するアイテムです。ハンドラーには以下の2つがありあす。
- グローバルハンドラー
- キーやマウスのイベントを監視し、変化があればコールバック関数を実行します。
- アイテムハンドラー
- アイテムの状態変化を監視し、変化があればコールバック関数を実行します。
グローバルハンドラー
グローバルハンドラーは、ハンドラーレジストリにdpg.add_mouse_***_handler(・・・)
やdpg.add_key_***_handler(・・・)
のように追加します。
ハンドラーレジストリはグローバルハンドラーを収納することができるコンテナータイプのアイテムです。with dpg.handler_registry():
のようにウィンドウと同様に作成します。
DearPyGuiでは何でもアイテムなのです。
# サンプルスクリプト6
import dearpygui.dearpygui as dpg
dpg.create_context()
dpg.create_viewport(title='Custom Title', width=600, height=300)
# コールバック関数
def mouse_click(sender, app_data):
print(f"sender is: {sender}")
print(f"app_data is: {app_data}")
# ハンドラーレジストリ「handler_registry1」に、グローバルハンドラー(例はクリック監視)を追加します。
with dpg.handler_registry():
dpg.add_mouse_click_handler(callback=mouse_click)
# ウィンドウに「text1」を追加します。
with dpg.window(width=250, height=200):
dpg.add_text("click!", tag="text1")
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()
アイテムハンドラー
アイテムハンドラーは、アイテムハンドラーレジストリにdpg.add_item_***_handler(・・・)
のように追加します。アイテムハンドラーレジストリはアイテムハンドラーを収納することができるコンテナータイプのアイテムです。
グローバルハンドラーと異なるのは、アイテムとアイテムハンドラーレジストリの紐づけが必要な点です。
# サンプルスクリプト7
import dearpygui.dearpygui as dpg
dpg.create_context()
dpg.create_viewport(title='Custom Title', width=600, height=300)
# コールバック関数
def click_text(sender, app_data):
print(f"sender is: {sender}")
print(f"app_data is: {app_data}")
# アイテムハンドラーレジストリ「text1_handler_registry」に、アイテムハンドラー(例はクリック監視)を追加します。
with dpg.item_handler_registry(tag="text1_handler_registry"):
dpg.add_item_clicked_handler(callback=click_text)
# ウィンドウに「text1」を追加します。
with dpg.window(width=250, height=200):
dpg.add_text("click me", tag="text1")
# アイテムとアイテムハンドラーレジストリを紐づけます。
dpg.bind_item_handler_registry("text1", "text1_handler_registry")
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()
サンプルスクリプト7のアイテムハンドラーレジストリを分かりやすいように「text1_handler_registry」と命名しましたが、実際は「text1」専用というわけではなく、他のアイテムも同じアイテムハンドラーレジストリに紐づけることが可能です。いろいろな使い方ができそうです。
サンプル6とapp_dataで得られる内容が異なることも確認してください。