miércoles, 30 de octubre de 2019

Interrupciones en ensamblador.

Concepto de interrupciones.
Una interrupción es una situación especial que suspende la ejecución de un programa de modo que el sistema pueda realizar una acción para tratarla. Tal situación se da, por ejemplo, cuando un periférico requiere la atención del procesador para realizar una operación de E/S.
Las interrupciones constituyen quizá el mecanismo más importante para la conexión del microcontrolador con el mundo exterior, sincronizando la ejecución de programas con acontecimientos externos.

Pasos para el procesamiento.

1. Terminar la ejecución de la instrucción máquina en curso.

2. Salva el valor de contador de programa, IP, en la pila, de manera que en la CPU, al terminar el proceso, pueda seguir ejecutando el programa a partir de la última instrucción.

3. La CPU salta a la dirección donde está almacenada la rutina de servicio de interrupción (ISR, Interrupt Service Routine) y ejecuta esa rutina que tiene como objetivo atender al dispositivo que generó la interrupción.

4. Una vez que la rutina de la interrupción termina, el procesador restaura el estado que había guardado en la pila en el paso 2 y retorna al programa que se estaba usando anteriormente.

 
Ejemplos de interrupciones:

int 01h-->un solo paso
int 02h-->interrupcion no enmascarable
int 03h--> punto de interrupcion
int 04h-->desbordamiento
int 05h-->impresion de pantalla
int 08h-->Cronometro
int 15h-->Servicios del sistema
int 16h-->Funciones de entrada del teclado
int 18h-->Entrada con el Basic de Rom
int 19h-->Cargador ed arranque
int 1Ah-->Leer y establecer la hora
int 1Bh-->Obtener el control con una interrupcion de teclado.
int 2oh-->Terminar un programa
int 33h->Funciones del Raton

Instalación turbo assembler.

Link de descarga: https://sourceforge.net/projects/guitasm8086/







Registros principales para procesadores de 64 bits en ensamblador.

La CPU x86 tiene 14 registros internos y básicos. Algunos son realmente de 32 bits pero por ahora se utilizará el modo real que es compatible con el procesador 8086 (igualmente accesibles a la parte alta de éstos registros, inclusive en el modo real). Los registros son los siguientes (estos registros son de 16 bits nombrados de la siguiente manera, a excepción del registro de banderas).
Registros de uso general
  • AX: Acumulador (AL:AH)
  • BX: Registro base (BL:BH)
  • CX: Registro contador (CL:CH)
  • DX: Registro de datos (DL:DH)
Un registro es un espacio de almacenamiento disponible para el CPU. Una de las principales características de estos, es que pueden ser accedidos más rápido que cualquier otro dispositivo de almacenamiento de una computadora. Los procesadores x86 cuentan con una serie de registros disponibles para utilizar como almacenamiento temporal para variables, valores y demás información que utilizan durante la ejecución de instrucciones como así también punteros a secciones de memoria como la pila. Podemos mencionar 4 categorías diferentes:
  • Registros generales
  • Segmentos de registros
  • Flags (banderas de estado)
  • Instruction Pointer (IP), puntero a la próxima instrucción a ejecutar.

Registros generales

Normalmente, los registros generales almacenan datos o direcciones de memoria y son utilizados de manera intercambiable para lograr que se ejecuten las instrucciones del programa.  Algunos de estos registros generales son utilizados para funciones específicas. Por ejemplo, para realizar multiplicaciones o divisiones se utilizan los registros EAX EBX.

Flags

El registro que nombramos como EFLAG es un registro de estado. En esta arquitectura, tiene una longitud de 32 bits y cada uno de sus bits es una bandera. Según el valor de 0 o 1 de cada bit serán utilizados para controlar las operaciones de la CPU luego de la ejecución de una instrucción. Entre los registros más importantes para remarcar en relación al análisis de malware podemos enumerar:
  • ZF (Zero Flag): Este bit se activa cuando el resultado de una operación es igual a cero.
  • CF (Carry Flag): Este bit se activa cuando el resultado de una operación es muy grande o muy pequeño para el operador de destino.
  • SF (Sign Flag): Según si el resultado de una operación es un valor positivo o negativo. Si el valor es positivos se queda en cero y es uno en caso contrario.
  • TF (Trap Flag): Este flag se utiliza para depurar (debugging) un programa. En caso de que esté activo el procesador ejecutará una instrucción a la vez.

Un ejemplo práctico, la instrucción mov

