(03)Dear PyGuiのハンドラー

 2nd January 2023 at 9:25pm

ハンドラーは、アイテムの状態が変化したときにコールバックを送信するアイテムです。ハンドラーには以下の2つがありあす。

グローバルハンドラー
キーやマウスのイベントを監視し、変化があればコールバック関数を実行します。
アイテムハンドラー
アイテムの状態変化を監視し、変化があればコールバック関数を実行します。

グローバルハンドラー

グローバルハンドラーは、ハンドラーレジストリにdpg.add_mouse_***_handler(・・・)dpg.add_key_***_handler(・・・)のように追加します。

ハンドラーレジストリはグローバルハンドラーを収納することができるコンテナータイプのアイテムです。with dpg.handler_registry():のようにウィンドウと同様に作成します。

DearPyGuiでは何でもアイテムなのです。

DearPyGui_Sample06.py

# サンプルスクリプト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(・・・)のように追加します。アイテムハンドラーレジストリはアイテムハンドラーを収納することができるコンテナータイプのアイテムです。

グローバルハンドラーと異なるのは、アイテムとアイテムハンドラーレジストリの紐づけが必要な点です。

DearPyGui_Sample07.py

# サンプルスクリプト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で得られる内容が異なることも確認してください。


Homeへプログラミングの記事Topへ