init repo TKinter básicos
This commit is contained in:
commit
2d5d6e3885
9
README.md
Normal file
9
README.md
Normal file
@ -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
|
||||||
|
|
13
admin_inventario_app/README.md
Normal file
13
admin_inventario_app/README.md
Normal file
@ -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.
|
141
admin_inventario_app/app_inventario.py
Executable file
141
admin_inventario_app/app_inventario.py
Executable file
@ -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()
|
14
admin_partes_app/README.md
Normal file
14
admin_partes_app/README.md
Normal file
@ -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.
|
42
admin_partes_app/db.py
Executable file
42
admin_partes_app/db.py
Executable file
@ -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")
|
||||||
|
"""
|
119
admin_partes_app/part_manager.py
Executable file
119
admin_partes_app/part_manager.py
Executable file
@ -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('<<ListboxSelect>>', 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()
|
||||||
|
|
7
correr_lista_apps/README.md
Normal file
7
correr_lista_apps/README.md
Normal file
@ -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.
|
59
correr_lista_apps/correr_apps.py
Executable file
59
correr_lista_apps/correr_apps.py
Executable file
@ -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 + ',')
|
||||||
|
|
3
correr_lista_apps/save.txt
Executable file
3
correr_lista_apps/save.txt
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
/ruta/a/mi/app.exe
|
||||||
|
/ruta/a/otra/app.exe
|
||||||
|
,
|
8
generador_ventanas/README.md
Normal file
8
generador_ventanas/README.md
Normal file
@ -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
|
19
generador_ventanas/top_level.py
Executable file
19
generador_ventanas/top_level.py
Executable file
@ -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()
|
15
generador_ventanas/top_lvl_generador_ventanas.py
Executable file
15
generador_ventanas/top_lvl_generador_ventanas.py
Executable file
@ -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()
|
Loading…
Reference in New Issue
Block a user