Combinar 2 combobox en PyQt - Python
Esta entrada la hago con el fin de dejar documentado como combinar 2 combobox (en su momento me dio mucho dolor de cabeza encontrar una solución).
En el ejemplo, creare una pequeña aplicación gráfica que tendrá 2 combobox, una etiqueta (Resultado) y un botón (Ver).
La gracia de la aplicación será, que al seleccionar una opción del primer combobox, de diferentes opciones en el segundo combobox, y dependiendo de lo que seleccionemos en este último, será lo que se muestre en la etiqueta (Resultado) al apretar el botón (Ver).
El primer combobox tendrá 2 cursos de programación (Python y Java). El segundo combobox tendrá los nombres de los alumnos del curso (según el curso seleccionado).
Si no viste la primera entrada que hice sobre aplicaciones gráficas con PyQt y Designer, puedes verla aquí: https://www.pythondiario.com/2014/11/primera-aplicacion-con-qt-designer-y_16.html , así nos ahorramos en explicar cosas ya vistas.
Nombres de los objetos en QtDesigner:
Primer comboBox: comboBox
Segundo comboBox: comboBox_2
Etiqueta: Resultado
Botón: btn_Ver
Diseño Gráfico de la aplicación en QtDesigner
Diseño en QtDesigner |
A el primer combobox le agregamos los elementos (Python y Java) dando doble click sobre el mismo, en QtDesigner. Se verá un símbolo de + para agregar elementos.
Agregar elementos al combobox |
Guardar el proyecto
Ahora, crearemos una carpeta en el escritorio con el nombre: combobox. Dentro de ella guardaremos el diseño de Designer con el nombre combobox.ui. Por último, dentro de la misma carpeta creamos un archivo python con el nombre: combobox.py . Abrimos el archivo y copiamos lo siguiente:
#!/usr/bin/python # -*- coding: utf-8 -*- # www.pythondiario.com # Combinar 2 ComboBox import sys from PyQt4 import QtCore, QtGui, uic # Cargar nuestro archivo .ui form_class = uic.loadUiType("combobox.ui")[0] class MyWindowClass(QtGui.QMainWindow, form_class): def __init__(self, parent=None): QtGui.QMainWindow.__init__(self, parent) self.setupUi(self) #Rellana los datos por primera ves del comboBox_2 self.llenar_comboBox2() #Señal para cambiar, segun la selecccion, el comboBox_2 QtCore.QObject.connect(self.comboBox, QtCore.SIGNAL("currentIndexChanged(QString)"), self.llenar_comboBox2) self.btn_Ver.clicked.connect(self.btn_Ver_clicked) # Evento del boton Ver def btn_Ver_clicked(self): x = self.comboBox_2.currentText() self.Resultado.setText(x) # Llena el comboBox_2 def llenar_comboBox2(self): python = ["Diego", "Martin", "Lorena"] java = ["Sergio", "Maria", "Miguel"] self.comboBox_2.clear() if self.comboBox.currentText() == "Python": self.comboBox_2.addItems(python) elif self.comboBox.currentText() == "Java": self.comboBox_2.addItems(java) if __name__ == "__main__": app = QtGui.QApplication(sys.argv) MyWindow = MyWindowClass(None) MyWindow.show() app.exec_()
Análisis del código:
Este código sirve como base para otros ejemplos que ustedes necesiten realizar. Lo único que se cambia es el archivo.ui que se necesita utilizar (en mi ejemplo cargo combobox.ui) y las señales y funciones que nuestra aplicación demande.
Como siempre, arrancamos importando lo necesario y cargando nuestro archivo de diseño(.ui):
import sys from PyQt4 import QtCore, QtGui, uic # Cargar nuestro archivo .ui form_class = uic.loadUiType("combobox.ui")[0]
Luego definimos en la función __init__ :
#Rellana los datos por primera ves del comboBox_2 self.llenar_comboBox2() #Señal para cambiar, segun la selecccion, el comboBox_2 QtCore.QObject.connect(self.comboBox, QtCore.SIGNAL("currentIndexChanged(QString)"), self.llenar_comboBox2) self.btn_Ver.clicked.connect(self.btn_Ver_clicked)
self.comboBox2() -- Se detalla más adelante en la función llenar_comboBox2
QtCore.QObject.connect(self.comboBox, QtCore.SIGNAL("currentIndexChanged(QString)"),self.llenar_comboBox2) -- Esta señal se encarga de conectar los 2 comboBox y hará que cambie el segundo, dependiendo de la selección del primero.
Las funciones:
Llenar el comboBox 2
def llenar_comboBox2(self): python = ["Diego", "Martin", "Lorena"] java = ["Sergio", "Maria", "Miguel"] self.comboBox_2.clear() if self.comboBox.currentText() == "Python": self.comboBox_2.addItems(python) elif self.comboBox.currentText() == "Java": self.comboBox_2.addItems(java)
Esta función será la encargada de agregar los elementos al comboBox_2 dependiendo de lo que se selecciones en el comboBox 1.
Se crean 2 listas con los integrantes de cada curso (Python y Java).
self.comboBox_2.clear() arranca la función borrando los elementos del comboBox_2 para que no se acumulen.
Self.comboBox.currentText() == "Python" verifica si lo que está seleccionado actualmente en el comboBox 1 es Python (si es así, agrega los alumnos de la lista python). La otra opción hace lo mismo para Java.
Al agregar en el __init__ la señal "currentIndexChanged(QString)" asociada a la función: llenar_comboBox2, el comboBox_2 modifica los alumnos cada vez que elegimos un curso.
Función del botón Ver:
def btn_Ver_clicked(self): x = self.comboBox_2.currentText() self.Resultado.setText(x)
Esta función guarda en la variable x el elemento que actualmente está seleccionado en el comboBox_2.
Luego modifica la etiqueta Resultado con el nombre del alumno seleccionado al apretar el botón Ver.
Espero esta información les sea de utilidad a la hora de crear aplicaciones gráficas. Cualquier duda o sugerencia dejar los comentarios en la entrada.
Saludos
-
-
Hola Emilio, gracias por visitar el blog y con gusto me daré una vuelta por el tuyo. El primer combobox lleva los elementos (Python y Java). Mañana agrego otra captura de pantalla para que se vean.
Saludos
-
-
Muchas gracias Emilio, tu blog me esta ayudando mucho, muy explicativo e ilustrativo.
Gracias por compartir con los demás tu día a día.
Un saludo desde Gran Canaria (Canarias, Spain)
-
buen blog
el código de este ejemplo sin embargo lo veo mejorable, por poner un ejemplo, las conexiones, usas el estilo antiguo q no es nada pythonico, seria más sencillo:
self.combobox.currentIndexChanged.connect(self.llenar_combobox2) -
buen blog
el código de este ejemplo sin embargo lo veo mejorable, por poner un ejemplo, las conexiones, usas el estilo antiguo q no es nada pythonico, seria más sencillo:
self.combobox.currentIndexChanged.connect(self.llenar_combobox2)-
Gracias volante por tu sugerencia y por visitar el blog. Lo voy a tener en cuenta en futuras entradas. Saludos
-
Deja una respuesta
Hola Digo:
Felicito tu iniciativa con este blog. De mi parte estoy incursionando en Python, aunque quiero especializarme en la web a través de Django. A medida que vaya avanzando iré publicando algunos tips en mi blog, que por ahora tengo abandonado. Así que espero compartir contenido contigo en un futuro.
Mi blog es: http://www.flonux.com
NOTA: No estaría de más que incluyeras una captura de pantalla llenando los items del primer comboBox, ya que fue lo único que me dio problemas al no tomarlo en cuenta. Me di cuenta, porque no lo vi en el código del archivo .py.
Un Saludo