¿Cómo utiliza Python el cuadro combinado de wxpython para hacer que la lista desplegable proporcione automáticamente una lista opcional que contenga el carácter al escribir?
¿Importar? talla extra grande mujer talla extra grande mujer
¿Clase? AutoCompleteComboBox(wx.comboBox):
def? __init__(self, *params, ?* *quart):
super(AutoCompleteComboBox, ?self). __init__(*args, **kwacha)
¿Autoseleccionar? =?[]
Auto. enlace ( wx . EVT_TEXT , ? self . context )
self . bind(wx. EVT ComboBox, ? self. OnSelect)
def? SetChoices(self, elección):
¿Autoseleccionar? =?Seleccionar
def? contexto(yo, evento):
¿Texto_de entrada? =?evento. GetString()
¿Y si? ¿No es así? input_text:
auto. Establecer elementos (autoselección)
Volver
¿Filter_select? =?【¿Elegir? ¿para qué? ¿elegir? ¿existir? ¿Autoselección? ¿si? input_text.inferior()? ¿existir? Choice.lower()]
Auto. SetItems(filtered_choices)
Auto. Menú emergente()
def? OnSelect(self, event):
¿Pasó
Clase? MiMarco(wx.Frame):
def? __init__(self, padre, ? título):
super(MyFrame, ? self). __init__(padre, título=título,? tamaño=(400,?300))
¿Panel? =?wx. panel(self)
self. bind(wx.evt_close?self.OnClose)
¿Seleccionar? =?【「Manzana」,? "banana",? "cereza",? "fecha",? "Higo",? "Uva",? ¿"Kiwi"? "limón",? "mango",? "naranja"]
self.combo_box? =?AutoCompleteComboBox(panel,?pos=(50,?50),?size=(200,?-1),?select=select,?style=wx.CB_menú desplegable)
self .combo_box. SetChoices(seleccionar)
def? OnClose(self,? evento):
Self. destruir()
¿Si? __nombre__? ==?" __main__ "
¿aplicación? =?wx. Aplicación(Falso)
¿Marco? =?MiMarco(Ninguno, "Autocompletar?ComboBox?Ejemplo")
Marco. display()
aplicación. Main loop()
En este ejemplo, primero creamos una clase AutoCompleteComboBox, que hereda de wx. Agregamos el método SetChoices en esta clase para configurar todas las opciones posibles. Luego, monitoreamos los cambios en el texto en el cuadro de entrada monitoreando wx. Evento EVT_texto. Cuando el texto cambia, filtramos las opciones en la lista desplegable según el texto ingresado y mostramos los resultados filtrados.
Tenga en cuenta que los datos utilizados en este ejemplo son una lista fija de cadenas. Si necesita obtener datos de la base de datos, simplemente reemplace las opciones con los resultados de la consulta de la base de datos.
…………
Respuesta:
Después de una inspección cuidadosa, descubrí que efectivamente hay un problema al actualizar el elemento ComboBox en el método OnText. Cuando configuramos un elemento usando el método SetItems, el contenido del cuadro de texto se borrará, lo que activará otro wx. Evento EVT_texto. Por lo tanto, necesitamos modificar ligeramente el método OnText para evitar la recursividad infinita.
El siguiente es un ejemplo de código fijo:
Importar wx
Clase AutoCompleteComboBox(wx. ComboBox):
def __init__(self , *args, **kwargs):
super(AutoCompleteComboBox, self). __init__(*args, **kwargs)
self.choices = []
self. enlace ( wx . EVT _ texto , self . contexto )
self . bind(wx.EVTComboBox, self.OnSelect)
definir colección select(self, select):
selfSelect = select
definir contexto( self, evento) :
Ingresar texto = evento. GetString()
Si no ingresa texto:
Self. Establecer elementos (autoselección)
Regresar
filtrado _ opciones =[elección de elección en auto opciones si entrada _ texto inferior() en opción inferior()]<. / p>
#Evite llamadas recursivas a OnText al configurar proyectos.
Yo mismo. unbind(wx.evt_text)
self. SetItems(filtered_choices)
Auto. enlazar (wx. EVT _ texto, self. contexto)
self. ¿Establecer valor (texto de entrada)? #Restablecer el valor del texto después de actualizar el elemento
self. ¿EstablecerInsertionPointEnd()? #Mover el cursor al final del texto
self. Menú emergente()
Definir OnSelect(self, evento):
Pasar
# ...(el resto del código sigue siendo el mismo) p >
El cambio clave aquí es desvincular wx. evento EVT_TEXT y luego volver a vincular el evento después de configurar el elemento. De esta manera, cuando actualicemos el elemento, no se activará el método OnText. También usamos el método SetValue para restablecer el valor del texto y mover el cursor al final del texto.
Después de estos cambios, el código debería ejecutarse correctamente sin provocar una recursividad infinita y una lista creciente de elementos.
…………
Respuesta:
El siguiente es un ejemplo de código modificado según sus requisitos. La modificación principal es utilizar el método ChangeValue en lugar del método SetValue para establecer el valor del texto después de actualizar el elemento ComboBox, cambiando así el valor del texto sin activar el evento EVT_Text.
Importar wx
Clase AutoCompleteComboBox(wx. ComboBox):
def __init__(self, *args, **kwargs):
super(AutoCompleteComboBox, uno mismo). __init__(*args, **kwargs)
self.choices = []
self. enlace ( wx . EVT _ texto , self . contexto )
self . enlazar(wx. EVTComboBox, self.
OnSelect)
Definir selección de colección(self, select):
Auto selección = seleccionar
Definir contexto(self, evento):
texto de entrada = evento. GetString()
Si no ingresa texto:
Self. Establecer elementos (autoselección)
Regresar
filtrado _ opciones =[elección de elección en auto opciones si entrada _ texto inferior() en opción inferior()]<. / p>
#Evite llamadas recursivas a OnText al configurar proyectos.
Yo mismo. unbind(wx.evt_text)
self. SetItems(filtered_choices)
Auto. enlace ( wx . EVT _ texto , self . contexto )
self . ¿Cambiar valor (texto de entrada)? #Establecer valor de texto sin activar el texto EVT
self. ¿EstablecerInsertionPointEnd()? #Mover el cursor al final del texto
self. Menú emergente()
Definir OnSelect(self, evento):
Pasar
# ...(el resto del código sigue siendo el mismo) p >
Ahora, después de actualizar el valor de entrada usando el método ChangeValue, el texto en el cuadro de entrada permanecerá sin cambios y se pueden ingresar múltiples caracteres continuamente. El ComboBox filtrará las opciones según el valor de entrada y mostrará las opciones correctas.