Как сделать динамические виджеты в DearPyGUI?Python

Программы на Python
Ответить
Anonymous
 Как сделать динамические виджеты в DearPyGUI?

Сообщение Anonymous »

Вполне возможно поэкспериментировать с проблемой динамического виджета на таблицах:
import dearpygui.dearpygui as dpg
from typing_extensions import Union, Optional, Any
# * Local Imports
import database
from units import __prog_name__, __prog_version__, __prog_author__

# ! Initializing
dpg.create_context()

# ! Functions
def start() -> None:
dpg.start_dearpygui()
dpg.destroy_context()

# ! Window Functions
def load_table(
sender: Optional[Union[int, str]],
app_data: Optional[Any],
table_name: str
):
print([sender, app_data, table_name])
if dpg.does_item_exist(f'{table_name}_table'):
dpg.delete_item(f'{table_name}_table')
with dpg.table(
tag=f'{table_name}_table',
resizable=True,
policy=dpg.mvTable_SizingStretchProp,
row_background=True,
borders_innerH=True,
borders_outerH=True,
borders_innerV=True,
borders_outerV=True
):
column_names = [column.name for column in database.metadata.tables[table_name].columns.values()]
for column_name in column_names:
dpg.add_table_column(label=column_name)
result = database.connection.execute(database.sqla.text(f"SELECT * FROM '{table_name}';"))
for row in result:
with dpg.table_row():
for value in row:
dpg.add_text(str(value))

# ! Main Window
with dpg.window(tag="hippodrome_app"):
with dpg.tab_bar(label="Hippodrome Tabs"):
with dpg.tab(label="Horses"):
load_table(None, None, 'Horses')
dpg.add_button(label="Update", callback=(lambda sender, app_data: load_table(sender, app_data, 'Horses')))
with dpg.tab(label="Jockeys"):
load_table(None, None, 'Jockeys')
dpg.add_button(label="Update", callback=(lambda sender, app_data: load_table(sender, app_data, 'Jockeys')))
with dpg.tab(label="Races"):
load_table(None, None, 'Races')
dpg.add_button(label="Update", callback=(lambda sender, app_data: load_table(sender, app_data, 'Races')))

# ! Settings
dpg.create_viewport(title=f'{__prog_name__} v{__prog_version__}', width=800, height=350)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.set_primary_window("hippodrome_app", True)

# ! Start
if __name__ == "__main__":
start()

При первом запуске программы таблицы загружаются нормально и без проблем.
Но при нажатии на кнопку «Обновить» выдается ошибка:
Exception:
Error: [1011]
Command: add_*
Item: 104
Label:
Item Type: mvAppItemType::mvTable
Message: Parent could not be deduced.

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "C:\Users\Romanin\AppData\Local\Programs\Python\Python312\Lib\site-packages\dearpygui\dearpygui.py", line 2601, in table
widget = internal_dpg.add_table(label=label, user_data=user_data, use_internal_label=use_internal_label, tag=tag, width=width, height=height, indent=indent, parent=parent, before=before, source=source, callback=callback, show=show, pos=pos, filter_key=filter_key, delay_search=delay_search, header_row=header_row, clipper=clipper, inner_width=inner_width, policy=policy, freeze_rows=freeze_rows, freeze_columns=freeze_columns, sort_multi=sort_multi, sort_tristate=sort_tristate, resizable=resizable, reorderable=reorderable, hideable=hideable, sortable=sortable, context_menu_in_body=context_menu_in_body, row_background=row_background, borders_innerH=borders_innerH, borders_outerH=borders_outerH, borders_innerV=borders_innerV, borders_outerV=borders_outerV, no_host_extendX=no_host_extendX, no_host_extendY=no_host_extendY, no_keep_columns_visible=no_keep_columns_visible, precise_widths=precise_widths, no_clip=no_clip, pad_outerX=pad_outerX, no_pad_outerX=no_pad_outerX, no_pad_innerX=no_pad_innerX, scrollX=scrollX, scrollY=scrollY, no_saved_settings=no_saved_settings, **kwargs)

SystemError: returned a result with an exception set

During handling of the above exception, another exception occurred:

Exception: Error: [1009] Message: No container to pop.

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "D:\Users\Romanin\Desktop\Hippodrome\app.py", line 48, in
dpg.add_button(label="Update", callback=(lambda sender, app_data: load_table(sender, app_data, 'Horses')))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\Users\Romanin\Desktop\Hippodrome\app.py", line 24, in load_table
with dpg.table(
File "C:\Users\Romanin\AppData\Local\Programs\Python\Python312\Lib\contextlib.py", line 137, in __enter__
return next(self.gen)
^^^^^^^^^^^^^^
File "C:\Users\Romanin\AppData\Local\Programs\Python\Python312\Lib\site-packages\dearpygui\dearpygui.py", line 2605, in table
internal_dpg.pop_container_stack()
SystemError: returned a result with an exception set

Я понимаю, почему это происходит, впервые внутри контекстного менеджера dpg открывается контекстный менеджер, который вызывается в методе load_table(...). tab(label="..."), но к моменту открытия приложения этот контекстный менеджер закрывается.
Как ПОЛНОСТЬЮ обновить таблицу (виджет)?
Я пробовал не удалять таблицу, а удалять только ее дочерние виджеты, так как на тот момент не понимал, в чем проблема:
dpg.delete_item(f'{table_name}_table', children_only=True)


Подробнее здесь: https://stackoverflow.com/questions/791 ... -dearpygui
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»