De todas las instrucciones que se pueden ejecutar dentro de un procesador existen algunas de ellas que son las más comunes y habituales como así también las menos complejas. Una instrucción muy común es la instrucción mov cuya función es mover los datos desde una ubicación a otra. Esta instrucción utiliza dos operadores para realizar su trabajo. El primero es el destino al cual se quieren mover los datos y el segundo está relacionado con la dirección u ubicación de destino.

Dentro de los operadores con los que se puede utilizar la instrucción podemos incluir registros o direcciones de memoria directamente. A continuación podemos observar algunas de los usos más comunes de esta instrucción:

Lenguaje ensamblador.

El lenguaje ensamblador es un tipo de lenguaje de bajo nivel utilizado para escribir programas informáticos, y constituye la representación más directa del código máquina específico para cada arquitectura de microprocesador.
La importancia del lenguaje ensamblador es principalmente que se trabaja directamente con el microprocesador; por lo cual se debe de conocer el funcionamiento interno de este, tiene la ventaja de que en el se puede realizar cualquier tipo de programas que en los lenguajes de alto nivel no lo pueden realizar. Otro punto sería que los programas en ensamblador ocupan menos espacio en memoria.
• El único lenguaje que entienden los microcontroladores es el código máquina formado por ceros y unos del sistema binario.
• El lenguaje ensamblador expresa las instrucciones de una forma más natural al hombre a la vez que muy cercana al microcontrolador, ya que cada una de esas instrucciones se corresponde con otra en código máquina.


• El lenguaje ensamblador trabaja con nemónicos, que son grupos de caracteres alfanuméricos que simbolizan las órdenes o tareas a realizar.
•La traducción de los nemónicos a código máquina entendible por el microcontrolador la lleva a cabo un programa ensamblador.
• El programa escrito en lenguaje ensamblador se denomina código fuente (*.asm). El programa ensamblador proporciona a partir de este fichero el correspondiente código máquina, que suele tener la extensión *.hex.


Ventajas y desventajas del lenguaje ensamblador 
Ventajas
1. Como trabaja directamente con el microprocesador al ejecutar un programa, pues como este lenguaje es el mas cercano a la máquina la computadora lo procesa mas rápido.
2. Eficiencia de tamaño .- Un programa en ensamblador no ocupa mucho espacio en memoria porque no tiene que cargan librerías y demás como son los lenguajes de alto nivel.
3. Flexibilidad .- Es flexible porque todo lo que puede hacerse con una máquina, puede hacerse en el lenguaje ensamblador de esta máquina; los lenguajes de alto nivel tienen en una u otra forma limitantes para explotar al máximo los recursos de la máquina. O sea que en lenguaje ensamblador se pueden hacer tareas especificas que en un lenguaje de alto nivel no se pueden llevar acabo porque tienen ciertas limitantes que no se lo permite.
Desventajas
Tiempo de programación.
- Como es un lenguaje de bajo nivel requiere más instrucciones para realizar el mismo proceso, en comparación con un lenguaje de alto nivel. Por otro lado, requiere de más cuidado por parte del programador, pues es propenso a que los errores de lógica se reflejen más fuertemente en la ejecución.
Programas fuente grandes.
- Por las mismas razones que aumenta el tiempo, crecen los programas fuentes; simplemente requerimos más instrucciones primitivas para describir procesos equivalentes. Esto es una desventaja porque dificulta el mantenimiento de los programas, y nuevamente reduce la productividad de los programadores.
Peligro de afectar recursos inesperadamente. 
- Que todo error que podamos cometer, o todo riesgo que podamos tener, podemos afectar los recursos de la maquina, programar en este lenguaje lo más común que pueda pasar es que la máquina se bloquee o se reinicialize. Porque con este lenguaje es perfectamente posible (y sencillo) realizar secuencias de instrucciones inválidas, que normalmente no aparecen al usar un lenguaje de alto nivel.
Falta de portabilidad.
- Porque para cada máquina existe un lenguaje ensamblador; por ello, evidentemente no es una selección apropiada de lenguaje cuando deseamos codificar en una máquina y luego llevar los programas a otros sistemas operativos o modelos de computadoras.

Proyecto Egresados2 (Python, Django y conexión a MySQL)

Primero creamos nuestro proyecto.
django-admin startproject conexionegresados

Tenemos que instalar también la librería pymysql desde la ventana de comandos.


Después accedemos a nuestra carpeta recién creada.
cd conexionegresados

Al crear un nuevo archivo, nos pedirá realizar las migraciones necesarias. Este comando necesita ser ejecutado desde nuestra carpeta alumnos recién creada.
python manage.py migrate

