Форум сайта python.su
Доброго времени всем. Такой вопрос. Есть например окно с двумя виджетами. Слева виджет с кнопками типа меню, а справа все меняется при переключении этих кнопок меню. Вопрос такой тыкнули на меню и справа там появилась таблица смотрим данные какие то. Потом после переключения на другое меню и возвращаемся обратно то есть тыкнули и там уже таблица пустая без данных. То есть проблема понятно у меня на каждую кнопку создаются новые виджеты справа и поэтому данные обнуляются,а хотелось бы в некоторых виджетах сохранить данные, то есть не создавать виджет. Нужен минимальный пример,например 2 кнопки типа меню и виджет к каждой кнопке прикрутить. Задача когда тыкнули на одну кнопку появился виджет с данными,ввели какие то данные например в поле ввода. Потом захотели перейти на другой виджет по другой кнопке и при возврате на первую кнопку чтобы данные не стерлись из поля ввода.
Офлайн
Более конкретный пример. Допустим слева кнопка 1 и кнопка 2. Справа центральный виджет где все будет меняться, то есть как бы главная область. Нажали на первую кнопка и справа создается виджет и в нем таблица и прочие виджеты. Загружаю извне например данные в таблицу,поделал что-то. Потом нажали на вторую кнопку и справа создается виджет с формой или что то другое не важно. Затем снова нажал на первую кнопку и хотелось бы чтобы отобразилось то что уже есть то есть таблица с данными,а у меня там создается снова виджет,таблица и приходится снова загружать данные. То есть по логике хотелось бы у первой кнопки создать виджеты справа один раз и при переходе по другим кнопкам этот виджет скрывать или открывать. То есть нужен пример как правильно написать. Pyqt5
Офлайн
Все вопрос решен. Получилось сделать с помощью hide и show. Буду переписывать код и если будут вопросы то отпишусь.
Офлайн
> То есть нужен пример как правильно написать. Pyqt5
Смотри в сторону QStackedWidget
Офлайн
Ser5+Архитектурно нужно разделить одну сущность “виджет” на две сущности “виджет” и “объект с данными для виджета”. При переключении можно очищать содержимое объекта с данными или оставлять содержимое объекта с данными. И при создании виджета объект с данными агрегируется в виджете (это значит, что время жизни виджета и время жизни объекта не совпадают). Так, если виджет уничтожается, то объект с данными продолжает существовать. Если виджет создаётся снова, то к нему привязывается тот же самый объект с данными. Таким образом при некоторых переключениях ты можешь очищать объект с данными, а при некоторых переключениях ты можешь оставлять объект с данными заполненным какими-то данными.
Есть например окно с двумя виджетами. Слева виджет с кнопками типа меню, а справа все меняется при переключении этих кнопок меню. Вопрос такой тыкнули на меню и справа там появилась таблица смотрим данные какие то. Потом после переключения на другое меню и возвращаемся обратно то есть тыкнули и там уже таблица пустая без данных. То есть проблема понятно у меня на каждую кнопку создаются новые виджеты справа и поэтому данные обнуляются,а хотелось бы в некоторых виджетах сохранить данные, то есть не создавать виджет.
Ser5+Потому что между ними сделано отношение композиции, а не агрегации. При композиции у них время жизни совпадает.
а у меня там создается снова виджет,таблица
>>> class Widget: ... def __init__(self, table): ... self.table = table ... >>> class Table: ... def __init__(self): ... self.data = 'abc' ... >>> table = Table() >>> >>> widget = Widget(table) >>> print(widget.table.data) abc >>> >>> del widget >>> >>> print(table.data) abc >>>
>>> class Widget: ... def __init__(self): ... self.table = Table() ... >>> class Table: ... def __init__(self): ... self.data = 'abc' ... >>> widget = Widget() >>> print(widget.table.data) abc >>> >>> del widget >>> >>> print(widget.table.data) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'widget' is not defined. Did you mean: 'Widget'? >>>
Ser5+Да он громоздкий. Если правильно писать, это надо сделать отдельную форму.
То есть нужен пример как правильно написать.
Отредактировано py.user.next (Июнь 26, 2025 02:06:36)
Офлайн