viernes, 26 de junio de 2015

6 - Python PyQt (Interfaz gráfica) - Validar formularios con expresiones regulares




En este capítulo del tutorial de Python 3 con PyQt5 veremos como podemos ir validando los campos de los formularios utilizando expresiones regulares.

Crearemos un archivo .ui con Designer llamado validacion.ui. El formulario será un cuadro de diálogo sin botones (Dialog without Buttons).

  • Agregaremos un campo Line Edit al cual llamaremos nombre y con su respectiva etiqueta Label.
  • Agregaremos un campo Line Edit al cual llamaremos email y con su respectiva etiqueta Label.
  • Agregaremos un campo Spin Box al cual llamaremos edad para incluir un rango de números enteros y con su respectiva etiqueta Label.
  • Y finalmente agregaremos un botón Push Button al cual llamaremos boton y tendrá el texto Validar.


Los campos nombre y email se irán validando al mismo tiempo que su texto cambia (textChanged), cada cual con su respectivo método de validación validar_nombre() y validar_email(), ambos métodos regresan un valor boolean, si es True es una validación correcta, si es False no.

Al hacer click sobre el botón (clicked), comprobaremos a través de un método llamado validar_formulario() si los métodos validar_nombre() y validar_email() regresan el valor True, de ser así es que el formulario es correcto y mostraremos un mensaje informando de que el formulario es correcto, de lo contrario, mostraremos un mensaje advirtiendo de que es incorrecto.

validacion.pyw

import sys, re
from PyQt5.QtWidgets import QApplication, QDialog, QMessageBox
from PyQt5 import uic

class Dialogo(QDialog):
	def __init__(self):
		QDialog.__init__(self)
		uic.loadUi("validacion.ui", self)
		self.nombre.textChanged.connect(self.validar_nombre)
		self.email.textChanged.connect(self.validar_email)
		self.boton.clicked.connect(self.validar_formulario)
		
	def validar_nombre(self):
		nombre = self.nombre.text()
		validar = re.match('^[a-z\sáéíóúàèìòùäëïöüñ]+$', nombre, re.I)
		if nombre == "":
			self.nombre.setStyleSheet("border: 1px solid yellow;")
			return False
		elif not validar:
			self.nombre.setStyleSheet("border: 1px solid red;")
			return False
		else:
			self.nombre.setStyleSheet("border: 1px solid green;")
			return True
			
	def validar_email(self):
		email = self.email.text()
		validar = re.match('^[a-zA-Z0-9\._-]+@[a-zA-Z0-9-]{2,}[.][a-zA-Z]{2,4}$', email, re.I)
		if email == "":
			self.email.setStyleSheet("border: 1px solid yellow;")
			return False
		elif not validar:
			self.email.setStyleSheet("border: 1px solid red;")
			return False
		else:
			self.email.setStyleSheet("border: 1px solid green;")
			return True
		
	def validar_formulario(self):
		if self.validar_nombre() and self.validar_email():
			QMessageBox.information(self, "Formulario correcto", "Validación correcta", QMessageBox.Discard)
		else:
			QMessageBox.warning(self, "Formulario incorrecto", "Validación incorrecta", QMessageBox.Discard)
		
		
app = QApplication(sys.argv)
dialogo = Dialogo()
dialogo.show()
app.exec_()