Vamos a settings y en installed apps ingresamos el nombre de nuestro modelo, así como elegimos el idioma preferido de nuestro sitio, en nuestro caso ingresaremos es-es. En este caso como trabajaremos con MySQL también habrá que cambiar la base de datos. También hay que ingresar los siguientes datos en nuestro programa __init__

 

El código de nuestro modelo es el siguiente:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class datos_per(models.Model):
num_cont= models.CharField(max_length=10, primary_key= True,verbose_name='Numero de Control')
nombre = models.CharField(max_length=100)
apellido = models.CharField(max_length=100)
IS = 'IS'
LC = 'LC'
LAE = 'LAE'
CARRERA_CHOICES = (
('IS','Ing. en Sistemas'),
('LC', 'Lic. en Contaduria'),
('LAE', 'Lic. en Administracion de Empresas'))
Carrera = models.CharField(max_length=30,choices=CARRERA_CHOICES,default=IS,)
SEXO=(('F','Femenino'),('M','Masculino')) #se hace arreglo
Sexo = models.CharField(max_length=1,choices=SEXO,default='M')
Edad = models.IntegerField(help_text='Solo mayores de edad')
Trabajo = models.BooleanField(help_text='Marque la casilla si es asi',verbose_name='¿Se encuentra trabajando actualmente?')
Lugar_de_trabajo = models.CharField(max_length=100)
Sueldo = models.IntegerField()
Trabajo_area = models.BooleanField(help_text='Marque la casilla si es asi',verbose_name='¿Trabaja en el area de su carrera?')
email = models.EmailField()
Telefono = models.CharField(max_length=12)
fotografia = models.ImageField(default='Agregar imagen',help_text='Foto de no mas de 3 meses')
descripcion_trabajo = models.CharField(max_length=1000,verbose_name='Informacion relevante a su carrera profesional: ')


Realizamos la migración para que actualice el modelo recién ingresado.
Creamos nuestro super usuario:
python manage.py createsuperuser

Ingresamos nuestros datos en Django, para ingresar a Django seguimos la dirección que nos da cuando corremos el servidor, usualmente es 127.0.0.1:8000  y si queremos ingresar como admin sería 127.0.0.1:8000/admin


Comprobamos que nuestros datos se hayan ingresado correctamente a la base de datos, en este caso iremos a MySQL Workbench.

Proyecto Alumnos (Conexión entre Python y Django con sqlite3).

Primero creamos nuestro proyecto.
django-admin startproject alumnos

Después accedemos a nuestra carpeta recién creada.
cd alumnos

Al crear un nuevo archivo, nos pedirá realizar las migraciones necesarias. Este comando necesita ser ejecutado desde nuestra carpeta alumnos recién creada.
python manage.py migrate

Vamos a settings y en installed apps ingresamos el nombre de nuestro modelo, así como elegimos el idioma preferido de nuestro sitio, en nuestro caso ingresaremos es-es.


El código de nuestro modelo es el siguiente:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class Datospersonales(models.Model):
num_cont= models.CharField(max_length=10, primary_key= True,verbose_name='Numero de Control')
nombre = models.CharField(max_length=100)
SEXO=(('F','Femenino'),('M','Masculino')) #se hace arreglo
Sexo = models.CharField(max_length=1,choices=SEXO,default='M')
Edad = models.IntegerField(help_text='Solo mayores de edad')
fecha_nacimiento= models.DateField()
IS = 'IS'
LC = 'LC'
LAE = 'LAE'
CARRERA_CHOICES = (
('IS','Ing. en Sistemas'),
('LC', 'Lic. en Contaduria'),
('LAE', 'Lic. en Administracion de Empresas')
)
Carrera = models.CharField(max_length=30,choices=CARRERA_CHOICES,default=IS,
)
Telefono = models.CharField(max_length=12)
email = models.EmailField()
Domicilio= models.TextField()
view raw models.py hosted with ❤ by GitHub


Realizamos la migración para que actualice el modelo recién ingresado.
Creamos nuestro super usuario:
Ingresamos nuestros datos en Django, para ingresar a Django seguimos la dirección que nos da cuando corremos el servidor, usualmente es 127.0.0.1:8000  y si queremos ingresar como admin sería 127.0.0.1:8000/admin 
 
 Comprobamos que nuestros datos se hayan ingresado correctamente a la base de datos.

Proyecto Egresados (Conexión entre Python y Django con sqlite3).

Primero creamos nuestro proyecto desde consola.
django-admin startproject egresados

Después accedemos a nuestra carpeta recién creada.
cd egresados

