Как передавать данные из 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 шт):
В этой строке:
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')))