25 jun. 2011

Tutorial de PyQt. Parte 3

Continuando con los tutoriales de Python+Qt.

Esta vez se explicara una aplicación que maneje varios widgets, una entrada de datos para capturar el nombre de una persona, un comboBox que maneja una lista de ciudades, se muestra el botón aceptar que al darle clip muestra la información escrita y seleccionada; y el botón salir que al darle clip se sale del programa, también se definio que al darle cerrar a la ventana abra una ventana de dialogo que confirma la salida de la aplicación y que la aplicación tenga una imagen como icono en su ventana.

La documentación de referencia de las clases de PyQt lo pueden revisar en este enlace.

El código del programa  se muestra a continuación:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
     
#Se importa el modulo sys
import sys 
#De PyQt4 importar QtGui y QtCore
from PyQt4 import QtGui, QtCore


#Se crea la clase App que hereda de la clase QWidget.


class App(QtGui.QWidget):
    def __init__(self, parent=None):
       QtGui.QWidget.__init__(self, parent)
       #Se define el tamano de la ventana
       self.setGeometry(400, 400, 250, 150)
        #Se le coloca un titulo a la ventana y se asocia un icono. 
       self.setWindowTitle('Programa de prueba') 
       self.setWindowIcon(QtGui.QIcon('./openlogo-50.png'))
       
       #Se define los widgets dentro de la ventana
       #Etiqueta nombre
       self.nombre = QtGui.QLabel('Nombre: ')
       #Entrada de datos del nombre
       self.nombreEdit = QtGui.QLineEdit()
       #Etiqueta ciudad.
       self.ciudadEtiqueta = QtGui.QLabel("Ciudad:")
       #Se define el comboBox con las ciudades
       self.combo = QtGui.QComboBox(self)
       ciudades = ["Valencia","Maracay","Barquisimeto","Merida","Caracas"]
       
       for ciudad in ciudades:
 self.combo.addItem(ciudad)
 


 
       #Se define la etiqueta resultado
       #con campo de nombre y ciudad y 2
       #etiquetas donde se mostraran los resultados.
       self.resultado = QtGui.QLabel("Resultados: ")
       self.resultadoNombre = QtGui.QLabel("")
       self.resultadoCiudad = QtGui.QLabel("")
       self.etiquetaNombre = QtGui.QLabel("Info nombre:")
       self.etiquetaCiudad = QtGui.QLabel("Info Ciudad:")
       
       #Se define el boton para salir
       quit = QtGui.QPushButton('Salir', self)
       #Se define el boton aceptar
       okButton = QtGui.QPushButton("Aceptar",self)


       #Se define como empaquetar los widgets.
       #En este caso se usa grilla.
       #Se crea la instancia
       grid = QtGui.QGridLayout()
       grid.setSpacing(10)
       #Se agrupan los widgets pasando el
       #objeto luego el orden en vertical, el orden en
       #horizontal.
       grid.addWidget(self.nombre, 1, 0)
       grid.addWidget(self.nombreEdit, 1, 1)
       grid.addWidget(self.ciudadEtiqueta,2,0)
       grid.addWidget(self.combo,2,1)
       grid.addWidget(self.resultado,3,0)
       grid.addWidget(self.etiquetaNombre,4,0)
       grid.addWidget(self.resultadoNombre,4,1)
       grid.addWidget(self.etiquetaCiudad,5,0)
       grid.addWidget(self.resultadoCiudad,5,1)
       grid.addWidget(okButton, 6, 0)
       grid.addWidget(quit, 6, 1)
       


       #Se define el layout pasando la grilla
       self.setLayout(grid)

       
       #Se asocian las segnales del boton salir y aceptar
       #Se conecta el boton quit, con la segnal pasandole  el evento clicked, y se 
      #llama a qApp. en el boton aceptar se llama a buttonClicked.
       self.connect(quit, QtCore.SIGNAL('clicked()'),QtGui.qApp, QtCore.SLOT('quit()'))
       self.connect(okButton, QtCore.SIGNAL('clicked()'), self.buttonClicked)
    
    
    def buttonClicked(self):
 """Metodo del boton aceptar que captura
 la informacion del campo nombre y del comboBox ciudad
 y la muestra en 2 etiquetas como resultado
 """
 #Se captura la entrada de datos del nombre y se le pasa
 #a la etiqueta resultadoNombre
        self.resultadoNombre.setText(self.nombreEdit.text())
 #Se captura la seleccion del combo y se le pasa a la
 #etiqueta resultadoCiudad.
 self.resultadoCiudad.setText(self.combo.currentText())
        
    
    def closeEvent(self, event):
 """Evento que permite abrir una
 ventana de dialogo para confirmar la salida del programa
 """
 #Se genera la respuesta de la confirmacion de salir
        reply = QtGui.QMessageBox.question(self, 'Mensaje',
            "Seguro que desea salir?", QtGui.QMessageBox.Yes | 
            QtGui.QMessageBox.No, QtGui.QMessageBox.No)


        #Si se selecciona Si se acepta el evento, si se selecciona
 #no se ignora el evento
 if reply == QtGui.QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()
    
    


#Se ejecuta el programa principal
if __name__ == "__main__":    
   #Se instancia la clase QApplication    
   app = QtGui.QApplication(sys.argv)    
   #Se instancia el objeto QuitButton    
   qb = App()    
   #Se muestra la aplicacion    
   qb.show()    
   #Se sale de la aplicacion    
   sys.exit(app.exec_())
  
La figura muestra la venta de la aplicación al iniciarse:

Se escribe el nombre y se selecciona la ciudad y se le da clip al botón aceptar:

Se muestra el resultado luego de darle clip al botón aceptar:

Se le da clip para cerrar ventana:

Y pregunta si desea confirmar salir de la aplicación:

Publicar un comentario en la entrada

AddThis