-
Tutorial Python y MySQL
PRIMERA PARTE
En este tutorial les mostrare lo increiblemente fácil y rápido que es crear un pequeño sistema para agregar, eliminar y acutialiazar registros en una base de datos.
El sistema es sencillo, tenemos una arquitectura cliente-servidor, en la que interactuan dos aplicaciones, una es mysqld y otra es la ventanita de Python que vamos a hacer nosotros.
Lo que vamos a necesitar para esto es todo esto:
- Python (en MacOSX y Ubuntu ya viene instalado)
- MySQL (en Ubuntu sudo apt-get install mysql; en MacOSX sudo port install mysql5-server)
- El conector de Python a MySQL ( en Ubuntu sudo apt-get install python-mysqldb; en MacOSX sudo port install py26-mysql )
- Un editor de textos con resaltador de sintaxis para Python y SQL (Notepad++ pa Windows, gedit pa Ubuntu y Smultron para MacOSX)
Primero crearemos una pequeña base de datos de una escuela, para esto comenzamos haciendo el modelo de la base de datos, para eso hay que hacer un diagrama de entidad-relación en una hoja o si no en gliffy.com como le hice yo:
ENTIDADES
maestros
alumnos
materias
cursos
RELACIONES
cursoalumnos
Ahora inventamos unos registros para encontrarle sentido:
Codigo:
maestros
maestro_id maestro_nombre maestro_sueldo
001 Jose 60000
002 Jessica 2000
003 Elba 10000
alumnos
alumno_id alumno_nombre alumno_adeudo
1200001 TaggerBear 1200
1200002 Soft 3620
1200003 Vomito 1800
materias
materia_id materia_nombre materia_semestre
ELEC Electromagnetismo 3
COM1 Computación I 1
OYC Ondas y Calor 3
cursos
curso_id materia_id maestro_id curso_hora curso_salon
aaaa ELEC 001 16:10 3201
bbbb ELEC 001 17:00 3201
cccc ELEC 002 16:10 3202
dddd OYC 003 17:00 3401
eeee COM1 002 17:50 3401
cursoalumnos
curso_id alumno_id
aaaa 1200001
bbbb 1200003
cccc 1200002
eeee 1200003
dddd 1200001
dddd 1200002
eeee 1200001
eeee 1200002
Ya teniendo el modelo hay que crear la base de datos, para esto tenemos que arrancar el servidor MySQL(mysqld), para eso abrimos el cmd o el shell y corremos el ejecutable, luego para crear bases de datos hay que usar el shell de MySQL(mysql), para eso solo abrimos otro cmd o terminal y lo corremos.
Codigo:
sudo mysqld
mysql -u root -p ''
create database escuela;
use database escuela;
Copien todo esto y peguenlo:
Codigo:
create table maestros ( maestro_id INT, maestro_nombre VARCHAR(50), maestro_sueldo INT, primary key (maestro_id) ) ENGINE = InnoDB;
create table alumnos ( alumno_id INT, alumno_nombre VARCHAR(50), alumno_adeudo INT, primary key(alumno_id) ) ENGINE = InnoDB;
create table materias ( materia_id VARCHAR(4), materia_nombre VARCHAR(50), materia_semestre INT, primary key(materia_id) ) ENGINE = InnoDB;
create table cursos ( curso_id VARCHAR(4), materia_id VARCHAR(4), maestro_id INT, curso_hora VARCHAR(5), curso_salon INT, primary key (curso_id) ) ENGINE = InnoDB;
create table cursoalumnos ( curso_id VARCHAR(4), alumno_id INT ) ENGINE = InnoDB;
create index indmat on cursos (materia_id);
create index indmae on cursos (maestro_id);
create index indcur on cursoalumnos (curso_id);
create index indalu on cursoalumnos (alumno_id);
alter table cursos add constraint indmat foreign key (materia_id) references materias (materia_id) on delete cascade on update cascade;
alter table cursos add constraint indmae foreign key (maestro_id) references maestros (maestro_id) on delete cascade on update cascade;
alter table cursoalumnos add constraint indcur foreign key (curso_id) references cursos(curso_id) on delete cascade on update cascade;
alter table cursoalumnos add constraint indalu foreign key (alumno_id) references alumnos(alumno_id) on delete cascade on update cascade;
insert into maestros ( maestro_id, maestro_nombre, maestro_sueldo ) values(001,"Jose",60000),(002,"Jessica",2000),(003,"Elba",10000);
insert into alumnos ( alumno_id, alumno_nombre, alumno_adeudo ) values (1200001,"TaggerBear",1200),(1200002,"Soft",3620),(1200003,"Vomito",1800);
insert into materias ( materia_id, materia_nombre, materia_semestre ) values ("ELEC","Electromagnetismo",3),("COM1","Computación I",1),("OYC","Ondas y Calor",3);
insert into cursos ( curso_id, materia_id, maestro_id, curso_hora, curso_salon ) values ("aaaa","ELEC",001,"16:10",3201),("bbbb","ELEC",001,"17:00",3201),("cccc","ELEC",002,"16:10",3202),("dddd","OYC",003,"17:00",3401),("eeee","COM1",002,"17:50",3401);
insert into cursoalumnos ( curso_id, alumno_id ) values ("aaaa",1200001),("bbbb",1200003),("cccc",1200002),("eeee",1200003),("dddd",1200001),("dddd",1200002),("eeee",1200001),("eeee",1200002);
Ya esta lista la base de datos, con tablas y registros, ahora vamos a hacer unas consultas para ver que tal quedo:
Toda los datos de todos los maestros
Codigo:
SELECT * FROM maestros;
Los nombres de todos los maestros ordenados alfabeticamente
Codigo:
SELECT maestro_nombre FROM maestros ORDER BY maestro_nombre;
Cuanto gana la maestra Jessica
Codigo:
SELECT maestro_sueldo FROM maestros WHERE maestro_nombre = "Jessica";
Que maestros dan clase a las 16:10
Codigo:
SELECT maestro_nombre FROM maestros
INNER JOIN cursos ON cursos.maestro_id = maestros.maestro_id
WHERE curso_hora = "16:10";
La lista de la clase que tiene por ID "dddd"
Codigo:
SELECT DISTINCT cursoalumnos.alumno_id, alumno_nombre FROM alumnos
INNER JOIN cursoalumnos ON cursoalumnos.alumno_id = alumnos.alumno_id
WHERE curso_id = "dddd";
Que maestros dan la materia de Electromagnetismo
Codigo:
SELECT maestro_nombre FROM maestros
INNER JOIN cursos ON cursos.maestro_id = maestros.maestro_id
INNER JOIN materias ON materias.materia_id = cursos.materia_id
WHERE materia_nombre = "Electromagnetismo";
Que maestros no dan Electromagnetismo
Codigo:
SELECT maestro_nombre FROM maestros
INNER JOIN cursos ON cursos.maestro_id = maestros.maestro_id
INNER JOIN materias ON materias.materia_id = cursos.materia_id
WHERE materia_nombre != "Electromagnetismo";
Todos los maestros que dan Electromagnetisma a las 16:10
Codigo:
SELECT maestro_nombre FROM maestros
INNER JOIN cursos ON cursos.maestro_id = maestros.maestro_id
INNER JOIN materias ON materias.materia_id = cursos.materia_id
WHERE materia_nombre = "Electromagnetismo" AND curso_hora = "16:10";
En que salones se esta dando clase a las 16:10
Codigo:
SELECT curso_salon FROM cursos WHERE curso_hora = "16:10";
Saber que alumnos no estan tomando clase a 16:10
Codigo:
SELECT alumno_nombre FROM alumnos
INNER JOIN cursoalumnos ON cursoalumnos.alumno_id = alumnos.alumno_id
INNER JOIN cursos ON cursos.curso_id = cursoalumnos.curso_id
WHERE curso_hora != "16:10";
El horario del alumno con matricula 1200001
Codigo:
SELECT materia_nombre,curso_hora,curso_salon FROM cursos
INNER JOIN materias ON materias.materia_id = cursos.materia_id
INNER JOIN cursoalumnos ON cursos.curso_id = cursoalumnos.curso_id
WHERE alumno_id = 1200001;
El horario del alumno con la matrícula 1200001 ordenado por hora
Codigo:
SELECT materia_nombre,curso_hora,curso_salon FROM cursos
INNER JOIN materias ON materias.materia_id = cursos.materia_id
INNER JOIN cursoalumnos ON cursos.curso_id = cursoalumnos.curso_id
WHERE alumno_id = 1200001
ORDER BY curso_hora;
Todos los alumnos(nombre y matricula) que tienen alguna clase con la maestro Jose
Codigo:
SELECT alumnos.alumno_id, alumno_nombre FROM alumnos
INNER JOIN cursoalumnos ON cursoalumnos.alumno_id = alumnos.alumno_id
INNER JOIN cursos ON cursos.curso_id = cursoalumnos.curso_id
INNER JOIN maestros ON maestros.maestro_id = cursos.maestro_id
WHERE maestro_nombre = "Jose";
Todos los alumnos(nombre y matricula) que tienen clase con el Jessica en la materia de Electromagnetismo
Codigo:
SELECT alumnos.alumno_id, alumno_nombre FROM alumnos
INNER JOIN cursoalumnos ON cursoalumnos.alumno_id = alumnos.alumno_id
INNER JOIN cursos ON cursos.curso_id = cursoalumnos.curso_id
INNER JOIN maestros ON maestros.maestro_id = cursos.maestro_id
INNER JOIN materias ON materias.materia_id = cursos.materia_id
WHERE maestro_nombre = "Jessica" AND materia_nombre = "Electromagnetismo";
Todos los alumnos(nombre y matricula) que tienen clase con la maestra Jessica en el salon 3401
Codigo:
SELECT alumnos.alumno_id, alumno_nombre FROM alumnos
INNER JOIN cursoalumnos ON cursoalumnos.alumno_id = alumnos.alumno_id
INNER JOIN cursos ON cursos.curso_id = cursoalumnos.curso_id
INNER JOIN maestros ON maestros.maestro_id = cursos.maestro_id
INNER JOIN materias ON materias.materia_id = cursos.materia_id
WHERE maestro_nombre = "Jessica" AND curso_salon = "3401";
Todos los alumnos(nombre y matricula) que tienen clase con la maestra Jessica a las 16:10
Codigo:
SELECT alumnos.alumno_id, alumno_nombre FROM alumnos
INNER JOIN cursoalumnos ON cursoalumnos.alumno_id = alumnos.alumno_id
INNER JOIN cursos ON cursos.curso_id = cursoalumnos.curso_id
INNER JOIN maestros ON maestros.maestro_id = cursos.maestro_id
INNER JOIN materias ON materias.materia_id = cursos.materia_id
WHERE maestro_nombre = "Jessica" AND curso_hora = "16:10";
Todos los maestros que le dan clase al alumno que lleva por nombre TaggerBear
Codigo:
SELECT maestro_nombre from maestros
INNER JOIN cursos ON cursos.maestro_id = maestros.maestro_id
INNER JOIN cursoalumnos ON cursoalumnos.curso_id = cursos.curso_id
INNER JOIN alumnos ON alumnos.alumno_id = cursoalumnos.alumno_id
WHERE alumno_nombre = "TaggerBear";
-
Rulea, se ve que estará interesante todo el tutorial, recién estoy checando SQL con php :)
Gracias por los tutoriales que has estado subiendo tagger, eres mi idolo :meme:
-
Parte 2
SEGUNDA PARTE
Ahora les explicare un poco que es una base de datos, para los que no son IAS.
Una base de datos son varios datos separados y relacionados de forma jerarquica, esta jerarqu'ia es:
Base de Datos
Codigo:
METAFORA LOGICAMENTE FISICAMENTE
Tabla Archivo Area
Fila Registro Bloque
Celda/Dato Campo Palabra
? Caracter Byte
? ? Bit
Codigo:
Nombre de la Tabla --> Entidad/Relacion
Nombre de la Columna --> Atributo
Entonces una base de datos es un conjunto de tablas, estos tablas son un conjunto de registros, los registros son un conjunto de campos y estos campos contienen caracteres.
Por ejemplo en nuestra base de datos esta es una tabla/archivo:
Codigo:
1200001 TaggerBear 1200
1200002 Soft 3620
1200003 Vomito 1800
este sería un registro
Codigo:
1200001 TaggerBear 1200
este sería un campo:
y este un caracter
Ahora, SQL(que lo pronuncian "sicuel" porque antes se llamaba SEQL) es un lenguaje computacional que se encarga de solicitarle información a una base de datos mandando ordenes a un DBMS para que este regrese la información solicitada. Al la acción de solicitar información de una base de datos se le llama "consulta", que en ingles le dicen "query".
Existen varios tipos de "querys"
- De creación CREATE
Estas sirven para crear bases de datos, tablas, indices, etc - De selección SELECT
Estas sirven para traer información - De inserción INSERT INTO
Son para ingresar o agregar nuevos datos en los campos - De actualización ALTER
Son para actualizar un dato en un campo - De eliminación DELETE
Son para eliminar datos o registros de una tabla
MySQL es un Administrador de Bases de Datos Relacionales(RDBMS), que funciona en forma de servidor, es decir que es un programa que espera solicitudes de otros programas que se les llama "clientes".
MySQL se conforma de varios programas, ninguno de ellos tiene GUI, osea que todos se manejan por consola, los dos programas mas importantes son:
mysqld ---> es el servidor, significa "MySQL daemon"
mysql ---> es el RDBMS, este es un cliente de mysqld
Entonces para poder crear, modificar y eliminar bases de datos en MySQL tenemos que usar el programa mysql, pero para poder usarlo antes tenemos que correr mysqld
Otros DBMS populares son:
pero los pros siempre recomiendan comenzar con MySQL porque es el mas fácil de usar y es gratis. Si no te gustan los programas de consola existen varios clientes de MySQL con interfaz gráfica:
-
Tercera parte
TERCERA PARTE
Ahora lo que haremos sera una aplicación con GUI, que nos permitira acceder a la base de datos para agregar, modificar y eliminar registros o datos en un registro, para esto utilizaremos el lenguaje de programación Pynthon y la librería de widgets Tkinter.
Para comenzar primero tenemos que saber que tanto queremos que haga nuestro aplicación, y el diseño de las "pantallas".
Vamos a gliffy.com o a framebox.org para dibujar las pantallas:
Ahora verificamos que Python este instalado en nuestro sistema
si no les sale algo como esto quiere decir que no lo tienen instalado::
y checamos también si tenemos el modulo tkinter
Codigo:
python
import Tkinter
Si les sale este error quiere decir que no lo tienen instalado:
Codigo:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named Tkinter
Comencemos haciendo una ventanita sin nada:
Codigo:
#!/usr/bin/python
from Tkinter import *
venprincipal = Tk()
venprincipal.mainloop()
Para los que ya saben C++ o Java y estan acostumbrados a ver un método main, en Pyton no se necesita pero podemos ponerlo, así:
Codigo:
#!/usr/bin/python
from Tkinter import *
def main():
venprincipal = Tk()
venprincipal.mainloop()
if __name__ == '__main__':
main()
En la primer línea le decimos al interprete que ejecute primero la librería/modulo Tkinter
En la tercer línea definimos una función a la cual llamamos main
Dentro de este método creamos un objeto tipo Tk al cual llamamos venprincipal
Luego llamamos al método mainloop() del objeto venprincipal
Por último preguntamos algo como esto:
SI el nombre de este programa es igual a el nombre del programa en ejecución entonces corre la función main()
Ahora la primer "pantalla" que haremos sera la que tiene la forma para visualizar, modificar y eliminar registros.
Codigo:
#!/usr/bin/python
from Tkinter import *
def main():
venprincipal = Tk()
lp = Label(venprincipal, text="Alumnos")
l1 = Label(venprincipal, text="Id:")
l2 = Label(venprincipal, text="Nombre:")
l3 = Label(venprincipal, text="Adeudo:")
c1 = Entry(venprincipal)
c2 = Entry(venprincipal)
c3 = Entry(venprincipal)
b1 = Button(venprincipal, text="Nuevo")
b2 = Button(venprincipal, text="Modificar")
b3 = Button(venprincipal, text="Eliminar")
b4 = Button(venprincipal, text="<")
b5 = Button(venprincipal, text=">")
lp.pack()
l1.pack()
l2.pack()
l3.pack()
c1.pack()
c2.pack()
c3.pack()
b1.pack()
b2.pack()
b3.pack()
b4.pack()
b5.pack()
venprincipal.mainloop()
if __name__ == '__main__':
main()
http://img14.imageshack.us/img14/418...formadesor.png
Genial, ya tenemos todos los widgets que necesitamos solo que no estan ordenados, para eso usamos una forma de distribuir los widgets como si estuvieran en una tabla, mas o menos como en las tablas de HTML.
Codigo:
#!/usr/bin/python
from Tkinter import *
def main():
venprincipal = Tk()
lp = Label(venprincipal, text="Alumnos")
l1 = Label(venprincipal, text="Id:")
l2 = Label(venprincipal, text="Nombre:")
l3 = Label(venprincipal, text="Adeudo:")
c1 = Entry(venprincipal)
c2 = Entry(venprincipal)
c3 = Entry(venprincipal)
b1 = Button(venprincipal, text="Nuevo")
b2 = Button(venprincipal, text="Modificar")
b3 = Button(venprincipal, text="Eliminar")
b4 = Button(venprincipal, text="<")
b5 = Button(venprincipal, text=">")
lp.grid(row=0, column=0, columnspan=5)
l1.grid(row=1, column=0, columnspan=2)
l2.grid(row=2, column=0, columnspan=2)
l3.grid(row=3, column=0, columnspan=2)
c1.grid(row=1, column=2, columnspan=3)
c2.grid(row=2, column=2, columnspan=3)
c3.grid(row=3, column=2, columnspan=3)
b1.grid(row=4, column=0)
b2.grid(row=4, column=1)
b3.grid(row=4, column=2)
b4.grid(row=4, column=3)
b5.grid(row=4, column=4)
venprincipal.mainloop()
if __name__ == '__main__':
main()
http://img545.imageshack.us/img545/4...interforma.png:ilusion:
Bueno pues lo único nuevo que hicimos fue crear cada uno de los widgets que necesitamos para esta forma, que son, etiquetas, campos de texto y botones, para crear un objeto tipo etiqueta usamos Label(venprincipal, text="texto"), el primer parametro nos pide que le digamos en que ventana va a ir esa etiqueta y el segundo nos pide una serie de opciones pero en este caso solo usamos una que es "text" que sirve para definir que texto va a tener la etiqueta, lo mismo se hace para crear cada campo de texto y cada boton.
Ahora bien lo bueno, las consultas a MySQL y defiinir que pasa al dar clic en los botones
Codigo:
#!/usr/bin/python
from Tkinter import *
import MySQLdb
ii = 0
xx = 0
yy = 1
zz = 2
resultado = ((0,0,0))
def leertabla():
global resultado
conexion = MySQLdb.connect( user="root", passwd="", db="escuela" )
cursorr = conexion.cursor()
query = "SELECT * FROM alumnos"
cursorr.execute(query)
resultado = cursorr.fetchall()
cursorr.close()
conexion.commit()
conexion.close()
c1.delete(0,END)
c2.delete(0,END)
c3.delete(0,END)
c1.insert(INSERT, resultado[ii][xx])
c2.insert(INSERT, resultado[ii][yy])
c3.insert(INSERT, resultado[ii][zz])
def nuevo():
global resultado
print(resultado)
print(resultado[0])
print(resultado[0][0])
def modificar():
print("modificar")
def eliminar():
print("eliminar")
def atras():
global ii, resultado
ii = ii - 1
c1.delete(0,END)
c2.delete(0,END)
c3.delete(0,END)
c1.insert(INSERT, resultado[ii][xx])
c2.insert(INSERT, resultado[ii][yy])
c3.insert(INSERT, resultado[ii][zz])
def adelante():
global ii, resultado
ii = ii + 1
c1.delete(0,END)
c2.delete(0,END)
c3.delete(0,END)
c1.insert(INSERT, resultado[ii][xx])
c2.insert(INSERT, resultado[ii][yy])
c3.insert(INSERT, resultado[ii][zz])
def main():
global c1,c2,c3
venprincipal = Tk()
lp = Label(venprincipal, text="Alumnos")
l1 = Label(venprincipal, text="Id:")
l2 = Label(venprincipal, text="Nombre:")
l3 = Label(venprincipal, text="Adeudo:")
c1 = Entry(venprincipal)
c2 = Entry(venprincipal)
c3 = Entry(venprincipal)
b1 = Button(venprincipal, text="Nuevo", command=nuevo)
b2 = Button(venprincipal, text="Modificar", command=modificar)
b3 = Button(venprincipal, text="Eliminar", command=eliminar)
b4 = Button(venprincipal, text="<", command=atras)
b5 = Button(venprincipal, text=">", command=adelante)
lp.grid(row=0, column=0, columnspan=5)
l1.grid(row=1, column=0, columnspan=2)
l2.grid(row=2, column=0, columnspan=2)
l3.grid(row=3, column=0, columnspan=2)
c1.grid(row=1, column=2, columnspan=3)
c2.grid(row=2, column=2, columnspan=3)
c3.grid(row=3, column=2, columnspan=3)
b1.grid(row=4, column=0)
b2.grid(row=4, column=1)
b3.grid(row=4, column=2)
b4.grid(row=4, column=3)
b5.grid(row=4, column=4)
leertabla()
venprincipal.mainloop()
if __name__ == '__main__':
main()
Lo nuevo que se ve aquí es que incluimos el modulo MySQLdb(que es el que nos conecta a el servidor de MySQL), 4 variables globales, y también creamos 6 funciones:
leertabla()
Hace una solicitud a la base de datos para traer toda la información de la tabla "alumnos", esta información se guarda en una tupla/fila que llamamos "resultado"
nuevo() lo que pasara al darle clic al boton nuevo
modificar() lo que pasara al darle clic al boton modificar
eliminar() lo que pasara al darle cilc al boton eliminar
atras()
Le resta uno a ii
elimina el texto que hay en cada campo
luego inserta el texto de cada valor dentro del nuevo indice de la fila resultado
por ejemplo si quieren ver el contenido de resultado
resultado
es
((1200001L, 'TaggerBear', 1200L), (1200002L, 'Soft', 3620L), (1200003L, 'Vomito', 1800L))
resultado[0]
es
(1200001L, 'TaggerBear', 1200L)
resultado[0][0]
es
1200001L
adelante()
Hace lo mismo que atras() pero aquí le sumo uno a ii
Hasta el momento lo único que hace la aplicación es ver los registros uno por uno con los botones que tienen las flechas( '<' y '>' ), en las siguientes "PARTEs" vamos a ir metiendole código a las demás funicones.
-
Cuarta parte
CUARTA PARTE
Codigo:
#!/usr/bin/python
from Tkinter import *
import MySQLdb
ii = 0
xx = 0
yy = 1
zz = 2
resultado = ((0,0,0))
def leertabla():
global ii,xx,yy,zz,resultado,l1,l2,l3,l4,c1,c2,c3,b1,b2,b3,b4,b5
conexion = MySQLdb.connect( user="root", passwd="", db="escuela" )
cursor = conexion.cursor()
query = "SELECT * FROM alumnos"
cursor.execute(query)
resultado = cursor.fetchall()
cursor.close()
conexion.commit()
conexion.close()
c1.config( state=NORMAL )
c2.config( state=NORMAL )
c3.config( state=NORMAL )
c1.delete(0,END)
c2.delete(0,END)
c3.delete(0,END)
c1.insert(INSERT, resultado[ii][xx])
c2.insert(INSERT, resultado[ii][yy])
c3.insert(INSERT, resultado[ii][zz])
c1.config( state=DISABLED )
c2.config( state=DISABLED )
c3.config( state=DISABLED )
def nuevo():
global ii,xx,yy,zz,l1,l2,l3,l4,c1,c2,c3,b1,b2,b3,b4,b5
b1.config( text="Agregar", command=agregar )
l4.config( text="Estas creando un nuevo registro,\ncuando termines da clic en \"Agregar\"" )
c1.config( state=NORMAL )
c2.config( state=NORMAL )
c3.config( state=NORMAL )
c1.delete(0,END)
c2.delete(0,END)
c3.delete(0,END)
def agregar():
global ii,xx,yy,zz,l1,l2,l3,l4,c1,c2,c3,b1,b2,b3,b4,b5
b1.config( text="Nuevo", command=nuevo )
l4.config( text="" )
x = c1.get()
y = c2.get()
z = c3.get()
conexion = MySQLdb.connect( user="root", passwd="", db="escuela" )
cursor = conexion.cursor()
query = "INSERT INTO alumnos(alumno_id, alumno_nombre, alumno_adeudo) VALUES(%s,\"%s\",%s);" % (x,y,z)
cursor.execute(query)
cursor.close()
conexion.commit()
conexion.close()
c1.config( state=DISABLED )
c2.config( state=DISABLED )
c3.config( state=DISABLED )
leertabla()
def modificar():
global ii,xx,yy,zz,l1,l2,l3,l4,c1,c2,c3,b1,b2,b3,b4,b5
b2.config( text="Actualizar", command=actualizar )
l4.config( text="Estas modificando un registro,\ncuando termines da clic en \"Actualizar\"" )
c1.config( state=NORMAL )
c2.config( state=NORMAL )
c3.config( state=NORMAL )
def actualizar():
global ii,xx,yy,zz,l1,l2,l3,l4,c1,c2,c3,b1,b2,b3,b4,b5
b2.config( text="Modificar", command=modificar )
l4.config( text="" )
x = c1.get()
y = c2.get()
z = c3.get()
conexion = MySQLdb.connect( user="root", passwd="", db="escuela" )
cursor = conexion.cursor()
query = "UPDATE alumnos SET alumno_id=%s, alumno_nombre=\"%s\", alumno_adeudo=%s WHERE alumno_id=%s" % (x,y,z,c1.get())
cursor.execute(query)
cursor.close()
conexion.commit()
conexion.close()
c1.config( state=DISABLED )
c2.config( state=DISABLED )
c3.config( state=DISABLED )
leertabla()
def eliminar():
global ii,xx,yy,zz,l1,l2,l3,l4,c1,c2,c3,b1,b2,b3,b4,b5
c1.config( state=NORMAL )
c2.config( state=NORMAL )
c3.config( state=NORMAL )
conexion = MySQLdb.connect( user="root", passwd="", db="escuela" )
cursor = conexion.cursor()
query = "DELETE FROM alumnos WHERE alumno_id=%s" % (c1.get())
cursor.execute(query)
cursor.close()
conexion.commit()
conexion.close()
c1.config( state=DISABLED )
c2.config( state=DISABLED )
c3.config( state=DISABLED )
ii = 0
leertabla()
def atras():
global ii,xx,yy,zz,resultado,l1,l2,l3,l4,c1,c2,c3,b1,b2,b3,b4,b5
ii = ii - 1
if ii == 0:
b4.config( state=DISABLED )
else:
b4.config( state=NORMAL )
if ii == (len(resultado)-1):
b5.config( state=DISABLED )
else:
b5.config( state=NORMAL )
c1.config( state=NORMAL )
c2.config( state=NORMAL )
c3.config( state=NORMAL )
c1.delete(0,END)
c2.delete(0,END)
c3.delete(0,END)
c1.insert(INSERT, resultado[ii][xx] )
c2.insert(INSERT, resultado[ii][yy] )
c3.insert(INSERT, resultado[ii][zz] )
c1.config( state=DISABLED )
c2.config( state=DISABLED )
c3.config( state=DISABLED )
def adelante():
global ii,xx,yy,zz,resultado,l1,l2,l3,l4,c1,c2,c3,b1,b2,b3,b4,b5
ii = ii + 1
if ii == (len(resultado)-1):
b5.config( state=DISABLED )
else:
b5.config( state=NORMAL )
if ii == 0:
b4.config( state=DISABLED )
else:
b4.config( state=NORMAL )
c1.config( state=NORMAL )
c2.config( state=NORMAL )
c3.config( state=NORMAL )
c1.delete(0,END)
c2.delete(0,END)
c3.delete(0,END)
c1.insert(INSERT, resultado[ii][xx] )
c2.insert(INSERT, resultado[ii][yy] )
c3.insert(INSERT, resultado[ii][zz] )
c1.config( state=DISABLED )
c2.config( state=DISABLED )
c3.config( state=DISABLED )
def main():
global ii,xx,yy,zz,resultado,l1,l2,l3,l4,c1,c2,c3,b1,b2,b3,b4,b5
venprincipal = Tk()
lp = Label(venprincipal, text="Alumnos", font=('Arial',20,'bold'))
l1 = Label(venprincipal, text="Id:", anchor=E, width=17)
l2 = Label(venprincipal, text="Nombre:", anchor=E, width=17)
l3 = Label(venprincipal, text="Adeudo:", anchor=E, width=17)
l4 = Label(venprincipal, text="" )
c1 = Entry(venprincipal)
c2 = Entry(venprincipal)
c3 = Entry(venprincipal)
b1 = Button(venprincipal, text="Nuevo", command=nuevo)
b2 = Button(venprincipal, text="Modificar", command=modificar)
b3 = Button(venprincipal, text="Eliminar", command=eliminar)
b4 = Button(venprincipal, text="<", command=atras)
b5 = Button(venprincipal, text=">", command=adelante)
lp.grid(row=0, column=0, columnspan=5)
l1.grid(row=1, column=0, columnspan=2)
l2.grid(row=2, column=0, columnspan=2)
l3.grid(row=3, column=0, columnspan=2)
l4.grid(row=4, column=0, columnspan=5)
c1.grid(row=1, column=2, columnspan=3)
c2.grid(row=2, column=2, columnspan=3)
c3.grid(row=3, column=2, columnspan=3)
b1.grid(row=5, column=0)
b2.grid(row=5, column=1)
b3.grid(row=5, column=2)
b4.grid(row=5, column=3)
b5.grid(row=5, column=4)
leertabla()
venprincipal.mainloop()
if __name__ == '__main__':
main()
http://img717.imageshack.us/img717/9...terform000.png
http://img121.imageshack.us/img121/7...terform001.png
http://img696.imageshack.us/img696/8...terform002.png
-
QUINTA PARTE :comilla: la última :comilla:
Codigo:
#!/usr/bin/python
from Tkinter import *
import tkMessageBox
import MySQLdb
ii = 0
xx = 0
yy = 1
zz = 2
resultado = ((0,0,0))
def leertabla():
global ii,xx,yy,zz,resultado,l1,l2,l3,l4,c1,c2,c3,b1,b2,b3,b4,b5
conexion = MySQLdb.connect( user="root", passwd="", db="escuela" )
cursor = conexion.cursor()
query = "SELECT * FROM alumnos"
cursor.execute(query)
resultado = cursor.fetchall()
cursor.close()
conexion.commit()
conexion.close()
c1.config( state=NORMAL )
c2.config( state=NORMAL )
c3.config( state=NORMAL )
c1.delete(0,END)
c2.delete(0,END)
c3.delete(0,END)
c1.insert(INSERT, resultado[ii][xx])
c2.insert(INSERT, resultado[ii][yy])
c3.insert(INSERT, resultado[ii][zz])
c1.config( state=DISABLED )
c2.config( state=DISABLED )
c3.config( state=DISABLED )
def nuevo():
global ii,xx,yy,zz,l1,l2,l3,l4,c1,c2,c3,b1,b2,b3,b4,b5
b1.config( text="Agregar", command=agregar )
l4.config( text="Estas creando un nuevo registro,\ncuando termines da clic en \"Agregar\"" )
c1.config( state=NORMAL )
c2.config( state=NORMAL )
c3.config( state=NORMAL )
c1.delete(0,END)
c2.delete(0,END)
c3.delete(0,END)
def agregar():
global ii,xx,yy,zz,l1,l2,l3,l4,c1,c2,c3,b1,b2,b3,b4,b5
b1.config( text="Nuevo", command=nuevo )
l4.config( text="" )
x = c1.get()
y = c2.get()
z = c3.get()
conexion = MySQLdb.connect( user="root", passwd="", db="escuela" )
cursor = conexion.cursor()
query = "INSERT INTO alumnos(alumno_id, alumno_nombre, alumno_adeudo) VALUES(%s,\"%s\",%s);" % (x,y,z)
cursor.execute(query)
cursor.close()
conexion.commit()
conexion.close()
c1.config( state=DISABLED )
c2.config( state=DISABLED )
c3.config( state=DISABLED )
leertabla()
def modificar():
global ii,xx,yy,zz,l1,l2,l3,l4,c1,c2,c3,b1,b2,b3,b4,b5
b2.config( text="Actualizar", command=actualizar )
l4.config( text="Estas modificando un registro,\ncuando termines da clic en \"Actualizar\"" )
c1.config( state=NORMAL )
c2.config( state=NORMAL )
c3.config( state=NORMAL )
def actualizar():
global ii,xx,yy,zz,l1,l2,l3,l4,c1,c2,c3,b1,b2,b3,b4,b5
b2.config( text="Modificar", command=modificar )
l4.config( text="" )
x = c1.get()
y = c2.get()
z = c3.get()
conexion = MySQLdb.connect( user="root", passwd="", db="escuela" )
cursor = conexion.cursor()
query = "UPDATE alumnos SET alumno_id=%s, alumno_nombre=\"%s\", alumno_adeudo=%s WHERE alumno_id=%s" % (x,y,z,c1.get())
cursor.execute(query)
cursor.close()
conexion.commit()
conexion.close()
c1.config( state=DISABLED )
c2.config( state=DISABLED )
c3.config( state=DISABLED )
leertabla()
def eliminar():
global ii,xx,yy,zz,l1,l2,l3,l4,c1,c2,c3,b1,b2,b3,b4,b5
if tkMessageBox.askyesno("Eliminacion de registro", "Estas realmente seguro de desear eliminar este registro?"):
c1.config( state=NORMAL )
c2.config( state=NORMAL )
c3.config( state=NORMAL )
conexion = MySQLdb.connect( user="root", passwd="", db="escuela" )
cursor = conexion.cursor()
query = "DELETE FROM alumnos WHERE alumno_id=%s" % (c1.get())
cursor.execute(query)
cursor.close()
conexion.commit()
conexion.close()
c1.config( state=DISABLED )
c2.config( state=DISABLED )
c3.config( state=DISABLED )
ii = 0
leertabla()
def atras():
global ii,xx,yy,zz,resultado,l1,l2,l3,l4,c1,c2,c3,b1,b2,b3,b4,b5
ii = ii - 1
if ii == 0:
b4.config( state=DISABLED )
else:
b4.config( state=NORMAL )
if ii == (len(resultado)-1):
b5.config( state=DISABLED )
else:
b5.config( state=NORMAL )
c1.config( state=NORMAL )
c2.config( state=NORMAL )
c3.config( state=NORMAL )
c1.delete(0,END)
c2.delete(0,END)
c3.delete(0,END)
c1.insert(INSERT, resultado[ii][xx] )
c2.insert(INSERT, resultado[ii][yy] )
c3.insert(INSERT, resultado[ii][zz] )
c1.config( state=DISABLED )
c2.config( state=DISABLED )
c3.config( state=DISABLED )
def adelante():
global ii,xx,yy,zz,resultado,l1,l2,l3,l4,c1,c2,c3,b1,b2,b3,b4,b5
ii = ii + 1
if ii == (len(resultado)-1):
b5.config( state=DISABLED )
else:
b5.config( state=NORMAL )
if ii == 0:
b4.config( state=DISABLED )
else:
b4.config( state=NORMAL )
c1.config( state=NORMAL )
c2.config( state=NORMAL )
c3.config( state=NORMAL )
c1.delete(0,END)
c2.delete(0,END)
c3.delete(0,END)
c1.insert(INSERT, resultado[ii][xx] )
c2.insert(INSERT, resultado[ii][yy] )
c3.insert(INSERT, resultado[ii][zz] )
c1.config( state=DISABLED )
c2.config( state=DISABLED )
c3.config( state=DISABLED )
def venalu():
global popup,ii,xx,yy,zz,resultado,l1,l2,l3,l4,c1,c2,c3,b1,b2,b3,b4,b5
popup = Toplevel()
lp = Label(popup, text="Alumnos", font=('Arial',20,'bold'))
l1 = Label(popup, text="Id:", anchor=E, width=17)
l2 = Label(popup, text="Nombre:", anchor=E, width=17)
l3 = Label(popup, text="Adeudo:", anchor=E, width=17)
l4 = Label(popup, text="" )
c1 = Entry(popup)
c2 = Entry(popup)
c3 = Entry(popup)
b1 = Button(popup, text="Nuevo", command=nuevo)
b2 = Button(popup, text="Modificar", command=modificar)
b3 = Button(popup, text="Eliminar", command=eliminar)
b4 = Button(popup, text="<", command=atras)
b5 = Button(popup, text=">", command=adelante)
b6 = Button(popup, text="Salir", command=popup.destroy )
lp.grid(row=0, column=0, columnspan=5)
l1.grid(row=1, column=0, columnspan=2)
l2.grid(row=2, column=0, columnspan=2)
l3.grid(row=3, column=0, columnspan=2)
l4.grid(row=4, column=0, columnspan=5)
c1.grid(row=1, column=2, columnspan=3)
c2.grid(row=2, column=2, columnspan=3)
c3.grid(row=3, column=2, columnspan=3)
b1.grid(row=5, column=0)
b2.grid(row=5, column=1)
b3.grid(row=5, column=2)
b4.grid(row=5, column=3)
b5.grid(row=5, column=4)
b6.grid(row=6, column=0, columnspan=5)
leertabla()
popup.grab_set()
popup.focus_set()
popup.wait_window()
def venmae():
pass
def venmat():
pass
def vencur():
pass
def venlis():
pass
def vencon():
global popup, entradacon, areadetexto
popup = Toplevel()
areadetexto = Text(popup)
etiquetacon = Label(popup, text="Query:", width=10)
entradacon = Entry(popup, width=40)
botoncon = Button(popup, text="Enviar", command=consulta)
areadetexto.grid(row=0, column=0, columnspan=2)
etiquetacon.grid(row=1, column=0)
entradacon.grid(row=1, column=1)
botoncon.grid(row=2, column=0, columnspan=2)
popup.grab_set()
popup.focus_set()
popup.wait_window()
def consulta():
global entradacon, areadetexto
conexion = MySQLdb.connect( user="root", passwd="", db="escuela" )
cursor = conexion.cursor()
query = entradacon.get()
cursor.execute(query)
resultado = cursor.fetchall()
salida = ""
for x in resultado:
lar = len(x)
for i in range(0, lar):
salida = salida + "{0}\t\t".format( x[i] )
salida = salida + "\n"
areadetexto.insert(INSERT, salida)
cursor.close
conexion.commit()
conexion.close()
def main():
global ii,xx,yy,zz,resultado,l1,l2,l3,l4,c1,c2,c3,b1,b2,b3,b4,b5
venprincipal = Tk()
label1 = Label(text="PseudoSchool Manager v1.0", font=(('Arial',20,'bold')))
boton1 = Button(venprincipal, text="Alumnos", command=venalu)
boton2 = Button(venprincipal, text="Maestros", command=venmae)
boton3 = Button(venprincipal, text="Materias", command=venmat)
boton4 = Button(venprincipal, text="Cursos", command=vencur)
boton5 = Button(venprincipal, text="Listas", command=venlis)
boton6 = Button(venprincipal, text="Consultas", command=vencon)
boton7 = Button(venprincipal, text="Salir", command=venprincipal.quit)
label1.grid(row=0, column=0, columnspan=5)
boton1.grid(row=1, column=0)
boton2.grid(row=1, column=1)
boton3.grid(row=1, column=2)
boton4.grid(row=1, column=3)
boton5.grid(row=1, column=4)
boton6.grid(row=2, column=0, columnspan=5)
boton7.grid(row=3, column=4)
venprincipal.mainloop()
if __name__ == '__main__':
main()
No esta terminado, me faltaron las formas para las demas tablas y la de "Listas" iva a tener un GridView para ver las listas de alumnos inscritos en los diferentes cursos.
Ahora la ventana principal es la que tiene la etiqueta "PseudoSchool Manager v1.0", y al hacer clic en cualquiera de los botones se crea otra ventana con la forma.
La pantalla de consultas tiene una area de texto, una etiqueta, una campo de texto y un boton, allí se pueden hacer consultas de todo tipo a la base de datos.
Ya ahí le dejamos, es mucho código y llega un momento en que ya no tienes control, lo mejor sería hacerlo orientado a objetos ne vez de procedural como lo tenemos ahí, así podríamos separar cada ventana en un clase.
http://img864.imageshack.us/img864/6...er1mayo001.png
http://img62.imageshack.us/img62/920...er1mayo002.png
http://img716.imageshack.us/img716/9...er1mayo003.png
Todo el código de este hilo esta bajo la licencia GPL(ya que yo me copie mucho código de varias páginas) puedes usar este código para hacer lo que quieras siempre y cuando compartas tus modificaciones, la idea es que la raza lo use como referencia para sus proyectos de las siguientes materias:
- Programación Avanzada I y II
- Base de Datos y Lenguajes
- Simulación de Sistemas
- Proyecto IAS II
Yo se que hay programas como: Visual FoxPro, Visual Studio, Delphi, etc, en los que haces las ventanas/pantallas, las bases de datos y los querys visualmente, y te generan el código de estos automaticamente, que es a lo que le llaman RAD(Rapid Application Development), pero si aquí estamos aprendiendo y no tenemos fecha límite de entrega de la aplicación terminada, ¿por qué no hacerlo lentamente con puro código?, para mi está es la mejor manera de aprender a programar.
Ahora la idea es portar este sistemita a web con JavaScript crudo usando XHR para comunicarse con scripts de PHP.