Al crear un nuevo archivo, nos pedirá realizar las migraciones necesarias. Este comando necesita ser ejecutado desde nuestra carpeta alumnos recién creada.
python manage.py migrate

Vamos a settings y en installed apps ingresamos el nombre de nuestro modelo, así como elegimos el idioma preferido de nuestro sitio, en nuestro caso ingresaremos es-es.


El código de nuestro modelo es el siguiente:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class Egresados_datos(models.Model):
num_cont= models.CharField(max_length=10, primary_key= True,verbose_name='Numero de Control')
nombre = models.CharField(max_length=100)
apellido = models.CharField(max_length=100)
IS = 'IS'
LC = 'LC'
LAE = 'LAE'
CARRERA_CHOICES = (
('IS','Ing. en Sistemas'),
('LC', 'Lic. en Contaduria'),
('LAE', 'Lic. en Administracion de Empresas'))
Carrera = models.CharField(max_length=30,choices=CARRERA_CHOICES,default=IS,)
SEXO=(('F','Femenino'),('M','Masculino')) #se hace arreglo
Sexo = models.CharField(max_length=1,choices=SEXO,default='M')
Edad = models.IntegerField(help_text='Solo mayores de edad')
Trabajo = models.BooleanField(help_text='Marque la casilla si es asi',verbose_name='¿Se encuentra trabajando actualmente?')
Lugar_de_trabajo = models.CharField(max_length=100)
Sueldo = models.IntegerField()
Trabajo_area = models.BooleanField(help_text='Marque la casilla si es asi',verbose_name='¿Trabaja en el area de su carrera?')
email = models.EmailField()
Telefono = models.CharField(max_length=12)
fotografia = models.ImageField(default='Agregar imagen',help_text='Foto de no mas de 3 meses')
descripcion_trabajo = models.CharField(max_length=1000,verbose_name='Informacion relevante a su carrera profesional: ')
view raw models.py hosted with ❤ by GitHub

Realizamos la migración para que actualice el modelo recién ingresado.


Creamos nuestro super usuario:
python manage.py createsuperuser

Ingresamos nuestros datos en Django, para ingresar a Django seguimos la dirección que nos da cuando corremos el servidor, usualmente es 127.0.0.1:8000  y si queremos ingresar como admin sería 127.0.0.1:8000/admin


Comprobamos que nuestros datos se hayan ingresado correctamente a la base de datos.

jueves, 17 de octubre de 2019

Programa propio: Blockbuster.

El siguiente programa fue creado como ejemplo de una conexion entre mongoDB y Pycharm. Es un ejemplo de una terminal de renta de videojuegos de blockbuster.

