Tkinter
Tkinter
Si no queremos tener que hacer referencia al alias tk podemos importar de este modo, como
verás en la línea 4 ya podemos omitir tk. y escribir directamente Tk().
P á g i n a 1 | 88
En la línea 5 definimos un objeto llamado etiqueta, que será de la clase tkinter el método Label,
como parámetros donde tiene que ir root y el texto que tiene que tener.
P á g i n a 2 | 88
Capítulo 2: ¿Qué son los widgets? – El widget Frame() y el método
pack()
Vamos a ejecutar:
P á g i n a 3 | 88
Al dar unas dimensiones al marco la ventana se redimensiona para que pueda entrar el marco.
Vamos a ejecutar:
El widget Frame()
P á g i n a 4 | 88
Este será el resultado:
P á g i n a 5 | 88
Capítulo 3: El método grid()
P á g i n a 6 | 88
Este será el resultado:
Otro ejemplo:
P á g i n a 7 | 88
Este será el resultado:
P á g i n a 8 | 88
Este será el resultado:
P á g i n a 9 | 88
Otro ejemplo:
# Marco 1
marco_principal1 = Frame()
marco_principal1.grid(row=0, column=0)
marco_principal1.config(width="100", height="100")
marco_principal1.config(bg="red")
# Marco 2
marco_principal2 = Frame()
marco_principal2.grid(row=1, column=0)
marco_principal2.config(width="100", height="100")
marco_principal2.config(bg="blue")
# Marco 3
marco_principal3 = Frame()
marco_principal3.grid(row=1, column=1)
marco_principal3.config(width="100", height="100")
marco_principal3.config(bg="yellow")
# Marco 4
marco_principal4 = Frame()
marco_principal4.grid(row=2, column=0)
marco_principal4.config(width=100, height="100")
marco_principal4.config(bg="green")
root.mainloop()
P á g i n a 10 | 88
Queremos que el ultimo marco sea de color naranja.
# Marco 1
marco_principal1 = Frame()
marco_principal1.grid(row=0, column=0)
marco_principal1.config(width="100", height="100")
marco_principal1.config(bg="red")
# Marco 2
marco_principal2 = Frame()
marco_principal2.grid(row=1, column=0)
marco_principal2.config(width="100", height="100")
marco_principal2.config(bg="blue")
# Marco 3
marco_principal3 = Frame()
marco_principal3.grid(row=1, column=1)
marco_principal3.config(width="100", height="100")
marco_principal3.config(bg="yellow")
# Marco 4
marco_principal4 = Frame()
marco_principal4.grid(row=2, column=0)
marco_principal4.config(width=100, height="100")
marco_principal4.config(bg="green")
# Marco 5
marco_principal5 = Frame()
marco_principal5.grid(row=2, column=1)
marco_principal5.config(width=100, height="100")
marco_principal5.config(bg="orange")
root.mainloop()
P á g i n a 11 | 88
Capítulo 4: Relativas y el widget button()
from tkinter import *
root = Tk()
# Marco 1
marco_principal1 = Frame()
marco_principal1.grid(row=0, column=0)
marco_principal1.config(width="100", height="100")
marco_principal1.config(bg="red")
# Marco 2
marco_principal2 = Frame()
marco_principal2.grid(row=0, column=1)
marco_principal2.config(width="100", height="100")
marco_principal2.config(bg="blue")
# Marco 3
marco_principal3 = Frame()
marco_principal3.grid(row=1, column=0)
marco_principal3.config(width="100", height="100")
marco_principal3.config(bg="yellow")
# Marco 4
marco_principal4 = Frame()
marco_principal4.grid(row=1, column=1)
marco_principal4.config(width=100, height="100")
marco_principal4.config(bg="green")
# Marco 5
marco_principal5 = Frame()
marco_principal5.grid(row=2, column=0)
marco_principal5.config(width=100, height="100")
marco_principal5.config(bg="orange")
# Marco 6
marco_principal6 = Frame()
marco_principal6.grid(row=2, column=1)
marco_principal6.config(width=100, height="100")
marco_principal6.config(bg="black")
root.mainloop()
P á g i n a 12 | 88
• padx → definir el ancho en pixeles.
• pady → definir el alto en pixeles.
• state → si le asignados DISABLE no permitirá presionarlo.
• grid → por mediación de row (fila) y columna (columna) controlamos su posición.
P á g i n a 13 | 88
Capítulo 5: Llamar a funciones desde un botón
from tkinter import *
root = Tk()
def click_boton():
texto = Label(root, text="¡No vuelvas a presionar el botón!").grid()
root.mainloop()
Creamos una función llamada click_boton() que le asignamos a texto el objeto de tipo Label
(etiqueta) con el texto “¡No vuelvas a presionar el botón!”
Si a la función le agregamos los paréntesis, cuando ejecutemos el programa esta será llamada
una vez, pero cuando hagamos clic en el botón esta no responderá. Aparecerá una sola vez.
def click_boton():
texto = Label(root, text="¡No vuelvas a presionar el
botón!").grid(row=0, column=0)
P á g i n a 14 | 88
En el texto le daremos una posición determinada con el grid(row=0,
columna=0).
Vamos a ejecutar y pulsar el botón varias veces.
¿Cómo haríamos si queremos que el texto parezca por debajo del botón?
def click_boton():
texto = Label(root, text="¡No vuelvas a presionar el
botón!").grid(row=1, column=0)
Modificando las columnas y filas del grid tanto en el objeto texto de la función click_boton(),
como el objeto boton1 de tipo Button.
Cuando ejecutemos y hagamos un clic.
def click_boton():
texto = Label(root, text="¡No vuelvas a presionar el
botón!").grid(row=0, column=0)
P á g i n a 15 | 88
Ejercicio práctico:
P á g i n a 16 | 88
Capítulo 6: FORMULARIOS con el widget Entry() y CONTRASEÑAS
protegidas
entrada = Entry(root)
entrada.grid(row=0, column=0)
def click_boton():
texto = Label(root, text="¡Se envio correctamente!").grid(row=0,
column=0)
root.mainloop()
En la función click:botón() el objeto texto de tipo Label que contiene el texto “¡Se envío
correctamente! Y con las mismas coordenadas de fila 0 columna 0, al estar en las mismas
coordenadas, un texto sustituirá al otro.
Vamos a ejecutar:
P á g i n a 17 | 88
from tkinter import *
root = Tk()
entrada = Entry(root)
entrada.grid(row=0, column=0)
def click_boton():
texto = Label(root, text="¡Se envio correctamente!").grid(row=1,
column=0)
root.mainloop()
Vamos a ejecutar:
Ponemos el texto.
Presionamos el botón.
Queremos que nos muestre como mensaje el texto que hemos introducido.
entrada = Entry(root)
entrada.grid(row=0, column=0)
def click_boton():
texto = Label(root, text=f"Se almacenó '{entrada.get()}'
correctamente.").grid(row=1, column=0)
P á g i n a 18 | 88
boton1 = Button(root, text="Enviar", bg="red", padx=100, pady=25,
command=click_boton).grid(row=2, column=0)
root.mainloop()
Presionamos el botón:
En el objeto entrada con width controlamos el ancho, bg color de fondo, fg color de la fuente y
borderwidth su borde.
Si además queremos que aparezca un texto por defecto que podremos sustituir escribiremos el
nombre del objeto seguido del punto e insert con los parámetros en la posición y el texto.
Vamos a ejecutar:
P á g i n a 19 | 88
Vamos a sustituir el texto por “Programación en Python y Tkinder.
Presionamos el botón:
Ejercicio práctico:
P á g i n a 20 | 88
Como nombre de usuario PereManel y como contraseña 12345.
Solución:
def click_boton():
texto = Label(root, text=f"Hola '{entrada1.get()}', inició sesión
correctamente.").grid(row=1, column=0)
root.mainloop()
P á g i n a 21 | 88
Capítulo 7: Con el widget Radiobutton() y VARIABLES de CONTROL
La variables de control son objetos especiales asociados a los widgets de Tkinter para almacenar
sus valores y de esta forma poder trabajar con los distintos tipos de formularios que tiene.
Tenemos variables de tipo numérico para los enteros, llamadas IntVar() para los enteros,
DoubleVar() para los Float, para los String StringVar() y también para los boléanos llamda
BooleanVar().
Las variables de control las vamos a utilizar para conectar varios widgets del mismo tipo, es decir
si tenemos varias opciones de Radiobutton() podremos relacionarla a posibles opciones,
creando así un grupo de widget.
El widget Radiobutton.
root.mainloop()
Si lo ejecutamos:
root.mainloop()
El problema es que podemos cambiar de opción pero el valor que nos enviará el formulario
siempre será el de 1.
root.mainloop()
P á g i n a 23 | 88
Vamos a ejecutar:
Si seleccionamos la segunda opción nos sigue mostrando el valor 1 y tendría que demostrar el
valor 2.
def actualiza(value):
opcion_set = Label(root, text=x.get()).grid(row=3)
root.mainloop()
Desde las opción_1 y opción_2 llamamos a la función actualiza(x.get() con el método lambda.
Si eliminamos la opción lambda esta función solo se ejecutar al principio y cuando cambiemos
de opción no se ejecutará.
P á g i n a 24 | 88
Capítulo 8: Bucle AUTOGENERADOR de Radiobuttons y botón de
envío
Siguiendo con el capitulo anterior queremos que cambie de valor cuando presionemos al
botón enviar.
def actualiza(value):
opcion_set = Label(root, text=x.get()).grid(row=3)
root.mainloop()
Vamos a ejecutar:
P á g i n a 25 | 88
Hacemos clic en el botón Enviar.
def actualiza(value):
opcion_set = Label(root, text=value).pack()
En un ciclo for que iterará tantas veces como los elementos que tiene la lista opciones (4), ya
que contine a su ver 4 listas más de dos elementos.
P á g i n a 26 | 88
Utilizamos .pack() para que los vaya colocando una debajo del otro.
Definimos el botón_envia como objeto Button con el texto de “Enviar”, cuando ahamos clic
ejecutará la función Actualiza(colores.get), como parámetro envia el valor de colores.get, este
puede ser rojo, azul, verde o amarillo.
Con .pack() La etiqueta obtenida con su respectivo color lo coloca en la parte inferior del
formulario.
P á g i n a 27 | 88
Capítulo 9: Los anclajes de Tkinter
root.mainloop()
root.mainloop()
Si lo ejecutamos:
P á g i n a 28 | 88
Vamos a modificarlo para que todos los textos estén alineados hacia la izquierda.
root.mainloop()
después de .pack(anchor=NW)
P á g i n a 29 | 88
Capítulo 10: Los cuadros de diálogo (MESSAGERBOX)
En este capítulo vamos a aprender como hacer cuadros de diálogo.
Para realizar este proyecto crear una carpeta donde tienen es documento actual de Python y
crear una carpeta llamada img, copia en ella un archivo de tipo icono en nuestro caso se llama
pc.ico.
root = Tk()
root.mainloop()
Vamos a ver como se crear un título en la ventana principal con el método title y agregar un
icono con el método iconbitmap.
Ahora vamos a realizar los pasos necesarios para mostrar un cuadro de diálogo.
Vamos a crear un función que cuando realicemos un evento como pulsar un botón se muestre
un cuadro de diálogo.
def muestra_ventana():
showinfo("Aquí va el título de cuadro de diálogo", "Este es el
mensaje que se muestra al usuario en el cuadro de diálogo.")
P á g i n a 30 | 88
boton1 = Button(root, text="Enviar", command=muestra_ventana,
width=75).pack()
root.mainloop()
Vamos a ejecutar:
P á g i n a 31 | 88
Presionamos el botón Enviar.
Vamos a ejecutar:
Ahora vamos a ver los cuadros de diálogo que te formula una pregunta.
P á g i n a 32 | 88
Ahora vamos con askyesno().
P á g i n a 33 | 88
P á g i n a 34 | 88
Capítulo 11: Añadir código a las opciones de los MESSAGEBOX
root = Tk()
def muestra_ventana():
respuesta = askquestion(title="Pregunta seria", message="Debería
dejar el programa y salir a la calle?.")
if respuesta == "no":
showinfo(title="¡A segujir programando!", message="Estupendo,
eligió la respuesta correcta.")
else:
askretrycancel(title="Botón equivoado",message="Haga click en
'Reintenar' para seguir programando.")
Hay unos cuadros de diálogo que nos realiza una pregunta y tu tienes que contestar con unas
opciones que están en botones. Según la opción que elijas retorna un valor, en este ejemplo lo
almacenamos en la variable respuesta, que podrá obtener los valores yes o no.
P á g i n a 35 | 88
Vamos a contestar que no.
En este caso deberías agregar otra opción con su respectiva variable para controlar la respuesta
del usuario.
def muestra_ventana():
respuesta = askquestion(title="Pregunta seria", message="Debería
dejar el programa y salir a la calle?.")
if respuesta == "no":
showinfo(title="¡A segujir programando!", message="Estupendo,
eligió la respuesta correcta.")
if respuesta == "yes":
askretrycancel(title="Botón equivoado",message="Haga click en
'Reintenar' para seguir programando.")
def muestra_ventana():
respuesta = askquestion(title="Pregunta seria", message="Debería
dejar el programa y salir a la calle?.")
if respuesta == "no":
showinfo(title="¡A segujir programando!", message="Estupendo,
eligió la respuesta correcta.")
if respuesta == "yes":
respuesta_retry = askretrycancel(title="Botón
equivoado",message="Haga click en 'Reintenar' para seguir programando.")
if respuesta_retry: # Retorna un valor boleano.
P á g i n a 36 | 88
showinfo(title="¡A seguir programando!", message="Estupendo,
eligió la respuesta correcta.")
def muestra_ventana():
respuesta = askquestion(title="Pregunta seria", message="Debería
dejar el programa y salir a la calle?.")
if respuesta == "no":
showinfo(title="¡A segujir programando!", message="Estupendo,
eligió la respuesta correcta.")
if respuesta == "yes":
respuesta_retry = askretrycancel(title="Botón
equivoado",message="Haga click en 'Reintenar' para seguir programando.")
if respuesta_retry: # Retorna un valor boleano.
showinfo(title="¡A seguir programando!", message="Estupendo,
eligió la respuesta correcta.")
else:
showinfo(title="¡Adios...", message="Qué tengas un buen día
T.T.")
P á g i n a 37 | 88
Capítulo 12: Cómo crear una CALCULADORA – parte gráfica
from tkinter import *
root = Tk()
root.title("Calculadora básica")
root.iconbitmap("img/calculadora.ico")
mainloop()
root = Tk()
root.title("Calculadora básica")
root.iconbitmap("img/calculadora.ico")
# Impide que el usuario modifique el tamaño de la ventana.
# Los argumentos se refiere a la x y el segundo a la y.
# Si el primer valor lo cambiamos a un 1 nos dejará modificar en
horizontal.
# Si el segundo valor lo cambiamos a un 1 nos dejará modificar en
vertical.
# Por defecto los valores son 1 y 1.
root.resizable(0,0)
# Para dar dimensiones a la ventana.
root.geometry("296x265")
# Caja de texto
pantalla =Entry(root, width=22, bg="black", fg="white", borderwidth=0,
font=('arial', 18, 'bold'))
# Posicionamos la caja de texto en la fila 0 dejando un marge de 2 px. y
que ocupe 4 col.
pantalla.grid(row=0, padx=2, pady=2, columnspan=4)
P á g i n a 38 | 88
# Botones con los números
boton_1 = Button(root, text="1", width=9, height=3, bg="white", fg="red",
borderwidth=0, cursor="hand2").grid(row=1, column=0, padx=1, pady=1)
P á g i n a 39 | 88
boton_multiplicacion = Button(root, text="*", width=9, height=3, bg="deep
sky blue", fg="black", borderwidth=0, cursor="hand2").grid(row=3,
column=3, padx=1, pady=1)
mainloop()
P á g i n a 40 | 88
Capítulo 13: Cómo crear una CALCULADORA – parte lógica
Vamos a crear la siguiente función:
def envia_boton(valor):
anterior = pantalla.get()
pantalla.delete(0, END) # Borra la pantalla
pantalla.insert(0, str(anterior) + str(valor))
P á g i n a 41 | 88
Vamos a crear las funciones, una para la suma, otra para la resta, otra para la multiplicación y
otra para la división.
def envia_boton(valor):
anterior = pantalla.get()
pantalla.delete(0, END) # Borra la pantalla
pantalla.insert(0, str(anterior) + str(valor))
def igual():
global num2
num2 = pantalla.get()
pantalla.delete(0, END)
if operacion == "+":
pantalla.insert(0, float(num1) + float(num2))
if operacion == "-":
pantalla.insert(0, float(num1) - float(num2))
if operacion == "*":
pantalla.insert(0, float(num1) * float(num2))
if operacion == "/":
pantalla.insert(0, float(num1) / float(num2))
def suma():
global num1
global operacion
num1 = pantalla.get()
num1 = float(num1)
pantalla.delete(0, END)
operacion = "+"
def resta():
global num1
global operacion
num1 = pantalla.get()
P á g i n a 42 | 88
num1 = float(num1)
pantalla.delete(0, END)
operacion = "-"
def multiplicacion():
global num1
global operacion
num1 = pantalla.get()
num1 = float(num1)
pantalla.delete(0, END)
operacion = "*"
def division():
global num1
global operacion
num1 = pantalla.get()
num1 = float(num1)
pantalla.delete(0, END)
operacion = "/"
P á g i n a 43 | 88
boton_7 = Button(root, text="7", width=9, height=3, bg="white", fg="red",
borderwidth=0, cursor="hand2", command=lambda:
envia_boton(7)).grid(row=3, column=0, padx=1, pady=1)
P á g i n a 44 | 88
boton_multiplicacion = Button(root, text="*", width=9, height=3, bg="deep
sky blue", fg="black", borderwidth=0, cursor="hand2", command=lambda:
multiplicacion()).grid(row=3, column=3, padx=1, pady=1)
boton_despejar = Button(root,
width=40,
height=3,
text="Borrar",
bg="deep sky blue",
fg="black",
borderwidth=0,cursor="hand2",
command=lambda: despejar()).grid(row=5,column=0, columnspan=4, padx=1,
pady=1)
def despejar():
pantalla.delete(0, END)
P á g i n a 45 | 88
Relación de todo el código:
root = Tk()
root.title("Calculadora básica")
root.iconbitmap("img/calculadora.ico")
# Impide que el usuario modifique el tamaño de la ventana.
# Los argumentos se refiere a la x y el segundo a la y.
# Si el primer valor lo cambiamos a un 1 nos dejará modificar en
horizontal.
# Si el segundo valor lo cambiamos a un 1 nos dejará modificar en
vertical.
# Por defecto los valores son 1 y 1.
root.resizable(0,0)
# Para dar dimensiones a la ventana.
root.geometry("292x306")
def envia_boton(valor):
anterior = pantalla.get()
pantalla.delete(0, END) # Borra la pantalla
pantalla.insert(0, str(anterior) + str(valor))
def igual():
global num2
num2 = pantalla.get()
pantalla.delete(0, END)
if operacion == "+":
pantalla.insert(0, float(num1) + float(num2))
if operacion == "-":
pantalla.insert(0, float(num1) - float(num2))
if operacion == "*":
P á g i n a 46 | 88
pantalla.insert(0, float(num1) * float(num2))
if operacion == "/":
pantalla.insert(0, float(num1) / float(num2))
def suma():
global num1
global operacion
num1 = pantalla.get()
num1 = float(num1)
pantalla.delete(0, END)
operacion = "+"
def resta():
global num1
global operacion
num1 = pantalla.get()
num1 = float(num1)
pantalla.delete(0, END)
operacion = "-"
def multiplicacion():
global num1
global operacion
num1 = pantalla.get()
num1 = float(num1)
pantalla.delete(0, END)
operacion = "*"
def division():
global num1
global operacion
num1 = pantalla.get()
num1 = float(num1)
pantalla.delete(0, END)
operacion = "/"
def despejar():
pantalla.delete(0, END)
# Caja de texto
pantalla =Entry(root, width=22, bg="black", fg="white", borderwidth=0,
font=('arial', 18, 'bold'))
P á g i n a 48 | 88
boton_mas = Button(root, text="+", width=9, height=3, bg="deep sky blue",
fg="black", borderwidth=0, cursor="hand2", command=lambda:
suma()).grid(row=1, column=3, padx=1, pady=1)
mainloop()
def igual():
try:
global num2
num2 = pantalla.get()
pantalla.delete(0, END)
if operacion == "+":
pantalla.insert(0, float(num1) + float(num2))
if operacion == "-":
pantalla.insert(0, float(num1) - float(num2))
if operacion == "*":
pantalla.insert(0, float(num1) * float(num2))
if operacion == "/":
pantalla.insert(0, float(num1) / float(num2))
except NameError:
pantalla.insert(0, "Error")
P á g i n a 49 | 88
Capítulo 14: El widget LabelFrame
root = Tk()
root.title("Frames")
mainloop()
root = Tk()
root.title("Frames")
mainloop()
P á g i n a 50 | 88
Los márgenes los crea en el exterior.
root = Tk()
root.title("Frames")
mainloop()
root = Tk()
root.title("Frames")
P á g i n a 52 | 88
Capítulo 15: Nuevas ventanas con Toplevel()
root = Tk()
root.title("Ventana principal")
root.geometry("300x100")
ventana_nueva = Toplevel()
mainloop()
from tkinter import *
root = Tk()
root.title("Ventana principal")
root.geometry("300x100")
ventana_nueva = Toplevel()
mainloop()
Vamos a ejecutar:
root = Tk()
root.title("Ventana principal")
root.geometry("300x100")
ventana_nueva = Toplevel()
P á g i n a 53 | 88
ventana_nueva.title("Ventana secundaria")
ventana_nueva.geometry("300x200")
mainloop()
root = Tk()
root.title("Ventana principal")
root.geometry("300x100")
ventana_nueva = Toplevel()
ventana_nueva.title("Ventana secundaria")
ventana_nueva.geometry("300x200")
mainloop()
Vamos a ejecutar:
P á g i n a 54 | 88
Queremos que la Ventana secundaria aparezca una vez introducido el texto y pulsado el botón
enviar, es cuando se tiene que abrir la ventana secundaria con el texto.
root = Tk()
root.title("Ventana principal")
root.geometry("300x100")
def enviar_boton():
ventana_nueva = Toplevel()
ventana_nueva.title("Ventana secundaria")
ventana_nueva.geometry("300x200")
valor_entrada = entrada.get()
etiqueta = Label(ventana_nueva, text="El valor introducido en la
ventana principal es: " + valor_entrada).grid(row=0)
mainloop()
Vamos a ejecutar:
P á g i n a 55 | 88
Podemos ir abriendo varias ventanas.
root = Tk()
root.title("Ventana principal")
root.geometry("300x100")
def enviar_boton():
ventana_nueva = Toplevel()
ventana_nueva.title("Ventana secundaria")
ventana_nueva.geometry("300x200")
valor_entrada = entrada.get()
etiqueta = Label(ventana_nueva, text="El valor introducido en la
ventana principal es: " + valor_entrada).grid(row=0)
cerrar_ventana = Button(root, text="Cerrar la ventana",
command=ventana_nueva.destroy).grid(row=2)
mainloop()
Vamos a ejecutar:
P á g i n a 56 | 88
Presionamos el botón enviar:
P á g i n a 57 | 88
Capítulo 16: Checkbutton()
Este widget nos permite desde no coger ninguna opción o más de una opción.
root = Tk()
root.title("Ventana principal")
root.geometry("250x200")
def seleccion():
etiqueta = Label(root, text=control.get()).pack()
control = IntVar()
mainloop()
root = Tk()
root.title("Ventana principal")
root.geometry("250x200")
def seleccion():
etiqueta = Label(root, text=control.get()).pack()
P á g i n a 58 | 88
control = IntVar()
mainloop()
root = Tk()
root.title("Ventana principal")
root.geometry("250x200")
def seleccion():
etiqueta = Label(root, text=control.get()).pack()
control = IntVar()
P á g i n a 59 | 88
mainloop()
Vamos a ejecutar:
root = Tk()
root.title("Ventana principal")
root.geometry("250x200")
def seleccion():
etiqueta = Label(root, text=control.get()).pack()
control = StringVar()
mainloop()
P á g i n a 60 | 88
Cuando no está seleccionado muestra “Opción 1 no seleccionada” y si está seleccionado
“Opción 1 seleccionada”.
root = Tk()
root.title("Ventana principal")
root.geometry("250x200")
def seleccion():
etiqueta1 = Label(root, text=control1.get()).pack()
etiqueta2 = Label(root, text=control2.get()).pack()
etiqueta3 = Label(root, text=control3.get()).pack()
control1 = StringVar()
control2 = StringVar()
control3 = StringVar()
P á g i n a 61 | 88
muestra_seleccion = Button(root, text="Mostrar selección",
command=seleccion).pack()
mainloop()
P á g i n a 62 | 88
Capítulo 17: Crear y conectar BASE DE DATOS con MariaDB
Para este proyecto tenemos que instalar XAMPP, para ello tenemos que acceder al siguiente
enlace:
https://www.apachefriends.org/es/download.html
Y lo empezamos a instalar:
P á g i n a 63 | 88
Si te sale este mensaje te está diciendo que puedes tener problemas con la configuración del
Control de cuentas de usuario. (En configuración)
lo he cambiado:
P á g i n a 64 | 88
Una vez terminada la instalación déjalo como lo tenías.
Seleccionaremos next.
P á g i n a 65 | 88
Dejamos la ruta que pone por defecto seguido del botón next.
Lenguajes solo tiene inglés y alemán, dejaremos por defecto el inglés seguido el botón next.
P á g i n a 66 | 88
Empieza con la instalación.
Dejamos activa esta casilla para que se nos ejecute el programa, seguido del botón finish.
http://localhost/phpmyadmin/
P á g i n a 67 | 88
Hemos entrado al gestos de phpMyAdmin.
P á g i n a 68 | 88
Creamos una con el nombre de prueba, seguido del botón Crear.
Ya está creada, pero vacía, ya es suficiente para hacer una prueba de conexión con Python.
P á g i n a 69 | 88
La base de datos ha sido eliminada.
P á g i n a 70 | 88
Para saber los privilegios seleccionaremos nuestra base de datos y la pestaña privilegios.
root = Tk()
root.title("Ventana principal")
root.geometry("300x200")
try:
conexion = mariadb.connect(
user="root",
password="",
host="127.0.0.1",
port=3306,
database="prueba"
)
mainloop()
Vamos a ejecutar:
P á g i n a 71 | 88
Vamos a cambiar prueba por pruebas, ya que este fichero no existe.
Ejecutamos de nuevo.
P á g i n a 72 | 88
Vamos a modificar el código:
try:
conexion = mariadb.connect(
user="root",
password="",
host="127.0.0.1",
port=3306,
database="prueba"
)
P á g i n a 73 | 88
Capítulo 18: Crear TABLAS en BASES DE DATOS con MariaDB
Vamos a seguir con el capítulo anterior, recuerda que tienes que tener en XAMPP los servicios
de Apache y MySQL activados.
P á g i n a 74 | 88
Escribiremos la siguiente instrucción:
CREATE TABLE clientes (id INT NOT NULL AUTO_INCREMENT, nombre VARCHAR(32) NOT NULL,
apellidos VARCHAR(64) NOT NULL, telefono VARCHAR(9) NOT NULL, direccion VARCHAR(256),
PRIMARY KEY (id))
P á g i n a 75 | 88
Ahora vamos acceder a esta misma tabla de Python.
try:
conexion = mariadb.connect(
user="root",
password="",
host="127.0.0.1",
port=3306,
database="prueba"
)
cursor = conexion.cursor()
def crea_tabla():
try:
cursor.execute("CREATE TABLE clientes (id INT NOT NULL
AUTO_INCREMENT, "
"nombre VARCHAR(32) NOT NULL, apellidos VARCHAR(64) NOT NULL,"
"telefono VARCHAR(9) NOT NULL, direccion VARCHAR(256), PRIMARY
KEY (id))")
conexion.commit()
except mariadb.Error as error_tabla:
print(f"Error al crear la tabla: {error_tabla}")
# Interfaz gráfica
boton = Button(root, text="Crear tabla", width=20, command=crea_tabla)
boton.place(x=25, y=10)
mainloop()
Vamos a ejecutar:
P á g i n a 76 | 88
Presionamos sobre el botón “Crear tabla”.
Ahora si podríamos crear la base de datos, desde visual Studio Code, ejecutaremos de nuevo.
P á g i n a 77 | 88
Pulsamos en “Crear tabla”.
Actualizamos:
P á g i n a 78 | 88
Capítulo 19: INSERTAR datos en TABLAS – BASE DE DATOS con
MariaDB
En este capítulo vamos a crear un formulario para que se puedan introducir registros.
try:
conexion = mariadb.connect(
user="root",
password="",
host="127.0.0.1",
port=3306,
database="prueba"
)
cursor = conexion.cursor()
def registro_cliente():
nombre = e_nombre.get()
apellidos = e_apellidos.get()
telefono = e_telefono.get()
direccion = e_direccion.get()
try:
cursor.execute("INSERT INTO clientes(nombre, apellidos, telefono,
direccion)VALUES(?,?,?,?)",(nombre, apellidos, telefono, direccion))
conexion.commit() # Para que guarde los cambios en la base de
datos
except mariadb.Error as error_registro:
print(f"Error en el registro: {error_registro}")
# Interfaz gráfica
Label(root,
text="Registro para nuevos clientes",
font="calibri 18",
fg="red").grid(row=0, columnspan=2)
P á g i n a 79 | 88
Label(root,
text="Nombre").grid(row=1, column=0, pady=10)
e_nombre = Entry(root)
e_nombre.grid(row=1, column=1)
Label(root,
text="Apellidos").grid(row=2, column=0, pady=10)
e_apellidos = Entry(root)
e_apellidos.grid(row=2, column=1)
Label(root,
text="Dirección").grid(row=4, column=0, pady=10)
e_direccion = Entry(root)
e_direccion.grid(row=4, column=1)
Label(root,
text="Teléfono").grid(row=5, column=0, pady=10)
e_telefono = Entry(root)
e_telefono.grid(row=5, column=1)
boton = Button(root,
text="Registrar",
command=registro_cliente).grid(row=6, columnspan=2)
mainloop()
La parte que está fuera del marco en la parte gráfica y lo enmarcado en la parte lógica.
Vamos a ejecutar:
P á g i n a 80 | 88
La base de datos con la tabla vacía.
P á g i n a 81 | 88
Vamos a introducir un segundo cliente:
Lo registramos.
P á g i n a 82 | 88
Si queremos que una vez añadido el registro se borren todos los campos así tiene que ser la
función:
def registro_cliente():
nombre = e_nombre.get()
apellidos = e_apellidos.get()
direccion = e_direccion.get()
telefono = e_telefono.get()
e_nombre.delete(0, END)
e_apellidos.delete(0, END)
e_direccion.delete(0, END)
e_telefono.delete(0, END)
try:
cursor.execute("INSERT INTO clientes (nombre, apellidos,
telefono, direccion)VALUES(?,?,?,?)",(nombre, apellidos, telefono,
direccion))
conexion.commit() # Para que guarde los cambios en la base de
datos
except mariadb.Error as error_registro:
print(f"Error en el registro: {error_registro}")
P á g i n a 83 | 88
Capítulo 20: ELIMINAR Tablas y Base de datos con MariaDB
Este último proyecto vamos a realizar un programa que va a ser capaz de eliminar una tabla o
una base de datos, escribiendo solo sus nombres.
root = Tk()
root.title("Ventana principal")
root.geometry("323x160")
root.resizable(0,0)
try:
conexion = mariadb.connect(
user="root",
password="",
host="127.0.0.1",
port=3306,
database="prueba"
)
# Obtiene el cursor
cursor = conexion.cursor()
except mariadb.Error as error:
print(f"Error al conectar con la base de datos {error}")
sys.exit(1)
# Interface gráfica
Label(root,
text="Eliminar tablas y base de datos",
font="calibri 18",
fg="red").grid(row=0, columnspan=2)
Label(root,
text="Tabla").grid(row=1, column=0, pady=10)
e_tabla = Entry(root)
e_tabla.grid(row=1, column=1, pady=10)
Label(root,
text="Base de datos").grid(row=2, column=0, pady=10)
e_base_datos = Entry(root)
e_base_datos.grid(row=2, column=1, pady=10)
P á g i n a 84 | 88
boton1 = Button(root,
text="Eliminar tabla",
bg="red2",
fg="white").grid(row=5, column=0)
boton2 = Button(root,
text="Eliminar Base de datos",
bg="red2",
fg="white").grid(row=5, column=1)
mainloop()
def eliminar_tabla():
tabla = e_tabla.get()
try:
cursor.execute(f"DROP TABLE {tabla}")
conexion.commit()
except mariadb.Error as error_tabla:
print(f"Error al elimiar la tabla: {error_tabla}")
def eliminar_base_datos():
base_datos = e_base_datos.get()
try:
cursor.execute(f"DROP DATABASE {base_datos}")
conexion.commit()
except mariadb.Error as error_bd:
print(f"Error al elimiar la Base de datos: {error_bd}")
P á g i n a 85 | 88
boton1 = Button(root,
text="Eliminar tabla",
bg="red2",
fg="white",
command=eliminar_tabla).grid(row=5, column=0)
boton2 = Button(root,
text="Eliminar Base de datos",
bg="red2",
fg="white",
command=eliminar_base_datos).grid(row=5, column=1)
P á g i n a 86 | 88
Presionaremos el botón Eliminar Base de datos.
P á g i n a 87 | 88
Contenido
Capítulo 1: Ventana gráfica ........................................................................................................... 1
Capítulo 2: ¿Qué son los widgets? – El widget Frame() y el método pack() ................................. 3
Capítulo 3: El método grid() .......................................................................................................... 6
Capítulo 4: Relativas y el widget button() ................................................................................... 12
Capítulo 5: Llamar a funciones desde un botón.......................................................................... 14
Capítulo 6: FORMULARIOS con el widget Entry() y CONTRASEÑAS protegidas .......................... 17
Capítulo 7: Con el widget Radiobutton() y VARIABLES de CONTROL .......................................... 22
Capítulo 8: Bucle AUTOGENERADOR de Radiobuttons y botón de envío ................................... 25
Capítulo 9: Los anclajes de Tkinter .............................................................................................. 28
Capítulo 10: Los cuadros de diálogo (MESSAGERBOX) ............................................................... 30
Capítulo 11: Añadir código a las opciones de los MESSAGEBOX ................................................ 35
Capítulo 12: Cómo crear una CALCULADORA – parte gráfica ..................................................... 38
Capítulo 13: Cómo crear una CALCULADORA – parte lógica ...................................................... 41
Capítulo 14: El widget LabelFrame .............................................................................................. 50
Capítulo 15: Nuevas ventanas con Toplevel() ............................................................................. 53
Capítulo 16: Checkbutton() ........................................................................................................ 58
Capítulo 17: Crear y conectar BASE DE DATOS con MariaDB ..................................................... 63
Capítulo 18: Crear TABLAS en BASES DE DATOS con MariaDB ................................................... 74
Capítulo 19: INSERTAR datos en TABLAS – BASE DE DATOS con MariaDB ................................. 79
Capítulo 20: ELIMINAR Tablas y Base de datos con MariaDB ..................................................... 84
P á g i n a 88 | 88