commit 2d5d6e38853a45e23246b36440da48eadd7b6e28 Author: jp.av.dev Date: Mon Jan 4 23:11:00 2021 -0300 init repo TKinter básicos diff --git a/README.md b/README.md new file mode 100644 index 0000000..0c11ed4 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# Proyectos básicos TKinter + +### Proyectos introductorios a librería TKinter: + + - Administrador de Inventario + - Administrador de Partes/Piezas + - Correr lista de apps en windows + - Generador de ventanas + diff --git a/admin_inventario_app/README.md b/admin_inventario_app/README.md new file mode 100644 index 0000000..f957624 --- /dev/null +++ b/admin_inventario_app/README.md @@ -0,0 +1,13 @@ +# Notas del proyecto +------ + +Implementación librería TKinter +Implementación librería sqlite3 + +Creación de CRUD con GUI: +*C*reate *R*ead *D*elete *U*pdate en sqlite3 +*G*raphic *U*ser *I*nterface + + +Esta app inventario permite adiministrar articulos. +Pudiendo agregar, modificar, eliminar y consultar articulos y su cantidad. diff --git a/admin_inventario_app/app_inventario.py b/admin_inventario_app/app_inventario.py new file mode 100755 index 0000000..cddd3ba --- /dev/null +++ b/admin_inventario_app/app_inventario.py @@ -0,0 +1,141 @@ +""" + Implementación básica librería TKinter +""" + +from tkinter import ttk +from tkinter import * + +import sqlite3 + +class Producto: + + db = 'basededatos.db' + + def __init__(self, ventana): + self.vent = ventana + self.vent.title('Pro-LaP C \'Inventary\' ') + + # Creacion del contenedor del frame + frame = LabelFrame(self.vent, text='Registrar nuevo artículo') + frame.grid(row=0, column=0, columnspan=3, pady=20) + + # Entrada de Artículo + Label(frame, text='Artículo :').grid(row=1, column=0) + self.articulo = Entry(frame) + self.articulo.grid(row=1, column=1) + self.articulo.focus() + # Entrada Cantidad + Label(frame, text='Cantidad :').grid(row=2, column=0) + self.cantidad = Entry(frame) + self.cantidad.grid(row=2, column=1) + + # Boton agregar Articulo + ttk.Button(frame, text='Añadir a Inventario', command=self.add_articulo).grid(row=3, columnspan=2, sticky=W+E) + # Boton Borrar Articulo + ttk.Button(text='Eliminar', command=self.del_articulo).grid(row=5, column=0, sticky=W+E) + # Boton Actualizar Articulo + ttk.Button(text='Editar', command=self.edit_articulo).grid(row=5, column=1, sticky=W+E) + + # Mensajes de Informacion + self.info = Label(text='', fg='red') + self.info.grid(row=3, column=0, columnspan=2, sticky=W+E) + + # Tabla + self.tree = ttk.Treeview(height=10, columns=2) + self.tree.grid(row=4, column=0, columnspan=2) + self.tree.heading('#0', text='Artículo', anchor=CENTER) + self.tree.heading('#1', text='Cantidad', anchor=CENTER) + + self.get_articulos() + + def consultar(self, query, parametros=()): + with sqlite3.connect(self.db) as conn: + cursor = conn.cursor() + respuesta = cursor.execute(query, parametros) + conn.commit() + return respuesta + + def get_articulos(self): + #Limpiando el Tree + records = self.tree.get_children() + for elemento in records: + self.tree.delete(elemento) + #consulta + query = 'SELECT * FROM articulos ORDER BY id DESC' + db_rows = self.consultar(query) + for row in db_rows: + self.tree.insert('', 0, text=row[1], values=row[2]) + + def validacion(self): + return len(self.articulo.get()) != 0 and len(self.cantidad.get()) != 0 + + def add_articulo(self): + if self.validacion(): + #print(self.articulo.get()) + #print(self.cantidad.get()) + query = 'INSERT INTO articulos VALUES(NULL, ?, ?)' + parametros = (self.articulo.get(), self.cantidad.get()) + self.consultar(query, parametros) + self.info['text'] = 'Artículo agregado {}'.format(self.articulo.get()) + self.articulo.delete(0, END) + self.cantidad.delete(0, END) + else: + self.info['text'] = 'Articulo \"Y\" Cantidad requeridos' + self.get_articulos() + + def del_articulo(self): + self.info['text']='' + try: + self.tree.item(self.tree.selection())['text'][0] + except IndexError as e: + self.info['text'] = 'Selcciona el Artículo a Eliminar' + return + self.info['text'] = '' + item_sel=self.tree.item(self.tree.selection())['text'] + query = 'DELETE FROM articulos WHERE nombre = ?' + self.consultar(query, (item_sel, )) + self.info['text'] = 'Artículo Eliminado: {}'.format(item_sel) + self.get_articulos() + + def edit_articulo(self): + self.info['text'] = '' + try: + self.tree.item(self.tree.selection())['text'][0] + except IndexError as e: + self.info['text'] = 'Selcciona el Artículo a Editar' + return + old_articulo = self.tree.item(self.tree.selection())['text'] + old_cantidad = self.tree.item(self.tree.selection())['values'][0] + self.vent_edit = Toplevel() + self.vent_edit.title = 'Editar Artículo' + + #Articulo Antiguo + Label(self.vent_edit, text='Articulo Original :').grid(row=0, column=1) + Entry(self.vent_edit, textvariable=StringVar(self.vent_edit, value=old_articulo), state='readonly').grid(row=0, column=2) + #Nuevo Artículo + Label(self.vent_edit, text='Nuevo Artículo :').grid(row=1, column=1) + nuevo_art = Entry(self.vent_edit) + nuevo_art.grid(row=1, column=2) + #Cantidad Antigua + Label(self.vent_edit, text='Cantidad Original :').grid(row=2, column=1) + Entry(self.vent_edit, textvariable=StringVar(self.vent_edit, value=old_cantidad), state='readonly').grid(row=2, column=2) + #Nueva Cantidad + Label(self.vent_edit, text='Nueva Cantidad :').grid(row=3, column=1) + nueva_cant = Entry(self.vent_edit) + nueva_cant.grid(row=3, column=2) + #Boton Actualizar + Button(self.vent_edit, text='Actualizar', command=lambda: self.editar_art(nuevo_art.get(), nueva_cant.get(), old_articulo, old_cantidad)).grid(row=4,column=2, sticky=W) + + def editar_art(self, nuevo_art, nueva_cant, old_articulo, old_cantidad): + query = 'UPDATE articulos SET nombre=?, cantidad=? WHERE nombre=? AND cantidad=?' + parametros = (nuevo_art, nueva_cant, old_articulo, old_cantidad) + self.consultar(query, parametros) + self.vent_edit.destroy() + self.info['text'] = 'Entrada Actualizada :{} '.format(nuevo_art) + self.get_articulos() + +if __name__ == '__main__': + ventana= Tk() + prlpc = Producto(ventana) + ventana.resizable(0,0) + ventana.mainloop() diff --git a/admin_partes_app/README.md b/admin_partes_app/README.md new file mode 100644 index 0000000..907ec8d --- /dev/null +++ b/admin_partes_app/README.md @@ -0,0 +1,14 @@ +# Notas del proyecto +------ + +Implementación librería TKinter +Implementación librería sqlite3 + +Creación de CRUD con GUI: +*C*reate *R*ead *D*elete *U*pdate en sqlite3 +*G*raphic *U*ser *I*nterface + + +Esta app permite adiministrar articulos/piezas/partes +Relacionando cantidades, precios, proveedores y clientes. +Pudiendo agregar, eliminar y consultar articulos. diff --git a/admin_partes_app/db.py b/admin_partes_app/db.py new file mode 100755 index 0000000..a8922d9 --- /dev/null +++ b/admin_partes_app/db.py @@ -0,0 +1,42 @@ +import sqlite3 + +class Database: + def __init__(self, db): + self.conn = sqlite3.connect(db) + self.cur = self.conn.cursor() + self.cur.execute("CREATE TABLE IF NOT EXISTS parts (id INTEGER PRIMARY KEY, part text, cliente text, proveedor text, precio text)") + self.conn.commit() + + def fetch(self): + self.cur.execute("SELECT * FROM parts") + rows = self.cur.fetchall() + return rows + + def insert(self, parte, cliente, proveedor, precio): + self.cur.execute("INSERT INTO parts VALUES (NULL, ?, ?, ?, ?)", (parte, cliente, proveedor, precio)) + self.conn.commit() + + def remove(self, id): + self.cur.execute("DELETE FROM parts WHERE id=?", (id,)) + self.conn.commit() + + def update(self, id, parte, cliente, proveedor, precio): + self.cur.execute("UPDATE parts SET part =?, cliente=?,proveedor=?,precio=? WHERE id=?", (parte, cliente, proveedor, precio, id)) + self.conn.commit() + + def __del__(self): + self.conn.close() + +db = Database('store.db') + +# Descomentar parar agragar partes a base de datos +""" +db.insert("KL-xram 4GB DDR4 Ram","Piero Juarez","MicroCentro","3500") +db.insert("MacroShifter 4","Ruperto Esaus","FlyTech","1600") +db.insert("Verboson 16","Piero Juarez","FlyTech","3400") +db.insert("L socket 12","Genaro Riquelme","MicroHard","300") +db.insert("Lumm 5 en 1 Dongle","Ruperto Esaus","FlyTech","4500") +db.insert("24in generic IPS","Ruperto Esaus","FlyTech","9900") +db.insert("Nvidia XTX 666000","Genaro Riquelme","ManoCentro","500") +db.insert("SSD Plasticoso","Piero Juarez","MicroHard","1500") +""" diff --git a/admin_partes_app/part_manager.py b/admin_partes_app/part_manager.py new file mode 100755 index 0000000..cf7ddb5 --- /dev/null +++ b/admin_partes_app/part_manager.py @@ -0,0 +1,119 @@ +""" + Implementación básica librería TKinter +""" +from tkinter import * +from tkinter import messagebox +from db import Database + +db = Database('store.db') + +def poblar_lista(): + parts_list.delete(0, END) + for row in db.fetch(): + parts_list.insert(END, row) + +def add_item(): + if part_text.get()=='' or cliente_text.get()=='' or proveedor_text.get()=='' or precio_text.get()=='': + messagebox.showerror('Campos requeridos', 'Favor completa todos los campos') + return + db.insert(part_text.get(), cliente_text.get(), proveedor_text.get(), precio_text.get()) + parts_list.delete(0, END) + parts_list.insert(END, (part_text.get(), cliente_text.get(), proveedor_text.get(), precio_text.get())) + limpiar_texto() + poblar_lista() + +def select_item(event): + try: + global selected_item + index = parts_list.curselection()[0] + selected_item = parts_list.get(index) + + part_entry.delete(0, END) + part_entry.insert(END, selected_item[1]) + cliente_entry.delete(0, END) + cliente_entry.insert(END, selected_item[2]) + proveedor_entry.delete(0, END) + proveedor_entry.insert(END, selected_item[3]) + precio_entry.delete(0, END) + precio_entry.insert(END, selected_item[4]) + except IndexError: + pass + +def remove_item(): + db.remove(selected_item[0]) + limpiar_texto() + poblar_lista() + +def update_item(): + db.update(selected_item[0],part_text.get(), cliente_text.get(), proveedor_text.get(), precio_text.get()) + poblar_lista() + +def limpiar_texto(): + part_entry.delete(0, END) + cliente_entry.delete(0, END) + proveedor_entry.delete(0, END) + precio_entry.delete(0, END) + +#Crear objeto ventana +app = Tk() +app.title('Administrador de Partes') +app.geometry('850x350') + +#Parte +part_text = StringVar() +part_label = Label(app,text='Nombre de Parte', font=('bold', 14), pady=20) +part_label.grid(row=0, column=0, sticky=W) +part_entry = Entry(app, textvariable=part_text, font=(14)) +part_entry.grid(row=0, column=1) + +#Cliente +cliente_text = StringVar() +cliente_label = Label(app,text='Cliente', font=('bold', 14)) +cliente_label.grid(row=0, column=2, sticky=W) +cliente_entry = Entry(app, textvariable=cliente_text, font=(14)) +cliente_entry.grid(row=0, column=3) + +#Proveedor +proveedor_text = StringVar() +proveedor_label = Label(app,text='Proveedor', font=('bold', 14)) +proveedor_label.grid(row=1, column=0, sticky=W) +proveedor_entry = Entry(app, textvariable=proveedor_text, font=(14)) +proveedor_entry.grid(row=1, column=1) + +#Precio +precio_text = StringVar() +precio_label = Label(app,text='Precio', font=('bold', 14)) +precio_label.grid(row=1, column=2, sticky=W) +precio_entry = Entry(app, textvariable=precio_text, font=(14)) +precio_entry.grid(row=1, column=3) + +#Lista de Partes +parts_list = Listbox(app, height=10, width=100) +parts_list.grid(row=3, column=0, columnspan=3, rowspan=6, pady=20, padx=20) + +#ScrollBar +scrollbar = Scrollbar(app) +scrollbar.grid(row=3, column=3) +#Link Scrollbar a ListBox +parts_list.configure(yscrollcommand=scrollbar.set) +scrollbar.configure(command=parts_list.yview) +#Bindear Select +parts_list.bind('<>', select_item) + +#Botones +add_btn = Button(app, text='Agregar Pieza', width=12, command=add_item) +add_btn.grid(row=2, column=0, pady=20) + +remove_btn = Button(app, text='Borrar Pieza', width=12, command=remove_item) +remove_btn.grid(row=2, column=1) + +update_btn = Button(app, text='Actualizar', width=12, command=update_item) +update_btn.grid(row=2, column=2) + +limpiar_btn = Button(app, text='Limpiar', width=12, command=limpiar_texto) +limpiar_btn.grid(row=2, column=3) + +poblar_lista() +#Iniciar Programa +app.mainloop() + diff --git a/correr_lista_apps/README.md b/correr_lista_apps/README.md new file mode 100644 index 0000000..6e908e9 --- /dev/null +++ b/correr_lista_apps/README.md @@ -0,0 +1,7 @@ +# Notas del proyecto +------ + +Implementación librería TKinter + +Esta app permite agregar ruta de aplicaciones para ser ejecutadas en conjunto. +Ejemplo de uso: abrir IDE, navegador, explorador de imagenes, Putty. diff --git a/correr_lista_apps/correr_apps.py b/correr_lista_apps/correr_apps.py new file mode 100755 index 0000000..e8dfdfd --- /dev/null +++ b/correr_lista_apps/correr_apps.py @@ -0,0 +1,59 @@ +import tkinter as tk +from tkinter import filedialog, Text +import os + +root = tk.Tk() +apps = [] + +if os.path.isfile('save.txt'): + with open('save.txt', 'r') as f: + tempApps = f.read() + tempApps = tempApps.split(',') + apps = [x for x in tempApps if x.strip()] + + +def agregarApp(): + #Para evitar q se muestren repetidos ¿? + for widget in frame.winfo_children(): + widget.destroy() + + + filename = filedialog.askopenfilename(initialdir="/", title="Seleccionar .exe", + filetypes=(("ejecutables","*.exe"), + ("todos los archivos","*"))) + apps.append(filename) + print(filename) + for app in apps: + label = tk.Label(frame,text=app, bg="gray") + label.pack() + + +def ejecutarApps(): + for app in apps: + os.startfile(app) + + +canvas = tk.Canvas(root, height=600, width=600, bg="#263D42") +canvas.pack() + +frame = tk.Frame(root, bg="cyan") +frame.place(relwidth=0.8, relheight=0.8, relx=0.1, rely=0.1) + +openFile = tk.Button(root, text="Abrir", padx=12, pady=5, + fg="cyan", bg="#263D42", command=agregarApp) +openFile.pack() + +runApps = tk.Button(root, text="Ejecutar", padx=4, pady=5, + fg="cyan", bg="#263D42", command=ejecutarApps) +runApps.pack() + +for app in apps: + label = tk.Label(frame, text=app) + label.pack() + +root.mainloop() + +with open('save.txt', 'w') as f: + for app in apps: + f.write(app + ',') + diff --git a/correr_lista_apps/save.txt b/correr_lista_apps/save.txt new file mode 100755 index 0000000..a8bf3d6 --- /dev/null +++ b/correr_lista_apps/save.txt @@ -0,0 +1,3 @@ +/ruta/a/mi/app.exe +/ruta/a/otra/app.exe +, \ No newline at end of file diff --git a/generador_ventanas/README.md b/generador_ventanas/README.md new file mode 100644 index 0000000..0bf3843 --- /dev/null +++ b/generador_ventanas/README.md @@ -0,0 +1,8 @@ +# Notas del proyecto +------ + +Implementación librería TKinter + +Apps de ejemplo para generar ventanas + - Ventana simple + - Ventana top_level que genera ventanas hijas diff --git a/generador_ventanas/top_level.py b/generador_ventanas/top_level.py new file mode 100755 index 0000000..6266ad3 --- /dev/null +++ b/generador_ventanas/top_level.py @@ -0,0 +1,19 @@ +#!/bin/python3 + +import tkinter as tk + +#root application, can only have one of these. +root = tk.Tk() + +#put a label in the root to identify the window. +label1 = tk.Label(root, text="""this is root +closing this window will shut down app""") +label1.pack() + +#you can make as many Toplevels as you like +extra_window = tk.Toplevel(root) +label2 = tk.Label(extra_window, text="""this is extra_window +closing this will not affect root""") +label2.pack() + +root.mainloop() diff --git a/generador_ventanas/top_lvl_generador_ventanas.py b/generador_ventanas/top_lvl_generador_ventanas.py new file mode 100755 index 0000000..ec89e74 --- /dev/null +++ b/generador_ventanas/top_lvl_generador_ventanas.py @@ -0,0 +1,15 @@ +import tkinter as tk + +def generate_new_window(): + window = tk.Toplevel() + label = tk.Label(window, text="a generic Toplevel window") + label.pack() + +root = tk.Tk() + +spawn_window_button = tk.Button(root, + text="make a new window!", + command=generate_new_window) +spawn_window_button.pack() + +root.mainloop() \ No newline at end of file