#python #wxpython
#python #wxpython
Вопрос:
Каков подход к обновлению виджетов в wxPanel на основе событий из других элементов управления на той же панели?
Сценарий 1 обновляет список выпадающего списка на основе того, что было выбрано из другого выпадающего списка, где оба находятся на одной панели.
Сценарий 2 показывает новый элемент управления / виджет на панели на основе события.
В принципе, создавать новые элементы управления легко, но я не знаю, как обновить / обновить мою панель, чтобы сразу показать их.
Ответ №1:
Сценарий 1
Чтобы изменить параметры выпадающего self.cbx
списка, вы можете использовать любой из следующих методов:
self.cbx.SetItems(choices)
где choices — это полный список вариантов.
self.cbx.SetString(n, string)
это устанавливает строку в позицию n.
InsertItems(items, pos)
Вставляет список строк в аргументе items в поле списка перед позицией в аргументе pos.
Обратите внимание, что метод Set(choices)
listboxes не существует для списка в выпадающих списках. Вместо этого вы должны использовать SetItems(choices)
(это четко не указано в некоторых учебниках).
Если вы хотите, чтобы эти изменения произошли в результате выбора в другом выпадающем self.cbx_1
списке, просто получите event ( self.Bind(wx.EVT_COMBOBOX, on_combo_1, self.cbx_1)
) первого выпадающего списка, обработайте свои данные по своему усмотрению в соответствующем self.on_combo
методе и используйте один из вышеуказанных методов для изменения второго выпадающего списка.
Например:
def on_combo_1(self, evt):
"append cbx_1 selection to cbx if not already in cbx"
selection = self.cbx_1.GetStringSelection()
cbx_choices = self.cbx.GetItems()
if selection not in cbx_choices:
cbx_choices.append(selection)
self.cbx.SetItems(cbx_choices)
Тот факт, что выпадающие списки находятся на одной или разных панелях, для этого не имеет значения.
Сценарий 2
Обычно вы помещаете свои виджеты внутри sizers. Чтобы скрыть или сделать видимыми элементы в sizer, вы вызываете методы Show
Hide
или Layout
:
Show(self, item, show=True, recursive=false)
Показывает или скрывает элемент, управляемый настройщиком. Чтобы заставить элемент sizer исчезнуть или появиться снова, используйте Show
followed by Layout
. Параметром элемента может быть окно, размер или нулевой индекс элемента. Используйте рекурсивный параметр, чтобы показать или скрыть элемент в subsizer. Возвращает True, если элемент был найден.
Hide(self, item, recursive)
Удобный метод для Show (item, False, recursive)
.
Layout(self)
Этот метод приведет к принудительному пересчету и размещению элементов, контролируемых калибровщиком, с использованием текущего пространства, выделенного для калибровщика. Обычно это вызывается автоматически из обработчика EVT_SIZE окна владельца, но также полезно вызывать его из пользовательского кода, когда один из элементов в sizer изменяет размер, или элементы добавляются или удаляются.
Ссылки на wxPython в действии :, Ноэль Раппин и Робин Данн
Ответ №2:
Для первого сценария вы должны сделать что-то вроде следующего (при условии, что первый combobox привязан к его EVT_COMBOBOX:
value = self.cboOne.GetValue()
if value == "something":
self.cboTwo.SetItems(someList)
Для отображения нового виджета вы можете создать его, а затем при необходимости использовать Show() / Hide() . Если виджет находится в sizer, то используйте методы добавления или вставки Sizer. Он также имеет метод отсоединения, который можно использовать для скрытия виджетов или просто вызвать Hide. Смотрите Документацию для получения дополнительной информации: http://www.wxpython.org/docs/api/wx.Sizer-class.html