Codigo:
import tkMessageBox
from Tkinter import *
from tkMessageBox import *
from Tkinter import OptionMenu
from PIL import ImageTk, Image
from pymongo import MongoClient
import datetime
global numerojuegos,cargo,total,finalconcargos,fecha
format= "%d/%m/%Y"
today = datetime.date.today()
fecha=today.strftime(format)
#Definiendo ventana
ventana = Tk()
ventana.title("Blockbuster")
ventana = Canvas(width = 420, height = 420, bg = '#3C48D1')
ventana.pack(expand = YES, fill = BOTH)
#Banner
width = 420
height = 420
img = Image.open("blockbuster.png")
img = img.resize((width,height), Image.ANTIALIAS)
photoImg = ImageTk.PhotoImage(img)
ventana.create_image(15, -150, anchor = NW, image = photoImg)
vp = Frame(ventana)
vp.pack(expand=1) #Configurar el metodo pack()
vp.config(bg="#3C48D1")
vp.config(width="300", height="400")
vp.grid(column=0, row=0, padx=(100, 100), pady=(100, 100))
vp.rowconfigure(0, weight=1)
Fecha=Label(vp,text="Fecha de Corte")
Fecha.grid(column=0, row=7)
Fecha.config(background="Yellow",foreground="black")
FechaEntry = " "
FechaEntry = Entry(vp, width=10, textvariable=FechaEntry)
FechaEntry.grid(row=8, column=0)
FechaEntry.config(background="Yellow",foreground="black")
FechaEntry.insert(0, fecha)
print fecha
tipo = StringVar(vp)
tipo.set("...")
cantidad = StringVar(vp)
cantidad.set("...")
pago = StringVar(vp)
pago.set("...")
etiqueta_tipo = Label(vp, text='Videojuego a rentar : ')
etiqueta_tipo.config(background="Yellow",foreground="black")
ent_tipo = OptionMenu(vp, tipo, "Silent Hill", "Fire Emblem Awakening", "Super Smash Bros Melee","The Witcher 3")
etiqueta_tipo.grid(row=1, column=1, padx=(10, 10), pady=(10, 10), sticky=W)
ent_tipo.grid(row=1, column=0)
ent_tipo.config(background="Yellow",foreground="black")
print ent_tipo
etiqueta_cantidad =Label(vp, text='Dias a rentar: ')
etiqueta_cantidad.config(background="Yellow",foreground="black")
ent_numero = OptionMenu(vp, cantidad, "1", "2", "3", "4", "5", "6", "7", "8", "9", "10")
etiqueta_cantidad.grid(row=4, column=1, padx=(10, 10), pady=(10, 10), sticky=W)
ent_numero.grid(row=4, column=0)
ent_numero.config(background="Yellow",foreground="black")
etiqueta_pago =Label(vp, text='Forma de pago: ')
etiqueta_pago.config(background="Yellow",foreground="black")
ent_pago =OptionMenu(vp, pago, "Efectivo", "Tarjeta")
etiqueta_pago.grid(row=6, column=1, padx=(10, 10), pady=(10, 10), sticky=W)
ent_pago.grid(row=6, column=0)
ent_pago.config(background="Yellow",foreground="black")
def Conexion(numerojuegos,cargo,total,final):
client = MongoClient('localhost',27017)
db = client['blockbuster']
document = {'numero_juegos':numerojuegos,'pago_tarjeta':cargo,'pago_efectivo':total,'pago_finalcontarjeta':final,"Fecha_dia":fecha }
_id= db['registro'].insert(document)
def calcular():
juego = str(tipo.get())
numerojuegos = int(cantidad.get())
dinero = str(pago.get())
if juego == "Silent Hill" and numerojuegos > 0 and dinero == "Tarjeta":
total = numerojuegos * 40
cargo = total * 0.08
finalconcargos = total + cargo
tkMessageBox.showinfo("[Renta Silent Hill : Pago con Tarjeta], su total es de: " ,finalconcargos)
print numerojuegos
print cargo
print total
print finalconcargos
elif juego == "Silent Hill" and numerojuegos > 0 and dinero == "Cupon Renta 30%":
total = numerojuegos * 40
cargo = total * 0.30
finalconcargos = total - cargo
tkMessageBox.showinfo("[Silent Hill : Descuento de Cupon ], su total es de: " ,finalconcargos)
print numerojuegos
print cargo
print total
print finalconcargos
elif juego == "Silent Hill" and numerojuegos > 0 and dinero == "Efectivo":
total = numerojuegos * 40
cargo = 0
finalconcargos = 0
tkMessageBox.showinfo("[Silent Hill : Pago con Efectivo], su total es de: ", total)
print numerojuegos
print cargo
print total
print finalconcargos
elif juego == "Fire Emblem Awakening" and numerojuegos > 0 and dinero == "Tarjeta":
total = numerojuegos * 50
cargo = total * 0.08
finalconcargos = total + cargo
tkMessageBox.showinfo("[Fire Emblem Awakening : Pago con Tarjeta], su total es de: " ,finalconcargos)
print numerojuegos
print cargo
print total
print finalconcargos
elif juego == "Fire Emblem Awakening" and numerojuegos > 0 and dinero == "Efectivo":
total = numerojuegos * 50
cargo = 0
finalconcargos = 0
tkMessageBox.showinfo("[Fire Emblem Awakening : Pago con Efectivo], su total es de: " , total)
print numerojuegos
print cargo
print total
print finalconcargos
elif juego == "Super Smash Bros Melee" and numerojuegos > 0 and dinero == "Tarjeta":
total = numerojuegos * 60
cargo = total * 0.05
finalconcargos = total + cargo
tkMessageBox.showinfo("[Super Smash Bros Melee : Pago con Tarjeta], su total es de: " ,finalconcargos)
print numerojuegos
print cargo
print total
print finalconcargos
elif juego == "Super Smash Bros Melee" and numerojuegos > 0 and dinero == "Efectivo":
total = numerojuegos * 60
cargo = 0
finalconcargos = 0
tkMessageBox.showinfo("[Super Smash Bros Melee : Pago con Efectivo], su total es de: " ,total)
print numerojuegos
print cargo
print total
print finalconcargos
elif juego == "The Witcher 3" and numerojuegos > 0 and dinero == "Tarjeta":
total = numerojuegos * 100
cargo = total * 0.08
finalconcargos = total + cargo
tkMessageBox.showinfo("[The Witcher 3 : Pago con Tarjeta], su total es de: ", finalconcargos)
print numerojuegos
print cargo
print total
print finalconcargos
elif juego == "The Witcher 3" and numerojuegos > 0 and dinero == "Efectivo":
total = numerojuegos * 100
cargo = 0
finalconcargos = 0
tkMessageBox.showinfo("[The Witcher 3: Pago con Efectivo], su total es de: ", total)
print numerojuegos
print cargo
print total
print finalconcargos
Conexion(numerojuegos, cargo, total, finalconcargos)
boton = Button(vp, text='Total a Facturar', command=calcular, width=20)
boton.grid(row=8, column=1, padx=(10, 10), pady=(10, 10), sticky=N)
boton.config(background="Yellow",foreground="black")
ventana.mainloop()
view raw Blockbuster.py hosted with ❤ by GitHub
https://drive.google.com/file/d/1bD2-1oHPGTCU3_Qy15lxTEjDN6nVtWI7/view?usp=sharing

