En esta ocasión traigo un Inicio de Sesión basado en el sistema de las antiguas Cajas Fuertes, dónde para ingresar al contenido de dicha caja, necesitabas una combinación de números. Aclaro que esto es solo una prueba de concepto, lo publico solo con dicha intención.
El programa luce así exactamente:
Más abajo explico como funciona, ahora adjunto el código:
Código
Bien, dentro del código, específicamente en las líneas 32 y 33 tenemos dos variables:
# -*- coding: utf-8 -*- ''' Prueba de Concepto sobre Inicio de sesión con Dial de QT4 Autor: JaAViEr | 0x5d Twitter: https://twitter.com/javieresteban__ Website: http://codigo.ga ''' from PyQt4 import QtCore, QtGui import sys try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s try: _encoding = QtGui.QApplication.UnicodeUTF8 def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig) class Form(QtGui.QWidget): def __init__(self, parent=None): estilo_elementos = '''background:qlineargradient(spread:reflect, x1:0.523, y1:0.778, x2:0.545455, y2:0, stop:0 rgba(0, 176, 140, 214), stop:1 rgba(255, 255, 255, 255)); color: #000;padding: 10px;''' QtGui.QWidget.__init__(self, parent) self.clave = [220,1, 1000] self.usuario = "jaavier" self.intento_clave = [] self.setObjectName(_fromUtf8("self")) self.setFixedSize(400, 484) self.setStyleSheet(_fromUtf8("font-weight:bold; font-size: 15px;background:qlineargradient(spread:reflect, x1:0.523, y1:0.778, x2:0.545455, y2:0, stop:0 rgba(0, 176, 140, 214), stop:1 rgba(255, 255, 255, 255));")) self.gridLayout = QtGui.QGridLayout(self) self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.splitter_2 = QtGui.QSplitter(self) self.splitter_2.setOrientation(QtCore.Qt.Vertical) self.splitter_2.setObjectName(_fromUtf8("splitter_2")) self.lcdNumber_numeros = QtGui.QLCDNumber(self.splitter_2) self.lcdNumber_numeros.setObjectName(_fromUtf8("lcdNumber_numeros")) self.lcdNumber_numeros.setStyleSheet(estilo_elementos) self.dial_contrasena = QtGui.QDial(self.splitter_2) self.dial_contrasena.setMaximum(1000) self.dial_contrasena.setStyleSheet("background: rgb(85, 255, 255)") self.dial_contrasena.setObjectName(_fromUtf8("dial_contrasena")) self.gridLayout.addWidget(self.splitter_2, 3, 0, 1, 1) self.label_usuario = QtGui.QLabel(self) self.label_usuario.setStyleSheet(_fromUtf8("font-weight:bold; font-size: 15px;")) self.label_usuario.setObjectName(_fromUtf8("label_usuario")) self.label_usuario.setStyleSheet("background: transparent") self.gridLayout.addWidget(self.label_usuario, 0, 0, 1, 1) self.lineEdit_usuario = QtGui.QLineEdit(self) self.lineEdit_usuario.setStyleSheet(estilo_elementos) self.lineEdit_usuario.setObjectName(_fromUtf8("lineEdit_usuario")) self.gridLayout.addWidget(self.lineEdit_usuario, 1, 0, 1, 1) self.label_contrasena = QtGui.QLabel(self) self.label_contrasena.setObjectName(_fromUtf8("label_contrasena")) self.label_contrasena.setStyleSheet("background: transparent") self.gridLayout.addWidget(self.label_contrasena, 2, 0, 1, 1) self.pushButton_reiniciar = QtGui.QPushButton(self) self.pushButton_reiniciar.setObjectName(_fromUtf8("pushButton_reiniciar")) self.gridLayout.addWidget(self.pushButton_reiniciar, 4, 0, 1, 1) self.pushButton_reiniciar.setStyleSheet(estilo_elementos) self.renombrarObjetos() QtCore.QObject.connect(self.dial_contrasena, QtCore.SIGNAL(_fromUtf8("valueChanged(int)")), self.lcdNumber_numeros.display) QtCore.QObject.connect(self.pushButton_reiniciar, QtCore.SIGNAL(_fromUtf8("clicked()")), self.limpiar_campos) QtCore.QMetaObject.connectSlotsByName(self) def limpiar_campos(self): self.lineEdit_usuario.setText("") self.intento_clave = [] self.dial_contrasena.setValue(0) mensaje_reinicio = QtGui.QMessageBox() mensaje_reinicio.setText(_fromUtf8("Formulario reiniciado con éxito")) def keyPressEvent(self, evento): tecla = evento.key() if tecla == 32: usuario = str(self.lineEdit_usuario.text()) self.intento_clave.append(int(self.lcdNumber_numeros.value())) self.dial_contrasena.setValue(0) if self.intento_clave == self.clave and usuario == self.usuario: mensaje = QtGui.QMessageBox() mensaje.setText("Bienvenido, " + usuario) mensaje.exec_() self.limpiar_campos() def renombrarObjetos(self): self.setWindowTitle(_translate("self", "Iniciar Sesión :: WWW.CODIGO.GA", None)) self.label_usuario.setText(_translate("self", "Usuario", None)) self.label_contrasena.setText(_translate("self", "Contraseña", None)) self.pushButton_reiniciar.setText(_translate("self", "Reiniciar campos", None)) app = QtGui.QApplication(sys.argv) formulario = Form() formulario.show() app.exec_()
Código
Como vemos, self.usuario es la variable de nuestro usuario válido y self.clave es una Lista, cuyo valor es [220, 1, 1000], lo que quiere decir que esa es nuestra combinación para ingresar de forma correcta. En ves de 3 dígitos en la combinación, pueden ser los que se te antojen.
self.clave = [220,1, 1000] self.usuario = "jaavier"
Para ingresar nuestra combinación (220, 1, 1000), es necesario utilizar nuestro cursor e ir moviendo la "perilla" (QDial), a medida que vayamos moviendo esta, el valor se irá viendo en la pantalla estilo "LCD" en la parte superior. Cuando hayas encontrado los números de tu combinación, debes presionar la tecla "Espacio", de esta forma le decimos al programa que el número que vemos en el LCD, forma parte de nuestra combinación, una vez hecho esto con la primera cifra, el QDial vuelve a 0, lo que quiere decir que ahora debes buscar el segundo número de tu combinación, presionar espacio y así lo mismo con el tercer, cuarto, quinto, etc dígito.
Si la combinación resulta correcta, deberías obtener algo como esto:
Fuente: http://codigo.ga/python/pyqt4-inicio-de-sesion-estilo-caja-fuerte/
Saludos, Javier.