Как передавать данные из input_text в callback другого элемента?

Всех приветствую.
Есть три модуля: Interface, DataManager и General Для упрощения понимания нарисовал схему взаимодействия между ними. введите сюда описание изображения

Интерфейс написан на dearpygui и имеет следующий код:

class Interface():    
    def draw_main_window(self, start_programm): 
        with dpg.window(label="Example Window", width=1000, height=500, tag='main_wind'):
            with dpg.tab_bar():
                with dpg.tab(label='Main'):
                    with dpg.group():
                        dpg.add_text(default_value="Last Date")
                        dpg.add_input_text(tag='date_user', no_spaces = True, decimal= True, width=100)
                        dpg.add_button(label="Поиск", callback=start_program, user_data = dpg.get_value('date_user')) 

            dpg.set_primary_window(window='main_wind', value=True)
            dpg.setup_dearpygui()
            dpg.show_viewport()
            dpg.start_dearpygui()
            dpg.destroy_context()

В модуле DataManager находится внутреннее устройство работы программы, которое в данный момент для упрощения ситуации я заменил на тривиальное

class DataManager: 
    def start_program(self, sender, app_data, user_data): 
        print(user_data)
        print(sender)
        print(app_data)

Класс General выглядит следующим образом:

class General():
    def __init__(self, data_manager: DataManager, interface: Interface) -> None:
        self.data_manager = data_manager
        self.interface = interface

    def start_program(self): 
        self.interface.draw_main_window(self.data_manager.start_program)
   

if __name__ == '__main__':
    t = General(SelFlashManager(), GraphInterface())
    t.start_program()

Я ожидаю, что по нажатии на кнопку "Поиск" данные из текстового поля "date_user" отправятся вместе с callback в start_program из DataManager, но этого не происходит.
По нажатии на кнопку я получаю

      # Пустая строка 
31    # id элемента 
None  # Результат 

Подозреваю, что это из-за выполнения функции get_value в момент инициализации окна. Почитал о том, что есть отладка обратных вызовов. Но основной цикл событий всё равно придётся где-то вызывать, а делать это в General как-то странно, ибо весь интерфейс собран внутри Interface. Подскажите, как сделать так, чтобы данные с текстового поля поступали в функцию вместе с callback(во время нажатия)?


Ответы (1 шт):

Автор решения: insolor

В этой строке:

dpg.add_button(label="Поиск", callback=start_program, user_data=dpg.get_value('date_user'))

значение для параметра user_data "вычисляется" один раз при выполнении этой строки (при создании кнопки), и больше в процессе работы программы не изменяется.

Вам нужно чтобы вместо этого значение вычислялось при нажатии на кнопку. Это можно реализовать, например, передачей в колбэк лямбды, внутри которой вычисляется это значение и передается в настоящий колбэк, тогда значение будет вычисляться непосредственно при нажатии:

dpg.add_button(label="Поиск", callback=lambda sender, app_data: start_program(sender, app_data, dpg.get_value('date_user')))
→ Ссылка