Рубрики
Без рубрики

Позвольте пользователям изменять содержимое wx.combobox в wxpython

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

На этой неделе я столкнулся с кем-то, кто был удивлен, был ли способ позволить пользователю редактировать содержимое wx.combobox Отказ Редактируя содержимое, я имею в виду изменения имени ранее существующего варианта, что Combobox содержит, не добавляя новые элементы в виджета.

При редактировании содержимого выбранного элемента в Combobox работает из коробки, виджет не будет автоматически сохранять эти редакции. Поэтому, если вы что-то редактируете, а затем выберите другой вариант в Combobox, отредактированный элемент вернется к тому, что он был ранее, и ваши изменения будут потеряны.

Давайте узнаем, как вы можете создать Combobox, который позволяет этой функциональности!

Создание приложений GUI с покупкой WXPYPHON теперь на LeanPub или Amazon

Изменение Combobox.

Первый шаг при попытке что-то новое – написать какой-нибудь код. Вам нужно будет создать экземпляр wx.combobox И пропустите его список вариантов, а также установите выбор по умолчанию. Конечно, вы не можете создать один виджет в изоляции. Виджет должен быть внутри родительского виджета. В Wxpython вы почти всегда хотите, чтобы родитель был wx.panel Это внутри wx.frame Отказ

Давайте напишем какой-нибудь код и посмотрим, как это все расплачивается:

import wx

class MainPanel(wx.Panel):

    def __init__(self, parent):
        super().__init__(parent)

        self.cb_value = 'One'

        self.combo_contents = ['One', 'Two', 'Three']
        self.cb = wx.ComboBox(self, choices=self.combo_contents,
                              value=self.cb_value, size=(100, -1))

        self.cb.Bind(wx.EVT_TEXT, self.on_text_change)
        self.cb.Bind(wx.EVT_COMBOBOX, self.on_selection)

    def on_text_change(self, event):
        current_value = self.cb.GetValue()
        if current_value != self.cb_value and current_value not in self.combo_contents:
            # Value has been edited
            index = self.combo_contents.index(self.cb_value)
            self.combo_contents.pop(index)
            self.combo_contents.insert(index, current_value)
            self.cb.SetItems(self.combo_contents)
            self.cb.SetValue(current_value)
            self.cb_value = current_value
            
    def on_selection(self, event):
        self.cb_value = self.cb.GetValue()

class MainFrame(wx.Frame):

    def __init__(self):
        super().__init__(None, title='ComboBox Changing Demo')
        panel = MainPanel(self)
        self.Show()


if __name__ == "__main__":
    app = wx.App(False)
    frame = MainFrame()
    app.MainLoop()

Основная часть кода, которую вы заинтересованы в том, это внутри Mainpanel класс. Здесь вы создаете виджет, установите свой список вариантов и пару других параметров. Далее вам нужно будет связать Combobox к двум событиям:

  • wx.evt_text – Для событий изменения текста
  • wx.evt_combobox – Для изменения событий выбора предметов

Первое событие, wx.evt_text , уволен, когда вы измените текст в виджете, набрав, и он также срабатывает при изменении выбора. Другое событие только загоняет при изменении выбора. wx.evt_text Сначала событие стреляет, поэтому он имеет приоритет над wx.evt_combobox Отказ

Когда вы меняете текст, on_text_change () называется. Здесь вы проверяете, соответствует ли текущее значение Combobox значение, которое вы ожидаете его. Вы также проверяете, соответствует ли текущее значение «Список выбора», который в настоящее время устанавливается. Это позволяет вам увидеть, изменил ли пользователь текст. Если у них есть, то вы хотите получить индекс выбранного в данный момент элемента в свой список выбора.

Затем вы используете список POP () Способ удаления старой строки и Вставить () Способ добавить новую строку на его месте. Теперь вам нужно позвонить в виджете SetiTems () Способ обновления его Выбор список. Затем вы устанавливаете его значение на новую строку и обновите CB_Value Переменная экземпляра, чтобы вы могли проверить, снова это изменяется позже.

on_selection () Метод короткий и сладкий. Все это делает, это обновление CB_Value к тому, что существует текущий выбор.

Дайте код попытаться посмотреть, как он работает!

Обертывание

Добавление возможности разрешить пользователю обновлять wx.combobox Содержание не особенно тяжело. Вы могли бы даже подкласс wx.combobox И создайте версию, где она делает это для вас все время. Другое улучшение, которое может быть удовольствием добавления, это иметь виджет нагружать свой выбор из файла конфигурации или файла json. Тогда вы могли бы обновить on_text_change () Чтобы сохранить ваши изменения на диске, а затем ваше приложение может сохранить выбор и перезагрузить их в следующий раз, когда вы начнете приложение.

Весело и счастливое кодирование!