lunes, 7 de octubre de 2019

Ejemplo: Venta de boletos (MongoDB;Python).

El siguiente simula ser una terminal de venta de boletos.

Código:
from Tkinter import *
import tkMessageBox
from tkMessageBox import *
from pymongo import MongoClient
global total,boletos,area
#VENTANA CON BANNERS
ventana = Tk()
ventana.title("Venta de Boletos")
ventana = Canvas(width = 500, height = 630, bg = 'black')
ventana.pack(expand = YES, fill = BOTH)
banner1 = PhotoImage(file = 'C:\Users\Usuario\PycharmProjects\ProjectBETA/21p.gif')
ventana.create_image(10, 10, image = banner1, anchor = NW)
banner2 = PhotoImage(file = 'C:\Users\Usuario\PycharmProjects\ProjectBETA/21pb.gif')
ventana.create_image(5, 520, image = banner2, anchor = NW)
#AREA A ESCOGER
var = StringVar(ventana)
var.set("Elija un area")
etiqueta_area = Label(ventana, text='Area: ',background="yellow3",foreground="black",font=('Arial',10)).place(x=120, y=250)
ent_area = OptionMenu(ventana, var, "Pista General", "Segundo Piso", "Tercer Piso")
ent_area.config(background="yellow3",foreground="black")
ent_area.place(x=290, y=250)
#CANTIDAD DE BOELTOS
et1 = Label(ventana, text="Cantidad de boletos",background="yellow3",foreground="black",font=('Arial',10)).place(x=80, y=320)
arr1 = [1, 2, 3, 4, 5, 6, 7]
cantidad = StringVar()
s1 = Spinbox(ventana, textvariable=cantidad, values=arr1,background="yellow3",foreground="black").place(x=280, y=320)
def Conexion(total,boletos,area):
client = MongoClient('localhost', 27017)
db = client['boletos'] # me conecto con la bd empresa
document = {'Venta_boleto':total,'boletos':boletos, "Area":area}
_id = db['venta'].insert(document)
print _id
#MOSTRAR MAPA DEL EVENTO
def mostrarmapa():
mapa= Toplevel()
mapa.title("Mapa del Evento")
map = PhotoImage(file='C:\Users\Usuario\PycharmProjects\ProjectBETA/mapa.gif')
mostrar = Label(mapa, image=map)
mostrar.pack()
mapa.mainloop()
#CALCULAR TOTAL A PAGAR
def comprar():
area = str(var.get())
boletos = int(cantidad.get())
total=0
if area=="Pista General" and boletos<=4:
total=boletos*1900
print total
print boletos
print area
tkMessageBox.showinfo("Total", cantidad.get()+" boletos para Pista General, su total es de: " + str(total))
elif area=="Pista General" and boletos>4:
showerror("Error", "No se permite adquirir mas de 4 boletos para esta area")
elif area=="Segundo Piso" and boletos>0:
total = boletos * 1500
print total
print boletos
print area
tkMessageBox.showinfo("Total", cantidad.get()+" boletos para Segundo Piso, su total es de: " + str(total))
elif area=="Tercer Piso" and boletos>0:
total = boletos * 1200
print total
print boletos
print area
tkMessageBox.showinfo("Total", cantidad.get()+" boletos para Tercer Piso, su total es de: " + str(total))
Conexion(total,boletos, area)
#BOTONES
b1=Button(ventana, text='Mostrar mapa',background="yellow3",foreground="black", command=mostrarmapa,font=('Arial',10)).place(x=170, y=400)
b2=Button(ventana, text='Pagar', background="yellow3",foreground="black", command=comprar,font=('Arial',10)).place(x=275, y=400)
ventana.mainloop()
view raw boletos.py hosted with ❤ by GitHub


