Обновление содержимого панели в wxPython

#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