|
Mostrar Temas
|
Páginas: [1] 2 3 4 5 6
|
1
|
Programación / Scripting / [PyQT4] Memoriza :: "Entrenando tu memoria" :: JaAViEr
|
en: 15 Mayo 2015, 17:40 pm
|
Hola! Siguiendo con las prácticas en PyQT4, traigo una aplicación "juego" que luce así: Enseguida explico más o menos en que consiste. La aplicación se encarga de generar Números/Letras/Números y Letras (según cada gusto) de forma totalmente aleatoria, con la longitud que tu desees. Además de seleccionar un tiempo "límite" para memorizar el valor generado, una vez acabado este tiempo límite, el valor es oculto, para que tu escribas la respuesta y evaluar si lo que memorizaste corresponde realmente a la cifra que generó y mostró por los X segundos que lo configuraste. Una vez lanzada la aplicación y configurada, damos clic en ¡Establecer Configuración! , lo que nos da un nuevo cuadro, que luce así: Damos clic en "Comenzar" y tendremos esto: Una vez acabado el tiempo, el QLineEdit se resetea para que ingreses lo que memorizaste: Una vez ingresado el valor que memorizaste, presiona ENTER, si el valor fue correcto, entonces tu racha aumentará en +1 , de lo contrario se reiniciará a 0. Sin más que agregar, el código: # -*- coding: utf-8 -*- ''' Juego Memoriza :: Entrenando tu Memoria Autor: JaAViEr | 0x5d Twitter: https://twitter.com/javieresteban__ Website: http://codigo.ga ''' from PyQt4 import QtCore, QtGui import sys from random import randint, sample import threading from time import sleep 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 formA(QtGui.QWidget): def __init__(self, parent=None): self.largo = 4 QtGui.QWidget.__init__(self, parent) self.resize(359, 131) self.gridLayout = QtGui.QGridLayout(self) self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.tabWidget_inicial = QtGui.QTabWidget(self) self.tabWidget_inicial.setStyleSheet(_fromUtf8("font-weight:bold;")) self.tabWidget_inicial.setObjectName(_fromUtf8("tabWidget_inicial")) self.tab = QtGui.QWidget() self.tab.setObjectName(_fromUtf8("tab")) self.gridLayout_2 = QtGui.QGridLayout(self.tab) self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2")) self.label_tipo = QtGui.QLabel(self.tab) self.label_tipo.setObjectName(_fromUtf8("label_tipo")) self.gridLayout_2.addWidget(self.label_tipo, 0, 2, 1, 1) self.pushButton_comenzar = QtGui.QPushButton(self.tab) self.pushButton_comenzar.setObjectName(_fromUtf8("pushButton_comenzar")) self.gridLayout_2.addWidget(self.pushButton_comenzar, 2, 0, 1, 3) self.spinBox_largo = QtGui.QSpinBox(self.tab) self.spinBox_largo.setMinimum(1) self.spinBox_largo.setProperty("value", 4) self.spinBox_largo.setObjectName(_fromUtf8("spinBox_largo")) self.gridLayout_2.addWidget(self.spinBox_largo, 1, 0, 1, 1) self.comboBox_tipo = QtGui.QComboBox(self.tab) self.comboBox_tipo.setObjectName(_fromUtf8("comboBox_tipo")) self.comboBox_tipo.addItem(_fromUtf8("")) self.comboBox_tipo.addItem(_fromUtf8("")) self.comboBox_tipo.addItem(_fromUtf8("")) self.gridLayout_2.addWidget(self.comboBox_tipo, 1, 2, 1, 1) self.label_largo = QtGui.QLabel(self.tab) self.label_largo.setObjectName(_fromUtf8("label_largo")) self.gridLayout_2.addWidget(self.label_largo, 0, 0, 1, 1) self.label_tiempo = QtGui.QLabel(self.tab) self.label_tiempo.setObjectName(_fromUtf8("label_tiempo")) self.gridLayout_2.addWidget(self.label_tiempo, 0, 1, 1, 1) self.spinBox_tiempo = QtGui.QSpinBox(self.tab) self.spinBox_tiempo.setPrefix(_fromUtf8("")) self.spinBox_tiempo.setObjectName(_fromUtf8("spinBox_tiempo")) self.spinBox_tiempo.setMinimum(1) self.gridLayout_2.addWidget(self.spinBox_tiempo, 1, 1, 1, 1) self.tabWidget_inicial.addTab(self.tab, _fromUtf8("")) self.gridLayout.addWidget(self.tabWidget_inicial, 0, 0, 1, 1) self.valores_elementos() self.connect(self.pushButton_comenzar, QtCore.SIGNAL("clicked()"), self.establecer_configuracion) def establecer_configuracion(self): self.tiempo = int(self.spinBox_tiempo.value()) self.largo = int(self.spinBox_largo.value()) form_b.show() form_b.label_segundos_restantes.setText("%s segundos" % self.tiempo) def valores_elementos(self): self.setWindowTitle(_translate("self", "Memoriza :: www.codigo.ga", None)) self.label_tipo.setText(_translate("self", "Tipo de juego", None)) self.pushButton_comenzar.setText(_translate("self", "¡Establecer configuración!", None)) self.comboBox_tipo.setItemText(0, _fromUtf8("Números")) self.comboBox_tipo.setItemText(1, _translate("self", "Letras", None)) self.comboBox_tipo.setItemText(2, _translate("self", "Números y Letras", None)) self.label_largo.setText(_translate("self", "Largo", None)) self.label_tiempo.setText(_translate("self", "Tiempo para memorizar", None)) self.spinBox_tiempo.setSuffix(_fromUtf8(" segundos")) self.tabWidget_inicial.setTabText(self.tabWidget_inicial.indexOf(self.tab), _translate("self", "Configuración de Memoriza", None)) class formB(QtGui.QWidget): def __init__(self, parent=None): self.valor_generado = "" self.racha = 0 QtGui.QWidget.__init__(self, parent) self.setObjectName(_fromUtf8("self")) self.resize(215, 104) self.gridLayout = QtGui.QGridLayout(self) self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.splitter = QtGui.QSplitter(self) self.splitter.setOrientation(QtCore.Qt.Vertical) self.splitter.setObjectName(_fromUtf8("splitter")) self.label_memoriza = QtGui.QLabel(self.splitter) self.label_memoriza.setStyleSheet(_fromUtf8("font-weight: bold; font-size: 17px;")) self.label_memoriza.setObjectName(_fromUtf8("label_memoriza")) self.lineEdit_valor_memorizar = QtGui.QLineEdit(self.splitter) self.lineEdit_valor_memorizar.setReadOnly(True) self.lineEdit_valor_memorizar.setObjectName(_fromUtf8("lineEdit_valor_memorizar")) self.gridLayout.addWidget(self.splitter, 0, 0, 1, 2) self.label_tiempo_restante = QtGui.QLabel(self) self.label_tiempo_restante.setObjectName(_fromUtf8("label_tiempo_restante")) self.gridLayout.addWidget(self.label_tiempo_restante, 1, 0, 1, 1) self.label_segundos_restantes = QtGui.QLabel(self) self.label_segundos_restantes.setStyleSheet(_fromUtf8("font-style: italic; font-weight: bold;")) self.label_segundos_restantes.setObjectName(_fromUtf8("label_segundos_restantes")) self.gridLayout.addWidget(self.label_segundos_restantes, 1, 1, 1, 1) self.pushButton_comenzar = QtGui.QPushButton(self) self.pushButton_comenzar.setObjectName(_fromUtf8("pushButton_comenzar")) self.gridLayout.addWidget(self.pushButton_comenzar, 3, 0, 1, 2) self.label_racha = QtGui.QLabel(self) self.label_racha.setObjectName(_fromUtf8("label_racha")) self.gridLayout.addWidget(self.label_racha, 2, 0, 1, 1) self.label_valor_racha = QtGui.QLabel(self) self.label_valor_racha.setStyleSheet(_fromUtf8("font-weight: bold;")) self.label_valor_racha.setObjectName(_fromUtf8("label_valor_racha")) self.gridLayout.addWidget(self.label_valor_racha, 2, 1, 1, 1) self.connect(self.pushButton_comenzar, QtCore.SIGNAL("clicked()"), self.empezar) self.connect(self.pushButton_comenzar, QtCore.SIGNAL("returnPressed()"), self.empezar) self.connect(self.lineEdit_valor_memorizar, QtCore.SIGNAL("returnPressed()"), self.cambia_valor) self.renombrar_elementos_widget() QtCore.QMetaObject.connectSlotsByName(self) def cambia_valor(self): qstring = str(self.lineEdit_valor_memorizar.text()) # mensaje = QtGui.QMessageBox() if qstring == self.valor_generado and len(self.valor_generado) > 0 and len(qstring) > 0: # mensaje.setText(_fromUtf8("¡Respuesta correcta!")) self.pushButton_comenzar.setFocus(True) self.lineEdit_valor_memorizar.setText("") self.valor_generado = False self.racha = self.racha + 1 self.label_valor_racha.setText(str(self.racha)) self.empezar() else: self.lineEdit_valor_memorizar.setText("") self.valor_generado = False # mensaje.setText(_fromUtf8("¡Respuesta Incorrecta!")) self.racha = 0 self.correr = False self.label_valor_racha.setText("0") self.empezar() # mensaje.exec_() def generar_numero(self): valor = "" for i in range(form_a.largo,): valor = valor + str(randint(0, 9)) return valor def generar_letras(self): valor = "" lista = list("abcdefghijklmnopqrstuvwxyz") len_lista = len(lista) - 1 for i in range(form_a.largo): valor = valor + lista[randint(0,len_lista)] return valor def generar_alfanumerico(self): valor = "" lista_abc = list("abcdefghijklmnopqrstuvwxyz") lista_digitos = list("0123456789") largo = form_a.largo / 2 len_lista_abc = len(lista_abc) - 1 len_lista_digitos = len(lista_digitos) - 1 for i in range(largo): valor = valor + lista_abc[randint(0,len_lista_abc)] for i in range(largo): valor = valor + lista_digitos[randint(0,len_lista_digitos)] return ''.join(sample(valor, len(valor))) def empezar(self): opcion = form_a.comboBox_tipo.currentIndex() self.lineEdit_valor_memorizar.setReadOnly(True) if opcion == 0: self.valor_generado = self.generar_numero() self.lineEdit_valor_memorizar.setText(self.valor_generado) elif opcion == 1: self.valor_generado = self.generar_letras() self.lineEdit_valor_memorizar.setText(self.valor_generado) elif opcion == 2: self.valor_generado = self.generar_alfanumerico() self.lineEdit_valor_memorizar.setText(self.valor_generado) t = Timer() t.start() def renombrar_elementos_widget(self): self.setWindowTitle(_translate("self", "Tablero", None)) self.label_memoriza.setText(_translate("self", "<html><head/><body><p align=\"center\"><span style=\" font-size:13pt;\">Memoriza</span></p></body></html>", None)) self.lineEdit_valor_memorizar.setText(_translate("self", "", None)) self.label_tiempo_restante.setText(_translate("self", "Tiempo restante", None)) self.label_segundos_restantes.setText(_translate("self", "10 segundos", None)) self.label_racha.setText(_translate("self", "Racha", None)) self.label_valor_racha.setText(_translate("self", "0", None)) self.pushButton_comenzar.setText(_translate("self", "Comenzar", None)) class Timer(threading.Thread): def __init__(self, parent=None): threading.Thread.__init__(self, parent) def run(self): tiempo_restante = form_a.tiempo for i in range(form_a.tiempo): form_b.label_segundos_restantes.setText("%s segundos" % tiempo_restante) tiempo_restante = tiempo_restante - 1 sleep(1) form_b.label_segundos_restantes.setText("0 segundos") form_b.lineEdit_valor_memorizar.setText("") form_b.lineEdit_valor_memorizar.setReadOnly(False) form_b.lineEdit_valor_memorizar.setFocus(True) app = QtGui.QApplication(sys.argv) form_b = formB() form_a = formA() form_a.show() app.exec_()
Fuente: http://codigo.ga/python/pyqt4-memoriza-entrenando-la-memoria/Saludos, Javier.
|
|
|
2
|
Programación / Scripting / [PyQT4] Inicio de Sesión estilo "Caja Fuerte" :: JaAViEr
|
en: 15 Mayo 2015, 01:07 am
|
Hola, buen día, luego de meses y meses y meses (na', nunca tanto), de no escribir nada en el Blog, ni mucho menos programar alguna cosilla en PyQT4, he vuelto. 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: # -*- 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_()
Bien, dentro del código, específicamente en las líneas 32 y 33 tenemos dos variables: self.clave = [220,1, 1000] self.usuario = "jaavier"
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.
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.
|
|
|
3
|
Programación / Desarrollo Web / [Código-javascript]Palabras más utilizadas en un Sitio Web
|
en: 25 Noviembre 2014, 10:00 am
|
Hola, muy buen día. El código javascript que publicaré más abajo se encarga de capturar todas las palabras dentro de algún elemento, clase o id. Nos creará un pequeño formulario "flotante", en el cuál nos pedirá "Longitud", "Veces", "Elemento" (Filtros). ¿ Que es eso de "Filtros"?
Los dos primeros son una especie de filtros, así mostramos resultados más específicos. - Longitud: Busca palabras con la longitud que tu deseas (>=)
- Veces: Cantidad de veces que aparece en la web
- Elemento: Acá ingresamos en que elemento de la web deseamos buscar Las palabras más utilizadas. El script al usar jQuery, nos permite insertar en este campo ".clases", "#ids" o simplemente elementos como <body>
Una vez rellenes los campos, el programa te dará una salida con una tabla como esta: Ejemplo basado en el portal de noticias http://actualidad.rt.comSin más, el código: var script = document.createElement('script'); script.src = 'http://code.jquery.com/jquery-latest.js'; document.getElementsByTagName('head')[0].appendChild(script); var times_form; var element_form; var length_form; var l_temp; var dict = {}; var new_dict = {}; var splited = ""; var counter; var get_data = function (text, length) { splited = text.split(" "); for ( var a in splited ) { if( dict[splited[a]] ) { splited[a] = splited[a].toLowerCase(); dict[splited[a]] = dict[splited[a]] + 1; } else { if ( splited[a].length >= length ) { splited[a] = splited[a].toLowerCase(); dict[splited[a]] = 1; } } } }; var extract = function (element, length, times) { new_dict = {}; dict = {}; $(element).each( function () { get_data($(this).text(), length); }); for ( var c in dict ) { if ( dict[c] >= times ) { new_dict[c] = dict[c]; } } var output = "<table border='1'>"+ "<thead>"+ "<th>Palabra</th>"+ "<th>Longitud</th>"+ "<th>Apariciones</th>"+ "</thead>"+ "<tbody>"; counter = 0; for( var l in new_dict ) { counter++; l_temp = l.replace("<", "<"); l_temp = l_temp.replace(">", ">"); output = output + "<tr>"+ "<td>" + l_temp + "</td><td>" + l.length + "</td><td>" + new_dict[l] + "</td>"+ "</tr>"; } output = output + "</tbody></table>"; show_results(output); return new_dict; }; var find = function (word) { if ( new_dict[word] ) { show_results(String(new_dict[word])); } else { show_results("Word Not found"); } }; var search = function () { length_form = $("input[name=length_craw]").val(); times_form = $("input[name=times_craw]").val(); element_form = $("input[name=element_craw]").val(); if( length_form.length > 0 && times_form.length > 0 && element_form.length > 0 ) { extract(element_form, length_form, times_form); } }; var show_form = function () { $("<div class='show_words' style='border-radius:5px;box-shadow:0px 0px 10px #000;overflow:scroll;font-family:Trebuchet MS;width:auto;height:6cm;background-color:#fff;border:1px solid;position:fixed;top:12%;left:2%;padding:5px;z-index:30;'>"+ "<center><h2>Palabras más utilizadas</h2></center><input style='padding: 2px;border: 1px solid;border-radius: 4px;margin: 4px;' name='length_craw' placeholder='Longitud'> <input style='padding: 2px;border: 1px solid;border-radius: 4px;margin: 4px;' name='times_craw' placeholder='Veces'><br/>"+ "<input style='padding: 2px;border: 1px solid;border-radius: 4px;margin: 4px;' name='element_craw' placeholder='Elemento'> <button onclick='search()' style='padding: 2px;border: 1px solid;border-radius: 4px;margin: 4px;'>¡Buscar!</button> <button onclick='$(\".show_words\").fadeOut();' style='padding: 2px;border: 1px solid;border-radius: 4px;margin: 4px;'>Cerrar</button>"+ "<div class='words_content'></div></div>").appendTo("body"); }; var show_results = function (content) { $(".words_content").html("Total:" + counter + "<br/>" + content); }; show_form();
FUENTE ORIGINAL : http://codigo.ga/javascript/javascriptpalabras-mas-utilizadas-en-sitio-web/
Sin más que agregar... gracias por leer :-) Saludos, Javier.
|
|
|
4
|
Programación / Scripting / [Python-CGI] PC Control Remoto - JaAViEr
|
en: 30 Octubre 2014, 08:51 am
|
¿ Qué es PC Control Remoto ? PC Control Remoto es un programa/web desarrollado bajo el lenguaje de programación Python en conjunto con su librería CGI, la cuál nos permitirá montar un servidor CGI y poder llevar acabo nuestro cometido. Este programa nos permitirá acceder a nuestro computador forma remota, con tu Navegador favorito, conectado vía LAN o a Internet (configuración aparte), desde cualquier navegador. Las funciones que nos brinda son las siguiente: - Consola - Terminal remota: Puedes ejecutar cualquier comando y obtener su salida desde tu navegador.
- Comándos rápidos: Entre estos comándos rápidos tenemos las posibilidad de:
- Apagar PC. (60 segundos).
- Reiniciar PC. (60 segundos).
- Cancelar Apagado/Reinicio.
- Matar un proceso.
- Iniciar un proceso.
[/list] El programa en general se compone de: - Server.py - Programa encargado de crear el servidor bajo el puerto que queramos.
- Index.py - Login e inicio del Panel de Control.
- Terminal.py - Consola remota.
- Comando_rapido.py - Comandos rápidos.
- Logout.py - Cerrar sesión
Además de otros componentes como Topcoat (CSS), jQuery (JS). Solo extraer en una carpeta y ejecutar server.py PUERTOAdjunto el código de cada archivo Python mencionado anteriormente server.py ''' Autor: JaAViEr Twitter: @javieresteban__ Website: http://codigo.ga ''' from CGIHTTPServer import CGIHTTPRequestHandler from BaseHTTPServer import HTTPServer import socket import sys try: port = int(sys.argv[1]) if port: ip_interna = socket.gethostbyname(socket.gethostname()) print "Panel de control: http://%s:%s/cgi-bin/index.py" % (ip_interna, port) server_address=('', port) httpd = HTTPServer(server_address, CGIHTTPRequestHandler) httpd.serve_forever() except: print "-"*40 print "Uso:" print sys.argv[0], "PUERTO" print "-"*40 print "Ejemplo de uso:" print sys.argv[0], "5050" print "-"*40
Luego de server.py, deben pasar como parámatro el puerto al cual estará asociado el servidor.
index.py #-*- encoding:utf-8 -*- ''' Autor: JaAViEr Twitter: @javieresteban__ Website: http://codigo.ga ''' import cgi import os import Cookie import md5 lista_usuarios = ["admin", "JaAViEr"] #Usuarios lista_passwords = ["root", "toor"] # Contraseñas method = os.environ.get("REQUEST_METHOD") logueado = False contenido_cookies = os.environ.get('HTTP_COOKIE') tag_head = ''' <meta charset="UTF-8"> <link rel="stylesheet" type="text/css" href="/topcoat/css/topcoat-mobile-dark.min.css" class="uib-framework-theme"> <link rel="stylesheet" type="text/css" href="/css/index_main.less.css" class="main-less"> <meta http-equiv="Content-type" content="text/html; charset=utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0"> <style type="text/css"> /* Prevent copy paste for all elements except text fields */ * { -webkit-user-select:none; -webkit-tap-highlight-color:rgba(255, 255, 255, 0); } input, textarea { -webkit-user-select:text; } </style> <script type="application/javascript" src="/js/jquery.min.js"></script> <script type="application/javascript" src="/js/index_user_scripts.js"></script>''' def code_login(accion=False): if accion == 'error': mensaje_error = ''' <div class="topcoat-navigation-bar widget uib_w_1 d-margins" data-uib="topcoat/nav" data-ver="0"> <div class="topcoat-navigation-bar__item center full"> <h1 class="topcoat-navigation-bar__title">Verifica tus credenciales por favor[/size][/center] </div> </div> ''' else: mensaje_error = '' return ''' <!DOCTYPE html> <html> <head> ''' + tag_head + ''' <title>Indetifícate en el sistema</title> </head> <body> <div class="uwrap"> <div class="upage" id="mainpage"> <div class="upage-outer"> <div class="upage-content" id="mainsub"> <div class="grid grid-pad urow uib_row_2 row-height-2" data-uib="layout/row" data-ver="0"> <div class="col uib_col_2 col-0_12-12" data-uib="layout/col" data-ver="0"> <div class="widget-container content-area vertical-col"> <div class="topcoat-navigation-bar widget uib_w_1 d-margins" data-uib="topcoat/nav" data-ver="0"> <div class="topcoat-navigation-bar__item center full"> <h1 class="topcoat-navigation-bar__title">Indentifícate[/size][/center] </div> </div> <span class="uib_shim"></span> </div> </div> <span class="uib_shim"></span> </div> <div class="grid grid-pad urow uib_row_3 row-height-3" data-uib="layout/row" data-ver="0"> <form action="" method="POST"> <div class="col uib_col_3 col-0_12-12" data-uib="layout/col" data-ver="0"> <div class="widget-container content-area vertical-col"> <div class="table-thing widget uib_w_2 d-margins" data-uib="topcoat/input" data-ver="0"> <label class="narrow-control label-top-left">Usuario</label> <input class="wide-control topcoat-text-input" type="text" placeholder="Usuario" name="usuario"> </div> <div class="table-thing widget d-margins" data-uib="topcoat/input" data-ver="0"> <label class="narrow-control label-top-left">Contraseña</label> <input class="wide-control topcoat-text-input" type="password" placeholder="Contraseña" name="password"> </div> <button class="widget d-margins topcoat-button--cta" data-uib="topcoat/button" data-ver="0">Ingresar</button><span class="uib_shim"></span> </div> ''' +mensaje_error+ ''' </form> </div> <span class="uib_shim"></span> </div> </div> <!-- /upage-content --> </div> <!-- /upage-outer --> </div> <!-- /upage --> </div> <!-- /uwrap --> </body> </html>''' code = '''<!DOCTYPE html> <!--HTML5 doctype--> <html> <head> ''' + tag_head + ''' <title>Control Remoto :: 2014</title> </head> <body> <!-- content goes here--> <div class="uwrap"> <div class="upage" id="mainpage"> <div class="upage-outer"> <div class="upage-content" id="mainsub"> <div class="grid grid-pad urow uib_row_1 row-height-1" data-uib="layout/row" data-ver="0"> <div class="col uib_col_2 col-0_12-12" data-uib="layout/col" data-ver="0"> <div class="widget-container content-area vertical-col"> <div class="topcoat-navigation-bar widget uib_w_2 d-margins" data-uib="/topcoat/nav" data-ver="0"> <div class="topcoat-navigation-bar__item center full"> <h1 class="topcoat-navigation-bar__title">Panel de Control Remoto[/size][/center] </div> </div> <button class="widget uib_w_4 d-margins topcoat-button--large--cta" data-uib="/topcoat/button" data-ver="0">Consola - Terminal</button> <button class="widget uib_w_3 d-margins topcoat-button--large--cta" data-uib="/topcoat/button" data-ver="0">Enviar comando rápido</button> <button class="widget uib_w_5 d-margins topcoat-button--large" onclick='location.href="logout.py"' data-uib="/topcoat/button" data-ver="0">Salir</button> <span class="uib_shim"></span> </div> </div> <span class="uib_shim"></span> </div> </div> <!-- /upage-content --> </div> <!-- /upage-outer --> </div> <div class="upage hidden" id="uib_page_3"> <div class="upage-outer"> <div id="uib_page_3sub" class="upage-content "> </div> </div> <!-- /upage-outer --> te </div> <div class="upage hidden" id="uib_page_2"> <div class="upage-outer"> <div id="uib_page_2sub" class="upage-content "> </div> </div> <!-- /upage-outer --> </div> <div class="upage hidden" id="uib_page_1"> <div class="upage-outer"> <div id="uib_page_1sub" class="upage-content "> </div> </div> <!-- /upage-outer --> </div> <!-- /upage --> </div> <!-- /uwrap --> </body> </html>''' def verificar_login(u, p): if u in lista_usuarios and p in lista_passwords: session = u + p session = md5.md5(session).hexdigest() return True else: return False if contenido_cookies: #Si hay cookies... valores_cookie = Cookie.SimpleCookie(contenido_cookies) session_actual = valores_cookie['sess'].value # session_actual = cookie "sess" if session_actual == "false": # No logueado logueado = False else: # Verifica login for a, b in zip(lista_usuarios, lista_passwords): session_temporal = a + b session_temporal = md5.md5(session_temporal).hexdigest() if session_actual == session_temporal: logueado = True # Login coincide break else: pass else: #No logueado, sess = false print "Set-Cookie:sess=false" print "Content-Type: text/html" if method == "POST": form = cgi.FieldStorage() usuario = form.getvalue('usuario') password = form.getvalue('password') if verificar_login(usuario, password): session = usuario + password session = md5.md5(session).hexdigest() print "Set-Cookie:sess=%s" % session print print code else: print print code_login('error') elif method == "GET": if not logueado: print code_login() else: print code
terminal.py #-*- encoding:utf-8 -*- ''' Autor: JaAViEr Twitter: @javieresteban__ Website: http://codigo.ga ''' import cgi import os import Cookie import md5 print "Content-Type: text/html" print code_terminal = ''' <!DOCTYPE html> <html> <head> <link rel="stylesheet" type="text/css" href="/topcoat/css/topcoat-mobile-dark.min.css" class="uib-framework-theme"> <link rel="stylesheet" type="text/css" href="/css/terminal_main.less.css" class="main-less"> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0"> <title>Terminal</title> <script src="/js/jquery.min.js"></script> </head> <body> <div class="uwrap"> <div class="upage" id="mainpage"> <div class="upage-outer"> <div class="upage-content" id="mainsub"> <div class="grid grid-pad urow uib_row_1 row-height-1" data-uib="layout/row" data-ver="0"> <div class="col uib_col_1 col-0_12-12" data-uib="layout/col" data-ver="0"> <div class="widget-container content-area vertical-col"> <div class="topcoat-navigation-bar widget uib_w_1 d-margins" data-uib="/topcoat/nav" data-ver="0"> <div class="topcoat-navigation-bar__item center full"> <h1 class="topcoat-navigation-bar__title">Consola - Terminal[/size][/center] </div> </div> <div class="table-thing widget uib_w_2 d-margins" data-uib="/topcoat/textarea" data-ver="0"> <label class="narrow-control label-inline"></label> <textarea class="wide-control topcoat-textarea" type="text" placeholder="Comandos" name="comando"></textarea> </div> <button class="widget uib_w_2 d-margins topcoat-button--cta" data-uib="topcoat/button" data-ver="0" onclick='execute();'>¡Ejecutar!</button> <button class="widget uib_w_2 d-margins topcoat-button" data-uib="topcoat/button" data-ver="0" onclick='location.href="index.py"'>Volver</button> <hr> Salida: <span id="loader"></span> <span class="uib_shim"></span> </div> </div> <span class="uib_shim"></span> </div> </div> <!-- /upage-content --> </div> <!-- /upage-outer --> </div> <!-- /upage --> </div> <!-- /uwrap --> <script language="javascript"> function execute(){ comando = $("textarea[name=comando]").val(); $("#loader").load("terminal.py", {"comando":comando}); } </script> </body> </html>''' logueado = False lista_usuarios = ["admin", "JaAViEr"] #Usuarios lista_passwords = ["root", "toor"] # Contraseñas method = os.environ['REQUEST_METHOD'] lectura_cookies = os.environ.get('HTTP_COOKIE') if lectura_cookies: valores_cookie = Cookie.SimpleCookie(lectura_cookies) session_actual = valores_cookie['sess'].value # session_actual = cookie "sess" if session_actual != "false": for a, b in zip(lista_usuarios, lista_passwords): session_temporal = a + b session_temporal = md5.md5(session_temporal).hexdigest() if session_actual == session_temporal: logueado = True # Login coincide break else: pass else: pass if logueado: if method == "GET": print code_terminal elif method == "POST": form = cgi.FieldStorage() comando = form.getvalue("comando") lineas = comando.split("\n") print ''' <span style="font-family:Trebuchet Ms; color: #fff;" class="wide-control"> <br /> ''' for l in lineas: try: run = os.popen(l, "r") run_content = run.read() run_content = run_content.replace("\n", "<br>") run_content = run_content.replace(" ", " ") print run_content run.close() except: print "Error al ejecutar comando %s" % (l) print "</span>" else: print "<script>location.href='index.py';</script>"
comando_rapido.py #-*- encoding:utf-8 -*- ''' Autor: JaAViEr Twitter: @javieresteban__ Website: http://codigo.ga ''' import cgi import os import subprocess import Cookie import md5 print "Content-Type: text/html" print code_terminal = ''' <!DOCTYPE html> <html> <head> <link rel="stylesheet" type="text/css" href="/topcoat/css/topcoat-mobile-dark.min.css" class="uib-framework-theme"> <link rel="stylesheet" type="text/css" href="/css/terminal_main.less.css" class="main-less"> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0"> <title>Comandos rápidos</title> <script src="/js/jquery.min.js"></script> </head> <body> <div class="uwrap"> <div class="upage" id="mainpage"> <div class="upage-outer"> <div class="upage-content" id="mainsub"> <div class="grid grid-pad urow uib_row_3 row-height-3" data-uib="layout/row" data-ver="0"> <div class="col uib_col_3 col-0_12-12" data-uib="layout/col" data-ver="0"> <div class="widget-container content-area vertical-col"> <div class="topcoat-navigation-bar widget uib_w_1 d-margins" data-uib="topcoat/nav" data-ver="0"> <div class="topcoat-navigation-bar__item center full"> <h1 class="topcoat-navigation-bar__title">Comandos rápidos[/size][/center] </div> </div> <span class="uib_shim"></span> </div> </div> <span class="uib_shim"></span> </div> <div class="grid grid-pad urow uib_row_4 row-height-4" data-uib="layout/row" data-ver="0"> <div class="col uib_col_4 col-0_12-12" data-uib="layout/col" data-ver="0"> <div class="widget-container content-area vertical-col"> <button class="widget uib_w_2 d-margins topcoat-button--cta" data-uib="topcoat/button" data-ver="0" onclick="comando('apagar'); return false;">Apagar</button> <button class="widget uib_w_3 d-margins topcoat-button--cta" data-uib="topcoat/button" data-ver="0" onclick="comando('reiniciar'); return false;">Reiniciar</button> <button class="widget uib_w_4 d-margins topcoat-button--cta" data-uib="topcoat/button" data-ver="0" onclick="comando('cancelar salida'); return false;">Cancelar Apagado/Rein.</button> <button class="widget uib_w_5 d-margins topcoat-button--cta" data-uib="topcoat/button" data-ver="0" onclick="matar_proceso('mostrar'); return false;">Matar proceso</button> <span id="matar_proceso" style="display:none"> <hr> <input class="wide-control topcoat-text-input" type="text" placeholder="proceso.ext" name="proceso"> <button class="widget uib_w_6 d-margins topcoat-button wide-control" data-uib="topcoat/button" data-ver="0" onclick="matar_proceso('kill'); return false;">¡Matar ahora!</button> <hr> </span> <button class="widget uib_w_6 d-margins topcoat-button--cta" data-uib="topcoat/button" data-ver="0" onclick="iniciar_proceso('mostrar'); return false;">Iniciar proceso</button> <span id="iniciar_proceso" style="display:none"> <hr> <input class="wide-control topcoat-text-input" type="text" placeholder="proceso.ext" name="iniciar_proceso"> <button class="widget uib_w_6 d-margins topcoat-button wide-control" data-uib="topcoat/button" data-ver="0" onclick="iniciar_proceso('iniciar'); return false;">¡Iniciar ahora!</button> <hr> </span> <button class="widget uib_w_2 d-margins topcoat-button" data-uib="topcoat/button" data-ver="0" onclick='location.href="index.py"'>Volver</button> <span class="uib_shim"></span> </div> </div> <span class="uib_shim"></span> </div> </div> <!-- /upage-content --> </div> <!-- /upage-outer --> </div> <!-- /upage --> </div> <!-- /uwrap --> </body> <span id="loader" style="display:none;"></span> <script language="javascript"> function comando(cmd){ $("#loader").load("comando_rapido.py", {"comando":cmd}); } function matar_proceso(param){ if(param == 'mostrar'){ $("#matar_proceso").fadeIn(); $("#iniciar_proceso").fadeOut(); }else if(param == 'kill'){ proceso = $("input[name=proceso]").val(); $("#loader").load("comando_rapido.py", {"kill": proceso}); $("#matar_proceso").fadeOut(); $("input[name=proceso]").val(""); } } function iniciar_proceso(accion){ if (accion == "mostrar"){ $("#matar_proceso").fadeOut(); $("#iniciar_proceso").fadeIn(); }else if(accion == "iniciar"){ nuevo_proceso = $("input[name=iniciar_proceso]").val(); $("#loader").load("comando_rapido.py", {"correr": nuevo_proceso}); $("#iniciar_proceso").fadeOut(); $("input[name=iniciar_procesoproceso]").val(""); } } </script> </html>''' logueado = False lista_usuarios = ["admin", "JaAViEr"] #Usuarios lista_passwords = ["root", "toor"] # Contraseñas method = os.environ['REQUEST_METHOD'] lectura_cookies = os.environ.get('HTTP_COOKIE') if lectura_cookies: valores_cookie = Cookie.SimpleCookie(lectura_cookies) session_actual = valores_cookie['sess'].value # session_actual = cookie "sess" if session_actual != "false": for a, b in zip(lista_usuarios, lista_passwords): session_temporal = a + b session_temporal = md5.md5(session_temporal).hexdigest() if session_actual == session_temporal: logueado = True # Login coincide break else: pass else: pass if logueado: if os.name == "nt": so = "windows" else: so = "unix" if method == "GET": print code_terminal elif method == "POST": form = cgi.FieldStorage() comando = form.getvalue("comando") kill = form.getvalue("kill") correr = form.getvalue("correr") iniciar_proceso = "" matador = "" try: if correr: if so == "windows": iniciar_proceso = "start %s" % (correr) elif so == "unix": iniciar_proceso = "%s" % (correr) subprocess.call(iniciar_proceso) if kill: if so == "windows": matador = "taskkill /F /IM %s" % (kill) elif so == "unix": matador = "pkill -9 %s" % (kill) kill = subprocess.call(matador) kill.close() if comando == "apagar": if so == "windows": accion = "shutdown /S /T 60" elif so == "unix": accion = "sudo poweroff" elif comando == "reiniciar": if so == "windows": accion = "shutdown /R /T 60" elif so == "unix": accion = "sudo reboot" #accion = "" elif comando == "cancelar salida": if so == "windows": accion = "shutdown /A" elif so == "unix": accion = "" #accion = "" action = subprocess.call(accion) action.close() except: pass else: print "<script>location.href='index.py';</script>"
logout.py import cgi ''' Autor: JaAViEr Twitter: @javieresteban__ Website: http://codigo.ga ''' print "Content-Type: text/html" print "Set-Cookie: sess=false" print "Location:index.py" print print "<script>location.href='index.py';</script>"
Un par de Screenshots de como luce el programa... Identificación Panel de control Consola-Terminal Remota Comando rápidos Comandos rápidos - Iniciar Proceso Comandos rápidos - Matar Proceso
|
|
|
5
|
Foros Generales / Foro Libre / [Dato]BTC Cloud Mining
|
en: 14 Julio 2014, 00:26 am
|
Hola, muy buenos días. Hace unos días me topé con un servicio de BTC Cloud Mining, el cuál nos permite minar BTC sin tener que comprar algún tipo de Hardware, solo invirtiendo BTC en GHS (Potencia) , los BTC minados son depositados a tu cuenta y puedes re-invertir lo ganado en más potencia, lo que obviamente se traduce en mayor cantidad de GHS = Mayor cantidad de ganancias en BTC. ¡ Se los recomiendo a toda costa ! Una vez que adquieres GHS , el proceso de minado comienza automáticamente. Luego de Crear una Cuenta vas a "Balance" y puedes hacer depósitos en BTC a la cuenta que se te ha asignado, de esa forma puedes invertir tus BTC en más GHS. Saludos, Javier.
|
|
|
6
|
Programación / Scripting / [Código-PyQT4]Protector de Archivo - JaAViEr
|
en: 26 Abril 2014, 05:55 am
|
Hola, buenos días! El siguiente programa tiene por función el poder restaurar un archivo que se ha modificado o eliminado. El funcionamiento del programa es muy sencillo Clic en "Buscar..." , ubicamos el archivo que deseamos proteger y damos clic en "Abrir" , una vez hecho esto el programa ya estará atento a los cambios del programa. El programa lanzará un alerta en caso de que: - El archivo se haya eliminado.
- El archivo se haya modificado.
Junto con cualquiera de ambas alertas el programa nos dará la posibilidad de restaurar a la versión anterior (A la versión del archivo al momento de ejecutarse este programa y seleccionar el archivo)
Sin más que decir, el código # -*- coding: utf-8 -*- #Autor: JaAViEr | 0X5D #Twitter: @javieresteban__ from PyQt4 import QtCore, QtGui import sys, threading, os try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s class Formulario(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__(self) self.setWindowTitle("Protector de Archivos :: 2014") self.setFixedSize(400, 48) self.gridLayout = QtGui.QGridLayout(self) self.label = QtGui.QLabel(self) self.gridLayout.addWidget(self.label, 0, 0, 1, 1) self.archivo = QtGui.QLineEdit(self) self.archivo.setDisabled(True) self.gridLayout.addWidget(self.archivo, 0, 1, 1, 1) self.boton = QtGui.QPushButton(self) self.gridLayout.addWidget(self.boton, 0, 2, 1, 1) self.label.setText("Archivo:") self.boton.setText("Buscar...") self.connect(self.boton, QtCore.SIGNAL("clicked()"), self.buscar_archivo) self.connect(self.archivo, QtCore.SIGNAL("returnPressed()"), self.empezar) def buscar_archivo(self): self.file = QtGui.QFileDialog.getOpenFileName(self, 'Buscar Archivo', '') leer = open(self.file, "rb") self.lineas = leer.read() leer.close() self.archivo.setText(self.file) self.size = os.path.getsize(self.file) self.empezar() def empezar(self): h = Hilo() h.start() class Hilo(threading.Thread): def run(self): while True: try: open(form.file) estado = True except: estado = False if estado: tama = os.path.getsize(form.file) if tama == form.size: pass else: self.restaurar() else: self.restaurar() def restaurar(self): try: f = open(form.file, "wb") f.write(form.lineas) f.close() QtGui.QMessageBox.about(None, 'Alerta',_fromUtf8('El archivo se restauró exitosamente!')) except: QtGui.QMessageBox.about(None, 'Alerta',_fromUtf8('Error al intentar restaurar!')) app = QtGui.QApplication(sys.argv) form = Formulario() form.show() app.exec_()
Saludos, Javier.
|
|
|
7
|
Programación / Scripting / [Código-PyQT4] Manejo de Stock sencillo V1 - JaAViEr
|
en: 26 Abril 2014, 01:04 am
|
Hola, muy buenos días. Hace unos días re-re-re-re-tome PyQT4 & SQLite, con lo que se me ocurrió hacer un programa (a forma de práctica) que me ayude a manejar el Stock de productos, con opción de: - Eliminar Producto
- Agregar Producto
- Actualizar Producto
El programa luce exactamente así: Para Editar o Actualizar Producto primero debemos seleccionar el producto y posteriormente dar clic en el botón de la acción que deseamos realizarActualizar Producto: Agregar Producto:
Sin más preámbulos , el código: # -*- coding: cp1252 -*- from PyQt4 import QtCore, QtGui import sys, sqlite3 try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s class Formulario(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setFixedSize(591, 471) self.gridLayout = QtGui.QGridLayout(self) self.label = QtGui.QLabel(self) self.gridLayout.addWidget(self.label, 0, 0, 1, 2) self.treeWidget = QtGui.QTreeWidget(self) self.treeWidget.header().setDefaultSectionSize(150) self.gridLayout.addWidget(self.treeWidget, 1, 0, 1, 3) self.boton_eliminar = QtGui.QPushButton(self) self.gridLayout.addWidget(self.boton_eliminar, 2, 0, 1, 1) self.boton_agregar = QtGui.QPushButton(self) self.gridLayout.addWidget(self.boton_agregar, 2, 1, 1, 1) self.boton_actualizar = QtGui.QPushButton(self) self.gridLayout.addWidget(self.boton_actualizar, 2, 2, 1, 1) self.setWindowTitle("Visualizador de Stock") self.label.setText(_fromUtf8("Información del stock actual:")) self.treeWidget.headerItem().setText(0, "ID") self.treeWidget.headerItem().setText(1, "Producto") self.treeWidget.headerItem().setText(2, "Precio unitario") self.treeWidget.headerItem().setText(3, "Cantidad") __sortingEnabled = self.treeWidget.isSortingEnabled() self.treeWidget.setSortingEnabled(False) self.conexion = sqlite3.connect("stock.db") self.controla = self.conexion.cursor() try: self.controla.execute("CREATE TABLE stock (id int, nombre text, precio int, cantidad int)") self.controla.execute("INSERT INTO stock VALUES (1, 'Producto Demo', 2500, 100)") self.commit() except: pass self.treeWidget.setSortingEnabled(__sortingEnabled) self.boton_eliminar.setText("Eliminar producto") self.boton_agregar.setText("Agregar producto") self.boton_actualizar.setText(_fromUtf8("Actualizar información")) self.connect(self.boton_eliminar, QtCore.SIGNAL("clicked()"), self.eliminar) self.connect(self.boton_agregar, QtCore.SIGNAL("clicked()"), self.agregar) self.connect(self.boton_actualizar, QtCore.SIGNAL("clicked()"), self.actualizar) self.connect(self.treeWidget, QtCore.SIGNAL("itemPressed(QTreeWidgetItem*, int)"), self.seleccion) self.carga() def carga(self): self.treeWidget.reset() self.controla.execute("SELECT * FROM stock") l = 0 for row in self.controla: item_0 = QtGui.QTreeWidgetItem(self.treeWidget) id, nombre, precio, cantidad = row self.treeWidget.topLevelItem(l).setText(0, str(id)) self.treeWidget.topLevelItem(l).setText(1, nombre) self.treeWidget.topLevelItem(l).setText(2, str(precio)) self.treeWidget.topLevelItem(l).setText(3, str(cantidad)) item_0 = QtGui.QTreeWidgetItem(self.treeWidget) l = l + 1 self.conexion.commit() def agregar(self): agregar.show() def seleccion(self, qt, i): self.item = self.treeWidget.currentItem() self.id_prod = self.item.text(0) self.nombre_prod = self.item.text(1) self.precio_prod = self.item.text(2) self.cantidad_prod = self.item.text(3) def eliminar(self): if self.id_prod: reply = QtGui.QMessageBox.question(self, 'Message', _fromUtf8('¿Estás seguro?'), QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.Yes) if reply == QtGui.QMessageBox.Yes: self.controla.execute("DELETE FROM stock WHERE id = %s" % self.id_prod) self.conexion.commit() self.carga() def actualizar(self): actualizar.cargador(str(self.id_prod), self.nombre_prod, str(self.precio_prod), str(self.cantidad_prod)) actualizar.show() class Agregar(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setFixedSize(400, 151) self.gridLayout = QtGui.QGridLayout(self) self.label_nombre = QtGui.QLabel(self) self.gridLayout.addWidget(self.label_nombre, 0, 0, 1, 1) self.input_nombre = QtGui.QLineEdit(self) self.gridLayout.addWidget(self.input_nombre, 0, 2, 1, 1) self.label_precio = QtGui.QLabel(self) self.gridLayout.addWidget(self.label_precio, 1, 0, 1, 1) self.input_precio = QtGui.QLineEdit(self) self.gridLayout.addWidget(self.input_precio, 1, 2, 1, 1) self.label_cantidad = QtGui.QLabel(self) self.gridLayout.addWidget(self.label_cantidad, 2, 0, 1, 2) self.input_cantidad = QtGui.QLineEdit(self) self.gridLayout.addWidget(self.input_cantidad, 2, 2, 1, 1) self.input_id = QtGui.QLineEdit(self) self.gridLayout.addWidget(self.input_id, 3, 2, 1, 1) self.label_id = QtGui.QLabel(self) self.gridLayout.addWidget(self.label_id, 3, 0, 1, 1) self.boton_agregar = QtGui.QPushButton(self) self.gridLayout.addWidget(self.boton_agregar, 4, 0, 1, 3) self.setWindowTitle("Agregar producto") self.label_nombre.setText("Nombre:") self.label_precio.setText("Precio:") self.label_cantidad.setText("Cantidad:") self.label_id.setText("ID:") self.boton_agregar.setText("Agregar") self.connect(self.boton_agregar, QtCore.SIGNAL("clicked()"), self.agregar_producto) def agregar_producto(self): self.conexion = sqlite3.connect("stock.db") self.get = self.conexion.cursor() id = str(self.input_id.text()) nombre = str(self.input_nombre.text()) precio = str(self.input_precio.text()) cantidad = str(self.input_cantidad.text()) query = "SELECT * FROM stock WHERE id = %s" % id if self.get.execute(query).fetchone() != None: QtGui.QMessageBox.question(self, 'Alerta', _fromUtf8('El ID ya está asociado a otro producto.')) else: self.get.execute("INSERT INTO stock VALUES (%s, '%s', %s, %s)" % (int(id), nombre, int(precio), int(cantidad))) self.conexion.commit() form.carga() self.hide() class Actualizar(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__(self) self.setFixedSize(400, 151) self.gridLayout = QtGui.QGridLayout(self) self.label_nombre = QtGui.QLabel(self) self.gridLayout.addWidget(self.label_nombre, 0, 0, 1, 1) self.input_nombre = QtGui.QLineEdit(self) self.gridLayout.addWidget(self.input_nombre, 0, 2, 1, 1) self.label_precio = QtGui.QLabel(self) self.gridLayout.addWidget(self.label_precio, 1, 0, 1, 1) self.input_precio = QtGui.QLineEdit(self) self.gridLayout.addWidget(self.input_precio, 1, 2, 1, 1) self.label_cantidad = QtGui.QLabel(self) self.gridLayout.addWidget(self.label_cantidad, 2, 0, 1, 2) self.input_cantidad = QtGui.QLineEdit(self) self.gridLayout.addWidget(self.input_cantidad, 2, 2, 1, 1) self.label_id = QtGui.QLabel(self) self.gridLayout.addWidget(self.label_id, 3, 0, 1, 1) self.input_id = QtGui.QLineEdit(self) self.input_id.setDisabled(True) self.gridLayout.addWidget(self.input_id, 3, 2, 1, 1) self.boton_actualizar = QtGui.QPushButton(self) self.gridLayout.addWidget(self.boton_actualizar, 4, 0, 1, 3) self.setWindowTitle("Agregar producto") self.label_nombre.setText("Nombre:") self.label_precio.setText("Precio:") self.label_cantidad.setText("Cantidad:") self.label_id.setText("ID:") self.boton_actualizar.setText("Actualizar") self.connect(self.boton_actualizar, QtCore.SIGNAL("clicked()"), self.actualizar) def cargador(self, id="", nombre="", precio="", cantidad=""): self.input_id.setText(id) self.input_nombre.setText(nombre) self.input_precio.setText(precio) self.input_cantidad.setText(cantidad) def actualizar(self): self.id = str(self.input_id.text()) self.nombre = str(self.input_nombre.text()) self.precio = str(self.input_precio.text()) self.cantidad = str(self.input_cantidad.text()) self.conexion = sqlite3.connect("stock.db") self.get = self.conexion.cursor() query = "UPDATE stock SET nombre = '%s', precio = %s, cantidad = %s WHERE id = %s " % (self.nombre, int(self.precio), int(self.cantidad), int(self.id)) try: self.get.execute(query) self.conexion.commit() form.carga() self.hide() QtGui.QMessageBox.question(self, 'Alerta', _fromUtf8('Producto actualizado correctamente.')) except: QtGui.QMessageBox.question(self, 'Alerta', _fromUtf8('No se pudo actualizar.')) app = QtGui.QApplication(sys.argv) actualizar = Actualizar() agregar = Agregar() form = Formulario() form.show() app.exec_()
Fuente: http://codigo.ga/python/python-qt4-manejo-de-stock-sencillo-v1-jaavier/
|
|
|
8
|
Programación / Desarrollo Web / [WordPress] AddThis: Compartiendo nuestras entradas en Redes Sociales
|
en: 12 Abril 2014, 06:47 am
|
Fuente original del artículo: http://miweb.in/addthis-compartiendo-nuestras-entradas-en-redes-sociales/Si eres de los que maneja un blog con presencia en redes sociales como Facebook & Twitter este plugin te encantará. Se trata del plugin "AddThis", el cual nos añadirá en cada entrada, página y categoría una barra completa para compartir en cientos de servicios, entre ellos Twitter, Facebook, Bit.ly, E-mail, etc.¡ Manos a la obra ! Para llevar acabo nuestro cometido, es preciso que se dirijan a Plugins > Añadir Nuevo > Buscar e ingresar "Addthis". Yo ya lo tengo instalado, pero le das clic a "Instalar ahora" y lo activas. Una vez hecho esto podemos pasar a la configuración de nuestro nuevo plugin. Configurando AddThis Nos dirigimos a Ajustes > AddThisTe explico: Top Sharing Tool : Si tienes activa esta opción, te añadirá la barra de compartir en la parte superior de cada página. Puedes deshabilitar esta opción seleccionando "Do not show a sharing tool at the Top of posts". Bottom Sharing Tool: Añade la barra de compartir en la parte inferior de cada página. Al igual que en la opción anterior, puedes desactivarla cliqueando en "Do not show a sharing tool at the Top of posts". A la derecha tenemos un panel de como se verían nuestras entradas con la actual configuración, como se ve en el ejemplo, solo está marcado que añada la barra en la parte inferior de nuestras páginas.
Este plugin nos frece la posibilidad de desactivar estas barras al momento de añadir una nueva página, entrada o categoría. ¿ Alguna consulta ? No dudes en enviarla en el comentario de esta entrada. Saludos, Javier.
|
|
|
9
|
Programación / Desarrollo Web / [OpenCart] Instalando y Configurando idioma Español
|
en: 9 Abril 2014, 10:57 am
|
Si estás usando OpenCart y te diste cuenta que todo estaba en inglés no solo en el Inicio, sino que también en tu Panel de Administración, te recomiendo seguir leyendo esta entrada para aprender paso a paso como pasar de Inglés a Español. Para poder traducir tu tienda, debes descargar el parche de idioma español primero, el cuál puedes descargar directamente dando clic acá. Agregando un nuevo idioma Bien, una vez que ya tengamos el parche en nuestro computador, lo subiremos vía FTP a nuestro servidor, recuerda extraer el archivo opencart-espanol.zip en la raíz de tu tienda, por ejemplo una tienda alojada en http://miweb.in/demo , extraería el contenido del zip en /public_html/www/demo/.
Entramos en nuestro Panel de Administración OpenCart (/admin) y nos dirigimos de inmediato a System / Localisation / Languages : Dentro nos encontraremos con esto: Damos clic en Insert, una vez dentro te pedirá rellenar una información, tal cual la siguiente imagen (por favor rellena con los mismos datos que aparecen): Una vez hayas rellenado todo el formulario, guarda la configuración dando clic en Save (Esquina superior derecha). Configurando el idioma principal
Bien, ya hemos añadido el idioma Español a nuestra tienda, ahora vamos a configurar nuestra preferencia, dejando el español como idioma principal. Para aquello nos tenemos que dirigir al menú System / Settings, ya dentro de dicha opción nos devolverá: A lo que daremos clic en Edit en la tienda que desean configurar para idioma español, Your Store en mi caso . Ahora que estamos dentro nos vamos a la pestaña Local: Y cambiamos Language y Administration Language por: Una vez hecho esto damos nuevamente clic en Save y nuestra tienda y panel de administración han sido correctamente configurados al idioma español. ¿ Sencillo no ? Ante cualquier consulta no dudes en exponerla comentando esta entrada, con gusto intentaremos ayudarte. Fuente: http://miweb.in/opencart-instalando-y-configurando-idioma-espanol/Saludos, Javier.
|
|
|
10
|
Programación / Desarrollo Web / [WordPress] Instalando y Configurando "Google Analytics"
|
en: 9 Abril 2014, 06:39 am
|
Hola ! En esta oportunidad veremos como utilizar Goolgle Analytics con WordPress. ¡ Vamos directo al grano ! ¿ Cómo lo hago ? Primero que todo, si no tienes una cuenta en Google Analytics, puedes asociar tu cuenta de Gmail aquí . Ya asociada nuestra cuenta, tendremos que rellenar un formulario con datos sobre nuestro sitio web, aceptar las políticas de uso y privacidad. Posterior a eso, nos dirigimos a Administrador y veremos esto: Cuando des clic en Código de seguimiento tendrás que copiar tu ID: (Obviamente con tu propio ID, en este caso mi id es UA-49848020-1) ¿ Dónde encuentro el plugin ? Puedes descargar el plugin desde WordPress PluginsInstalando plugin Una vez completada la descarga del plugin, vamos a nuestro panel de administración (/wp-admin) y ubicamos en nuestro menú Plugins / Añadir nuevo, donde nos encontraremos con esto: En Subir nos pedirá buscar el plugin en formato .zipDamos clic en " Instalar Ahora"... Configurando el plugin Una vez instalado el plugin tenemos que configurarlo, ahora es cuando entra en juego tu ID de Seguimiento.Vamos a Ajustes / Google Analytics...Pegamos nuestro ID de seguimiento en el recuadro y le damos Una vez finalizados estos pasos, al ingresar en tu cuenta de Google Analytics podrás ver los informes generados por las visitas a tu blog. ¡ Espero haya sido de utilidad ! Recuerda que ante cualquier consulta , no dudes en dejarla en nuestros comentarios . Fuente: http://miweb.in/wordpress-instalando-y-configurando-google-analytics/Saludos, Javier.
|
|
|
|
|
|
|