Ejemplo: Restaurante Hamburguesas (MongoDB;Pycharm).

Código:


# sencilla = 20 ; doble =25 ; triple =28
# al pagar con tarjeta se carga un 5% = 0.05
from Tkinter import *
import tkMessageBox
from Tkinter import OptionMenu
from pymongo import MongoClient
global numero,cargo,total,final
ventana = Tk()
ventana.title("HAMBURGUESAS EL GORDO")
ventana.geometry("450x400")
ventana.config(bg="deepskyblue4")
vp = Frame(ventana)
vp.config(bg="indianred3")
vp.grid(column=0, row=0, padx=(50, 50), pady=(10, 10))
vp.rowconfigure(0, weight=1)
tipo = StringVar(vp)
tipo.set("...")
cantidad = StringVar(vp)
cantidad.set("...")
pago = StringVar(vp)
pago.set("...")
etiqueta_tipo = Label(vp, text='Tipo: ')
ent_tipo = OptionMenu(vp, tipo, "Sencilla", "Doble", "Triple")
etiqueta_tipo.grid(row=1, column=1, padx=(10, 10), pady=(10, 10), sticky=W)
ent_tipo.grid(row=1, column=3)
print ent_tipo
etiqueta_cantidad = Label(vp, text='Cantidad: ')
ent_numero = OptionMenu(vp, cantidad, "1", "2", "3", "4", "5", "6", "7", "8", "9", "10")
etiqueta_cantidad.grid(row=4, column=1, padx=(10, 10), pady=(10, 10), sticky=W)
ent_numero.grid(row=4, column=3)
etiqueta_pago = Label(vp, text='Forma de pago: ')
ent_pago = OptionMenu(vp, pago, "Efectivo", "Tarjeta")
etiqueta_pago.grid(row=6, column=1, padx=(10, 10), pady=(10, 10), sticky=W)
ent_pago.grid(row=6, column=3)
def Conexion(numero,cargo,total,final):
client = MongoClient('localhost',27017)
db = client['hamburguesas']
document = {'numero_hamb':numero,'pago_tarj':cargo,'Pago_efectivo':total,'Pago_final':final}
_id= db['corte'].insert(document)
def calcular():
burger = str(tipo.get())
numero = int(cantidad.get())
dinero = str(pago.get())
if burger == "Sencilla" and numero > 0 and dinero == "Tarjeta":
total = numero * 20
cargo = total * 0.05
final = total + cargo
tkMessageBox.showinfo("Total", final)
print numero
print cargo
print total
print final
elif burger == "Sencilla" and numero > 0 and dinero == "Efectivo":
total = numero * 20
cargo=0
final=0
tkMessageBox.showinfo("Total", total)
print numero
print cargo
print total
print final
elif burger == "Doble" and numero > 0 and dinero == "Tarjeta":
total = numero * 25
cargo = total * 0.05
final = total + cargo
tkMessageBox.showinfo("Total", final)
print numero
print cargo
print total
print final
elif burger == "Doble" and numero > 0 and dinero == "Efectivo":
total = numero * 25
cargo = 0
final = 0
tkMessageBox.showinfo("Total", total)
print numero
print cargo
print total
print final
elif burger == "Triple" and numero > 0 and dinero == "Tarjeta":
total = numero * 28
cargo = total * 0.05
final = total + cargo
tkMessageBox.showinfo("Total", final)
print numero
print cargo
print total
print final
elif burger == "Triple" and numero > 0 and dinero == "Efectivo":
total = numero * 28
cargo = 0
final = 0
tkMessageBox.showinfo("Total", total)
print numero
print cargo
print total
print final
Conexion(numero, cargo, total, final)
boton = Button(vp, text='Total', command=calcular, width=20)
boton.grid(row=8, column=1, padx=(10, 10), pady=(10, 10), sticky=N)
ventana.mainloop()



Conectar mongoDB desde Pycharm (Cajero).

El siguiente programa inserta datos desde Pycharm a nuestra base de datos en MongoDB. Es una simulación de un cajero.


