Buenas estimados usuarios deseo compartir con ustedes una de las utilidades de las librerías de python que se llama Tkinter() para crear interfases gráficas con python que a la verdad que me ha encantado estar aprendiéndolo y quisiera que les gustara es muy largo este post ,tratare de resumirlo o mejor que pueda , esta herramientas multé-plataforma y nos sirve para crear aplicaciones tanto para Linux, Mac Os como para Windows y es completamente Free
si estas en linux
sudo apt-get install python3-tk

Para crear una simple caja
from tkinter import *
root = Tk()
root.title("Titulo de la ventana")
"""
Aquí va todo
el código de los widges
"""
root.mainloop()

Tipos de widges
- Menu
- Label
- Entry
- Radiobutton
- Checkbutton
- Text & Scrollbar
- Scale
- Spinbox
Ya con esto podemos empezar a estudiar tkinter
Toda caja debería tener un frame dentro en este post lo usaremos
el mismo modifica los tipos de Widges a tener dentro y le da el tamaño a la ventana
contenedor = Frame(root)
contenedor = LabelFrame ( si queremos ponerle titulo a nuestro frame )
para terminar este frame debemos empaquetarlo con
contenedor.pack()
Básico para continuar
Se que esta parte es tediosa pero si la dominan crean me que se les ara mas fácil entender todo
FRAME()

Argumentos sobre contenedores Frame
contenedor = Frame(root)
contenedor.config ( args1 , args2 , args3 )
todas las obiones se separan con ","
Args:
1. width="650",height="360"
2. bg="colores de fondo"
3. relief="groove"
4. bd=35
5. cursor="pirate"
6. resizable(False,True))
Argumentos para el contenedor
1. ajustar e ancho y alto
2. ajusta el color blue,grey,white,black o #00015
3. ajusta el relieve sunken,groove
4. ajusta el ancho del borde
5. ajusta el tipo de crusor a utilizar|
6. Nos permite maximizar o minimizar eje de las x and y
ya sabiendo que el frame es una caja donde van a estar los widges para posicionarlos dentro , usaremos el método Grid mas adelante veremos sus usos …
Posicionamiento por Grid
GRID()

widge.grid ( args1 , args2 , args3 )
Args:
1. row=0,column=0
2. sticky="wsne"
3. columnspan=2
4. rowspan=4
5. padx=5)
6. pady=5)
Argumentos para los grid:
1. posiciona por la fila 0 y columna 0
2. posiciona el widge a la derecha "w","e" por coordenadas
3. se expande por 2 columnas
4. se expande por 2 filas
5. separa los widges en espacios por el eje de las x ,padx
6. separa los widges en espacios por el eje de las y ,pady
Argumentos para empaquetar
empaquetaremos de ejemplo contenedor pero se pueden empaquetar widges pero la forma de colocarlos dentro del Frame seria diferente no el que estamos usando Grid
PACK()


contenedor.pack ( args1 , args2 , args3 )
Args:
1. contenedor.pack(side="left") #left,right,top,button
2. contenedor.pack(anchor="N") #NSWE
3. contenedor.pack(fill="y")
4. contenedor.pack(fill="y",expand="True")
5. contenedor.pack(fill="both",expand="True")
Argumentos para empaquetar:
1. pune la ubicación para nuestro widge
2. ubica por puntos cardinales N S W E NS SW WE
3. rellena todo por el eje de las y
4. rellena todo por el eje de las y y las x
5. rellena todo por el eje de las y y las x
IMPORTANTE
VARIABLES
Tipos de variables a almacenar
variables
1 valor1 = StringVar()
2 valor2 = IntVar()
3 valor3 = IntVar(StringVar())
1. almacena variables de tipo string
2. almacena variables de tipo entreo
3. convierte variables de tipo cadena a entero
Almacenar variables
var1 = Widge(contenedor,Args,textvariable=valor1)
var2 = Widge(contenedor,Args,variable=valor2)
var2 = Widge(contenedor,Args,textvariable=valor3 )
1. valor almacenara lo se entre en var2
2. valor almacenara lo se entre en var1
3. valor almacenara lo se entre en var2
métodos sobre variables
1. variable = var.set("valor")
2. variable = var.get()
1. define el valor de la variable por lo que este dentro de los ()
2. recibe los datos almacenados en la variable var para usarla
PARA EL WIDGE Text() ,Entry()
1. variable = var.insert(0, "texto a insertar")
2. variable = var.del(0,END)
3. variable = var.get()
1. inserta el texto dentro de un entry() o Text()
2. borra los datos almacenados en la variable var para usarla
3. recibe los datos almacenados en la variable var para usarla
Eventos sobre widge Button
def funcion():
root.destroy()
ventana2.quit()
ventana2.withdraw()
entrada.test("")
1. cierra el evento de la ventana
2. cierra la 2 ventada que tengamos
3. solo la oculta no cerraría la
4. define o borra datos en Entry(),Label()
btn = Button(contenedor , Args1 , Args2)
Argumentos:
1. text = "botón 1"
2. command=funcion )
3. command=lambda:funcion )
1. Da el nombre al botón
2. ejecuta una la funcion que hayamos creado previamente
3. evita que la funcion se ejecute por defecto
Fin del básico
Hasta ahora solo hemos visto las configuraciones ,para mi es lo mas importante ya que nos facilita su entendimiento , solo queda manos a la obra a aprender como elaborarlos y hacer nuestras propias apps
ventana

