GUI to send data to an Excel file with Python
Crear una interfaz gráfica con Tkinter para capturar datos desde un formulario y escribirlos en una hoja de Excel con openpyxl — típico caso de uso: recoger registros en planta, laboratorio o encuestas sin depender de herramientas propietarias.
La clase ConnectExcel arma una ventana minimalista con 3 campos (Email, Dirección, Género), 3 botones (Abrir archivo, Enviar, Guardar cambios) y persiste todo en un .xlsx.
import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
from tkinter.ttk import Combobox
from openpyxl import load_workbook
class ConnectExcel:
def __init__(self):
self.root = tk.Tk()
self.root.geometry('480x210+440+240')
self.root.configure(bg = '#8CD4D7')
self.root.title('Connect Excel')
#Labels
self.label1 = tk.Label(self.root, text = "Email", bg = '#8CD4D7')
self.label1.place(x = 140, y = 40)
self.label2 = tk.Label(self.root, text = "Address", bg = '#8CD4D7')
self.label2.place(x = 140, y = 60)
self.combobox_label3 = tk.Label(self.root, text = "Gender", bg = '#8CD4D7')
self.combobox_label3.place(x = 140, y = 80)
#Entries
self.entry1 = tk.Entry(self.root, width = 23)
self.entry1.place(x = 225, y = 40)
self.entry2 = tk.Entry(self.root, width = 23)
self.entry2.place(x = 225, y = 60)
#Combobox
self.combobox = Combobox(self.root, values = ['M', 'F'], state = 'r', width = 20)
self.combobox.place(x = 225, y = 80)
self.combobox.set('M')
#Buttons
self.open_file_button = tk.Button(self.root, text = "Open file", command = self.open_excel)
self.open_file_button.place(x = 4, y = 4)
self.submit_button = tk.Button(self.root, text = "Send", command = self.send_data)
self.submit_button.place(x = 190, y = 160)
self.save_button = tk.Button(self.root, text = "Save changes", command = self.save_changes)
self.save_button.place(x = 260, y = 160)
self.root.mainloop()
def open_excel(self):
try:
self.file_path = filedialog.askopenfilename()
self.workbook = load_workbook(filename = self.file_path)
self.sheet = self.workbook.active
except Exception as e:
print(f'The error is: {e}')
def save_changes(self):
try:
self.workbook.save(filename = self.file_path)
except:
messagebox.showinfo("Notification", "Add an Excel file to save the data.")
def send_data(self):
try:
data1 = self.entry1.get()
data2 = self.entry2.get()
data3 = self.combobox.get()
row = [data1, data2, data3]
self.sheet.append(row)
self.entry1.delete(0, tk.END)
self.entry2.delete(0, tk.END)
except:
messagebox.showinfo("Notification", "Add an Excel file to start data storage.")
if __name__ == '__main__':
ConnectExcel()
La ventana resultante (mockup):

Flujo de uso:
- El usuario pulsa Open file →
filedialog.askopenfilename()abre un diálogo nativo del sistema. Se carga el.xlsxconopenpyxl.load_workbooky se toma la hoja activa. - Escribe los datos y pulsa Send →
send_data()lee los tres campos, construye una fila y la añade al final consheet.append(row). También limpia los Entry para la siguiente captura. - Cuando termine de cargar registros, pulsa Save changes →
workbook.save(file_path)persiste todo al disco.
Puntos de diseño a destacar:
- Separar apertura y guardado permite acumular varias filas en memoria antes de escribir a disco — evita abrir/cerrar el archivo en cada registro y reduce riesgo de corrupción.
- Los
try/exceptalrededor deopen_excelysend_dataprotegen al usuario del error más común: pulsar "Send" sin haber abierto un archivo primero. Comboboxconstate='r'(readonly) evita que el usuario tipee un valor fuera del dominio válido (M,F).
Mejoras naturales:
- Validar el email con una regex antes de guardar
- Agregar una fila de encabezado automática si el archivo está vacío
- Usar
ttk.Entryen vez detk.Entrypara respetar el theme del sistema - Mostrar la ruta del archivo abierto en la barra inferior
Instalación:
pip install openpyxl
tkinter viene incluido con Python en Windows y Mac. En Linux, sudo apt install python3-tk.