Tutorial de PyQt. checkbutton, pixmap, QFileDialog y Código QR. Parte 8.

Posted on sáb 23 julio 2011 in Tutorial de Python y PyQt • 3 min read

Este post trata de un formulario en PyQt que se ingresa los datos, una foto, los días que desea por ejemplo apoyar en un evento y genera un código QR con dicha información.

Los widgets nuevos que se utilizarán son:

  • QCheckButton: Permite crear botones check, se pueden seleccionar varios opciones.
  • QPixmap: Permite agregar una imagen a una etiqueta.
  • QFileDialog: Abre una ventana de dialogo para abrir o salvar un archivo.

El código del programa es el siguiente:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#modulo qrencode
from qrencode import encode

#Se importa el modulo sys
import sys 
#De PyQt4 importar QtGui y QtCore
from PyQt4 import QtGui, QtCore

#Import os
import os 



class App(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        #Se define el tamagno y posicion de la ventana
        self.setGeometry(0, 50, 600, 400)

        #Se le coloca un titulo a la ventana y se asocia un icono.
        self.setWindowTitle('Generacion de codigo QR')
        self.setWindowIcon(QtGui.QIcon('./openlogo-50.png'))

        #Se crea la etiqueta para la foto
        foto = QtGui.QLabel("Foto: ")
        self.imagen = QtGui.QLabel("")

        #Se crea el boton para cargar la foton
        cargar = QtGui.QPushButton("Cargar Foto",self)

        #Etiqueta nombre
        self.nombre = QtGui.QLabel('Nombre: ')
        #Entrada de datos del nombre
        self.nombreEdit = QtGui.QLineEdit()

        #Se crea la etiqueta y etrada de datos de la cedula        
        self.etiquetaCedula = QtGui.QLabel("Cedula")
        self.cedula = QtGui.QLineEdit()

        #Se crea la etiqueta y el widget para la fecha
        #de nacimiento        
        fechaEtiqueta = QtGui.QLabel("Fecha de Nacimiento")
        self.fecha = QtGui.QDateEdit(self)
        #Se define el formato dia/mes/agno
        self.fecha.setDisplayFormat("dd/MM/yyyy")
        #Se fija la fecha inicial a la fecha actual
        self.fecha.setDate(QtCore.QDate.currentDate())

        #Se define la etiqueta que pregunta por el sexo
        etiquetaSexo = QtGui.QLabel("Sexo:")
        #Se definen los botones de radio para masculino y femenino
        self.botonradio1 = QtGui.QRadioButton("&Masculino",self)
        self.botonradio2 = QtGui.QRadioButton("&Femenino",self)

        #Etiqueta ciudad.
        self.ciudadEtiqueta = QtGui.QLabel("Ciudad de Nacimiento:")
        #Se define el comboBox con las ciudades
        self.combo = QtGui.QComboBox(self)
        ciudades = ["Maracaibo",
        "Valencia","Maracay","Barquisimeto","Merida","Caracas",
        "San Cristobal","Barinas","El vigia","Ciudad Bolivar",
        "Puerto Ordaz","Coro","Puerto Cabello","Margarita"]
        for ciudad in ciudades:
            self.combo.addItem(ciudad)

        #Se crea la etiqueta de dia de la semana
        diasemana = QtGui.QLabel("Dia semana")
        #Se define los botones de check para los dias de la semana
        self.lunes = QtGui.QCheckBox("Lunes",self)
        self.martes = QtGui.QCheckBox("Martes",self)
        self.miercoles = QtGui.QCheckBox("Miercoles",self)
        self.jueves = QtGui.QCheckBox("Jueves",self)
        self.viernes = QtGui.QCheckBox("Viernes",self)

        #Se define el boton salir
        quit = QtGui.QPushButton('Salir', self)

        #Se define el boton procesar la informacion
        okButton = QtGui.QPushButton("Procesar",self)

        #Se crea la etiqueta que mostrara el codigo QR
        self.label = QtGui.QLabel(self) 

        #Se define un timer
        self.timer = QtCore.QBasicTimer()
        self.step = 0

        #Se empaquetan los widgets en la ventana.
        grid = QtGui.QGridLayout()
        grid.setSpacing(10)
        grid.addWidget(foto,1,0)
        grid.addWidget(self.imagen,1,1)
        grid.addWidget(cargar,1,2)
        grid.addWidget(self.nombre, 2, 0)
        grid.addWidget(self.nombreEdit, 2, 1)
        grid.addWidget(etiquetaSexo,3,0)
        grid.addWidget(self.botonradio1,3,1)
        grid.addWidget(self.botonradio2,3,2)
        grid.addWidget(self.etiquetaCedula,4,0)
        grid.addWidget(self.cedula,4,1)
        grid.addWidget(fechaEtiqueta,5,0)
        grid.addWidget(self.fecha,5,1)
        grid.addWidget(self.ciudadEtiqueta,6,0)
        grid.addWidget(self.combo,6,1)
        grid.addWidget(diasemana,7,0)
        grid.addWidget(self.lunes,7,1)
        grid.addWidget(self.martes,7,2)
        grid.addWidget(self.miercoles,7,3)
        grid.addWidget(self.jueves,7,4)
        grid.addWidget(self.viernes,7,5)
        grid.addWidget(okButton, 8, 0)
        grid.addWidget(self.label,9,1)
        grid.addWidget(quit, 10, 1)
        self.setLayout(grid)

        #Se definen las segnales de los widgets.
        #boton salir, procesar y cargar foto
        self.connect(quit, QtCore.SIGNAL('clicked()'),QtGui.qApp, QtCore.SLOT('quit()'))
        self.connect(okButton,QtCore.SIGNAL('clicked()'),self.Procesar)
        self.connect(cargar, QtCore.SIGNAL('clicked()'), self.showDialog)


    def showDialog(self):
        #Muestra una ventana de dialogo para abrir un archivo
        #guarda la ruta del archivo.
        self.filename = QtGui.QFileDialog.getOpenFileName(self, 'Open file',
                    '/home')

        #Se define la imagen en la etiqueta
        pixmap = QtGui.QPixmap("%s" %self.filename)
        self.imagen.setPixmap(pixmap)



    def Procesar(self):
        #Captura la informacion y genera el codigo QR

        #Define el resultado de los botones de radio
        if self.botonradio1.isChecked() == True:
            sexo = "Masculino"
        elif self.botonradio2.isChecked() == True:
            sexo = "Femenino"

        #Se procesa la informacion de los botones de check
        lista = {}
        dias = ("Lunes","Martes","Miercoles","Jueves","Viernes")
        lista["Lunes"] = self.lunes.isChecked()
        lista["Martes"] = self.martes.isChecked()
        lista["Miercoles"] = self.miercoles.isChecked()
        lista["Jueves"] = self.jueves.isChecked()
        lista["Viernes"] = self.viernes.isChecked()
        resultado = ""
        flag = 0
        for dia in lista.keys():
            for i in dias:
                if dia == i:
                    if lista[dia] == True:
                        if flag == 0:
                            resultado = dia
                            flag = 1
                        elif flag == 1:
                            resultado = resultado + ",%s" %dia

        #Se le da formato a la informacion recabada para generar el codigo QR
        texto = """
        Nombre:%s\n
        Cedula: %s\n
        Fecha Nacimiento: %s\n
        Sexo: %s\n
        Foto: %s\n
        Dia de participacion: %s\n

        """ %(self.nombreEdit.text(),
            self.cedula.text(),
            self.fecha.textFromDateTime(self.fecha.dateTime()),
            sexo,
            self.filename,
            resultado)

        #Se verifica si el archivo del codigo qr no existe, si no se borra
        if os.path.isfile("./archivosalida.png"):
            remove("./archivosalida.png")

        #Se crea la imagen del codigo qr
        imagen = encode(texto)[2]
        #Se salva la imagen en un archivo.
        imagen.save("./archivosalida.png")

        #Se muestra la imagen en la etiqueta
        pixmap = QtGui.QPixmap("./archivosalida.png")
        self.label.setPixmap(pixmap)

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 siguiente figura muestra la aplicación al iniciarse:

PyQt 8

La siguiente imagen muestra la ventana de dialogo para subir la foto:

PyQt 8

La siguiente imagen muestra el formulario con los datos sin generar el código QR:

PyQt 8

La siguiente imagen muestra la ventana con la información ya procesada y con el código QR generado:

PyQt 8

Por último se muestra la imagen de un celular con Android donde se proceso el código QR y muestra la información del mismo:

PyQt 8

===

¡Haz tu donativo! Si te gustó el artículo puedes realizar un donativo con Bitcoin (BTC) usando la billetera digital de tu preferencia a la siguiente dirección: 17MtNybhdkA9GV3UNS6BTwPcuhjXoPrSzV

O Escaneando el código QR desde billetera:

17MtNybhdkA9GV3UNS6BTwPcuhjXoPrSzV