from tkinter import *
root=Tk()
root.title("Mi primera app")
root.mainloop()
Menu

from tkinter import *
root=Tk()
root.title("Mi primera app")
##### menu#
barra_menu=Menu(root)
root.config(menu=barra_menu)
root.geometry("450x380")
##### crea el menu Archivo Edicion Ayuda
archivoMenu=Menu(barra_menu,tearoff=0)
archivoEdicion=Menu(barra_menu,tearoff=0)
archivoAyuda=Menu(barra_menu,tearoff=0)
##### coloca Archivo Edicion Ayuda en el menus
barra_menu.add_cascade(label="Archivo",menu=archivoMenu)
barra_menu.add_cascade(label="Edicion",menu=archivoEdicion)
barra_menu.add_cascade(label="Ayuda",menu=archivoAyuda)
"""
agrega al menu Archivo Edicion Ayuda el submenu con titulo
Abrir
cerrar
guardar
"""
##### los agrega submenus al menu
archivoMenu.add_command(label="Abrir")
archivoMenu.add_command(label="cerrar")
archivoMenu.add_command(label="guardar")
archivoMenu.add_separator()
archivoMenu.add_command(label="salir",command=root.destroy)
archivoEdicion.add_command(label="cortar")
archivoEdicion.add_command(label="pegar")
archivoEdicion.add_command(label="renombar")
archivoAyuda.add_command(label="Acerca de: ")
##### evento principal
root.mainloop()
Frames

contenedor1=LabelFrame(root,width=420,height=380,text="Programa consulta")
contenedor1.grid(row=0,column=0,padx=5,pady=5)
contenedor2=LabelFrame(root,width=420,height=60,text="obsiones")
contenedor2.grid(row=1,column=0,padx=5,pady=5)
Label

comentario1=Label(contenedor,text="Introduce tu Nombre:",justify="left").grid(row=1,column=0,padx=5,pady=5)
comentario2=Label(contenedor,text="Introduce tu Apellido:",justify="left").grid(row=2,column=0,padx=5,pady=5)
Entry

#variables almacenadas en var1 var2
var1=StringVar()
var2=StringVar()
datos1=Entry(contenedor1,textvariable=var1).grid(row=1,column=2,padx=5,pady=5)
datos2=Entry(contenedor1,textvariable=var2).grid(row=2,column=2,padx=5,pady=5)
Radio Button

variable_obsion=IntVar()
if variable_obsion == 0:
pass
if variable_obsion == 1:
pass
else:
pass
seleccion=Radiobutton(contenedor1,text="Hombre",variable=variable_obsion,value=0).grid(row=3 ,column=0,sticky=W)
seleccion=Radiobutton(contenedor1,text="Mujer",variable=variable_obsion,value=1).grid(row=4 ,column=0,sticky=W)
seleccion=Radiobutton(contenedor1,text="Sin comentarios",variable=variable_obsion,value=2).grid(row=5 ,column=0,sticky=W)
Checkbutton

eleccion1=IntVar()
eleccion2=IntVar()
eleccion3=IntVar()
if eleccion1 == 1:
pass
if eleccion2 == 1:
pass
if variable_obsion == 1:
pass
mutliple_seleccion=Checkbutton(contenedor1,text="Soltero",variable=eleccion1,onvalue=1,offvalue=0).grid(row=3,column=1,sticky=W)
mutliple_seleccion=Checkbutton(contenedor1,text="Con pareja",variable=eleccion2,onvalue=1,offvalue=0).grid(row=4,column=1,sticky=W)
mutliple_seleccion=Checkbutton(contenedor1,text="Tranquilo",variable=eleccion3,onvalue=1,offvalue=0).grid(row=5,column=1,sticky=W)
Combobox

NOTA:
Debemos importar la clase ttk:
from tkinter import ttk
combo = ttk.Combobox(contenedor1)
#definimos como un case o switch en otros lenguajes
variable_combo = combo.get()
if variable_combo == 'Adolecente' :
pass
if variable_combo == 'Maduro' :
pass
if variable_combo == 'Anciano' :
pass
combo['values'] = ('Adolecente','Maduro','Anciano')
#valor por defeto a mostrar
combo.current(0)
combo.grid(row=4,column=2,padx=8)
Text && Scrollbar

texto = Text(contenedor1,height=10,width=40)
texto.grid(row=6,column=1,columnspan=2)
#creamos unda barra rotatoria
scroll=Scrollbar(contenedor1,command=texto.yview)
scroll.grid(row=6,column=2,sticky="nse")
#lo hacemos operativo para usar
texto.config(yscrollcommand=scroll.set)
Scale

#Escala
variable_escala =StringVar()
texto2=Label(contenedor1,text="Salario Base CUP $: ").grid(row=6,column=0,sticky="nw",pady=2)
#escala del 250 al 1250
escala=Scale(contenedor1,orient=HORIZONTAL,variable=variable_escala,from_=250,to_=1250,tickinterval=230,sliderlength=15,length=200)
escala.grid(row=6,column=0,pady=2)
Spinbox

texto3=Label(contenedor1,text="Anos de esperiencia laboral: ").grid(row=7,column=0,sticky="nw")
#Spinbox
spin = Spinbox(contenedor1,from_=1,to_=60).grid(row=7,column=0,sticky="sw")