from Tkinter import *
import tkMessageBox
from pymongo import MongoClient
import datetime
global fecha
format= "%d/%m/%Y"
today = datetime.date.today()
fecha=today.strftime(format)
def SumMul():
try:
_e0= int(v0.get())
_e0=_e0*.50
_e1 = int(v1.get())
_e1 = _e1 * 1
_e2 = int(v2.get())
_e2 = _e2 * 2
_e3 = int(v3.get())
_e3 = _e3 * 5
_e4 = int(v4.get())
_e4 = _e4 * 10
_e5 = int(v5.get())
_e5 = _e5 * 20
_e6 = int(v6.get())
_e6 = _e6 * 50
_e7 = int(v7.get())
_e7 = _e7 * 100
_e8 = int(v8.get())
_e8 = _e8 * 200
_e9 = int(v9.get())
_e9 = _e9 * 500
_e10= _e0 + _e1 + _e2 + _e3 + _e4 + _e5 + _e6 + _e7 + _e8 + _e9
tkMessageBox.showinfo("El resultado es", _e10)
conexion(_e0,_e1,_e2,_e3,_e4,_e5,_e6,_e7,_e8,_e9,_e10)
except ValueError:
tkMessageBox.showerror("Introduce un numero entero")
def conexion(_e0,_e1,_e2,_e3,_e4,_e5,_e6,_e7,_e8,_e9,_e10):
client = MongoClient('localhost', 27017)
db = client['store'] # me conecto con la bd store
# collection = db['empleados']
document = {"Moneda_50":_e0 , "Moneda_1": _e1, "Moneda_5": _e2,
"Moneda_10": _e4, "Monedo_20":_e5, "Billete_50": _e6,
"Billete_100":_e7, "Billete_200":_e8, "Billete_500":_e9,
"Total_dia:":_e10,"Fecha_dia":fecha }
_id = db['corte_dia'].insert(document)
print _id
return
v=Tk()
v.title("")
v.geometry("300x450")
vp = Frame(v)
vp.grid(column=0, row=0, padx=(50,50), pady=(10,10))
vp.columnconfigure(0, weight=1)
vp.rowconfigure(0, weight =1)
ET0=Label(vp,text="MONEDAS")
ET0.grid(column=2, row=0)
Fecha=Label(vp,text="Fecha de Corte")
Fecha.grid(column=1, row=1)
FechaEntry = " "
FechaEntry = Entry(vp, width=10, textvariable=FechaEntry)
FechaEntry.grid(row=1, column=2)
FechaEntry.insert(0, fecha)
print fecha
e0=Label(vp,text="0.50")
e0.grid(column=1, row=3)
e1=Label(vp,text="1.00")
e1.grid(column=1, row=4)
e2=Label(vp,text="2.00")
e2.grid(column=1, row=5)
e3=Label(vp,text="5.00")
e3.grid(column=1, row=6)
e3=Label(vp,text="10.00")
e3.grid(column=1, row=7)
v0 = ""
v0 = Entry(vp, width=5, textvariable=v0)
v0.grid(row=3, column=2)
v1 = ""
v1 = Entry(vp, width=5, textvariable=v1)
v1.grid(row=4, column=2)
v2 = ""
v2 = Entry(vp, width=5, textvariable=v2)
v2.grid(row=5, column=2)
v3 = ""
v3 = Entry(vp, width=5, textvariable=v3)
v3.grid(row=6, column=2)
v4 = ""
v4 = Entry(vp, width=5, textvariable=v4)
v4.grid(row=7, column=2)
ET1=Label(vp,text="BILLETES")
ET1.grid(column=2, row=9)
e4=Label(vp,text="20.00")
e4.grid(column=1, row=11)
e5=Label(vp,text="50.00")
e5.grid(column=1, row=12)
e6=Label(vp,text="100.00")
e6.grid(column=1, row=13)
e7=Label(vp,text="200.00")
e7.grid(column=1, row=14)
e8=Label(vp,text="500.00")
e8.grid(column=1, row=15)
v5 = ""
v5 = Entry(vp, width=5, textvariable=v5)
v5.grid(row=11, column=2)
v6 = ""
v6 = Entry(vp, width=5, textvariable=v6)
v6.grid(row=12, column=2)
v7 = ""
v7 = Entry(vp, width=5, textvariable=v7)
v7.grid(row=13, column=2)
v8 = ""
v8 = Entry(vp, width=5, textvariable=v8)
v8.grid(row=14, column=2)
v9 = ""
v9 = Entry(vp, width=5, textvariable=v9)
v9.grid(row=15, column=2)
b = Button(vp, text="TOTAL", command=SumMul)
b.grid(row=17, column=2, padx=(20, 20), pady=(20, 20))
bc = Button(vp, text="Conectar BD", command=conexion)
bc.grid(row=19, column=2, padx=(20, 20), pady=(20, 20))
v.mainloop()
view raw Cajero.py hosted with ❤ by GitHub