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:
La siguiente imagen muestra la ventana de dialogo para subir la foto:
La siguiente imagen muestra el formulario con los datos sin generar el código QR:
La siguiente imagen muestra la ventana con la información ya procesada y con el código QR generado:
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:
===
¡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: