Trabajo Final Programación Orientada A Objetos
Trabajo Final Programación Orientada A Objetos
Resumen—Este trabajo de investigación detalla el desarrollo de Además, el programa permite a los usuarios visualizar todos
una agenda de contactos realizada a través de un código de los contactos existentes dentro de un widget de texto (un área
programación en Python, manejando su biblioteca gráfica Tkinter. de visualización de múltiples líneas) que presenta la
El punto de vista de este estudio es mostrar cómo las habilidades y información de manera ordenada y legible por el usuario. La
conocimientos adquiridos en la clase, junto con las herramientas y
funcionalidad de eliminar un contacto también está presente;
técnicas obtenidas a través de una investigación profunda, permiten
crear una aplicación de escritorio funcional y fácil de usar. Se los usuarios pueden seleccionar un contacto para eliminar a
destaca en la interacción entre la lógica de programación y la través de un número de teléfono único y confirmar su
interfaz de usuario para proporcionar una solución que gestione eliminación, lo cual actualiza tanto la lista mostrada en la
eficientemente la información de contacto, enfatizando el proceso de interfaz como el archivo de texto donde se almacenan los datos
diseño, la persistencia de datos y la manipulación de la información. [1].
Además, se exploran las etapas de preparación del proyecto, desde el
proyecto inicial hasta su ejecución y pruebas finales. El documento La interacción con los elementos de la interfaz se realiza de
se plantea como una recapitulación de prácticas recomendadas y manera intuitiva, pudiendo así facilitar la gestión de la
aprendizajes integrados, con el fin de servir como un recurso información de contacto de una manera eficiente y ordenada.
didáctico y guía de referencia para futuros proyectos utilizando Este manejo de la persistencia de datos y la interfaz gráfica
Python y Tkinter. resulta en un programa fácil de usar y funcional para llevar el
Abstract—This research work details the development of a control de una agenda de contactos personal [1].
contact agenda carried out through a programming code in Python,
managing its Tkinter graphic library. The point of view of this study
is to show how the skills and knowledge acquired in class, together II. MARCO TEÓRICO
with the tools and techniques obtained through in-depth research,
allow the creation of a functional and easy-to-use desktop El presente trabajo de investigación se apoya en diversas
application. It excels in the interaction between programming logic tecnologías y herramientas que son esenciales para el desarrollo
and user interface to provide a solution that efficiently manages de aplicaciones de escritorio. A continuación, se proporciona
contact information, emphasizing the design process, data una descripción general de estos elementos:
persistence and information manipulation. Additionally, the stages
of project preparation are explored, from the initial project to its A. Python: Este lenguaje de programación de alto nivel,
execution and final testing. The document is presented as a interpretado y de propósito general se destaca por su
recapitulation of recommended practices and integrated learning, in simplicidad y legibilidad, lo que facilita el proceso de
order to serve as a teaching resource and reference guide for future aprendizaje y desarrollo. Python promueve la escritura de
projects using Python and Tkinter. código claro y permite a los programadores expresar conceptos
I. INTRODUCCION complejos en pocas líneas de código en comparación con otros
lenguajes. Python es versátil y extensible, lo que le permite
El código proporcionado corresponde a un programa de operar en diferentes plataformas y entornos; es ampliamente
agenda de contactos implementado en el lenguaje de utilizado en el desarrollo web, análisis de datos, inteligencia
programación Python, y se emplea la biblioteca Tkinter para la artificial y también en la creación de aplicaciones de escritorio
creación de una interfaz gráfica de usuario. Este programa actúa [2].
como una agenda personal que permite a los usuarios gestionar
información vital como nombres, apellidos, números de B. Tkinter: Tkinter es el kit de herramientas de interfaz
teléfono y direcciones de correo electrónico de sus contactos a gráfica de usuario (GUI) incluido con Python para la
través de una serie de controles interactivos dispuestos en una implementación de programas que los usuarios pueden
ventana [1]. interactuar con visualmente, en lugar de solo a través de la línea
de comandos. Es una de las bibliotecas de GUI más comunes y
Los usuarios tienen la capacidad de ingresar nuevos fáciles de usar para Python y viene integrada, por lo que no es
contactos en la agenda a través de campos de texto y pueden necesaria una instalación adicional. Tkinter ofrece una variedad
guardar esta información utilizando un botón dedicado. Esta de controles, conocidos como widgets, que incluyen botones,
acción desencadena un proceso donde los datos ingresados se etiquetas, campos de texto y otros elementos gráficos que se
añaden a una lista y luego se almacenan permanentemente en pueden usar para recopilar, mostrar y interactuar con datos en
un archivo de texto denominado ag.txt. Esto significa que los una ventana [3].
contactos no se pierden al cerrar la aplicación, ya que, al
iniciarse, el programa carga los contactos previamente C. Manejo de archivos: Python proporciona varias
guardados desde el archivo [1]. funciones integradas para el manejo de archivos, lo que permite
leer y escribir datos en archivos. Esta funcionalidad es crucial - La persistencia de datos es manejada mediante
para la persistencia de datos, que es la capacidad de un funciones que escriben y leen la lista lista desde y hacia
programa para conservar datos más allá de la duración de su un archivo ag.txt. [1].
ejecución. En el contexto de una agenda de contactos, esto D. Implementación de las funciones de guardado, carga
significa que el usuario puede guardar contactos que
y eliminación de contactos:
permanecerán disponibles incluso después de cerrar y volver a
abrir la aplicación. Python maneja los archivos a través de 1) Guardado: La función guardar() recopila la
objetos de archivo y utiliza métodos información de los widgets de entrada, valida y la almacena
como open(), read(), write() y close() para trabajar con dentro de la lista lista, seguido por la escritura en el archivo
archivos en diferentes modos como lectura (r), escritura (w), mediante escribirContacto(). [1]
adición (a), entre otros [3]. 2) Carga: Al iniciar, la aplicación
ejecuta iniciarArchivo() para verificar la existencia del archivo
El entendimiento cabal de estas herramientas y su aplicación
y luego cargar() lee los datos existentes del archivo y los carga
efectiva es fundamental para el desarrollo de aplicaciones
en la lista lista. [1]
robustas y fiables, como la agenda de contactos que se detalla
3) Eliminación: eliminar() permite al usuario
en este trabajo.
seleccionar un contacto por su número de teléfono y eliminarlo
de lista, después actualiza el archivo y la visualización de
contactos. [1]
III. DESARROLLO Y METODOLOGÍA
Cada una de estas etapas demuestra una cuidadosa
En la fase de desarrollo de este programa de agenda de
planificación y ejecución para lograr una aplicación funcional
contactos, se siguió una metodología estructurada que se divide
y confiable. La combinación de técnicas de programación
en las siguientes etapas:
sólidas con una consideración cuidadosa por la usabilidad hace
A. Definición de los requerimientos de la agenda de de este proyecto un ejemplo práctico y valioso en el campo de
las aplicaciones de escritorio
contactos:
1) Identificación de las funcionalidades clave: Agregar
nuevos contactos, visualizar la lista de contactos existentes, IV. TABLA DE COMPONENTES.
editar detalles de contactos existentes y eliminar contactos [1].
2) Determinación de los atributos de cada contacto: Elemento Uso en el Código Descripción
nombre, apellido paterno, apellido materno, teléfono y correo Es la clase
electrónico [1]. principal de
3) Requerimiento de la persistencia de datos: los Tkinter,
utilizada para
contactos deben ser almacenados en un archivo y mantenidos Tk [1] [4] ventana = Tk()
crear la
entre las sesiones del programa [1]. ventana de la
B. Diseño de la interfaz gráfica y la experiencia del aplicación
usuario: principal.
Es una clase
- Creación de un diseño de interfaz que sea intuitivo y de variable de
fácil de navegar, utilizando el kit de herramientas control que se
Tkinter [1]. utiliza para
StringVar [1] [4] nombre = StringVar()
- Organización de los elementos gráficos (labels, text manejar los
boxes, buttons) de manera lógica y estéticamente valores de los
widgets
agradable [1].
como Entry.
- Implementación de widgets tales como Entry para la Widget de
entrada de datos, Button para las acciones de usuario Tkinter que
y Text para la visualización de la lista de contactos [1]. se utiliza para
C. Descripción del flujo de datos y lógica del programa: Label [1] [4] Label(ventana, text="Nombre") mostrar texto
o imágenes
- Cada acción del usuario genera un evento que es en la interfaz
capturado por el programa y desencadena una secuencia de usuario.
de operaciones [1]. Widget que
- El programa maneja una lista global lista que almacena permite al
en tiempo real los datos de los contactos [1]. Entry(ventana, usuario
Entry [1] [4]
- La adición de un contacto implica recoger los datos de textvariable=nombre) ingresar, o
las Entry boxes, formatear la información y añadirla editar una
a lista [1]. línea de texto.
- Para la visualización de contactos, la lista se itera y sus Widget de
Button(ventana, text="Guardar", Tkinter usado
elementos se van mostrando en un Text widget [1]. Button [1] [4]
command=guardar) para agregar
botones a la
Elemento Uso en el Código Descripción Elemento Uso en el Código Descripción
interfaz de contactos,
usuario que el modificarlos
usuario puede y ordenarlos.
pulsar para Estructuras
realizar una de control de
acción. Ciclos y flujo de
Es un widget condicionales [1] for elemento in lista:, if ...: Python para
de Tkinter [5] implementar
que permite la lógica del
crear una caja programa.
de texto Bloques de
Text [1] [4] r = Text(ventana)
multilínea, código
generalmente definidos que
utilizada para realizan
mostrar o acciones
editar texto. Funciones específicas
def guardar():, def eliminar():, def
Un widget de definidas por el como guardar
cargar():
entrada que usuario [1] [5] un contacto,
muestra una eliminarlo o
lista de cargar la lista
Spinbox(ventana,
Spinbox [1] [4] valores y de contactos
textvariable=conteliminar)
permite al desde un
usuario archivo.
seleccionar Inicia el
uno de ellos. bucle de
eventos
Es una principal de
función de Mainloop [1] [5] mainloop() la ventana,
Tkinter para esperando
messagebox.show messagebox.showinfo("Eliminar",
mostrar acciones del
info [1] [3] "Elemento eliminado") usuario.
mensajes de
información
al usuario.
Método de V. CÓDIGO FUENTE.
geometría de from tkinter import * # Se importan todas las clases y
Tkinter que funciones de tkinter.
se utiliza para from tkinter import messagebox # Se importa específicamente
messagebox de tkinter para mostrar mensajes de alerta.
place [1] [5] etiquetaTitulo.place(x=270, y=10) posicionar
widgets en lista = [] # Lista para guardar los contactos.
una ubicación
específica en # Función para guardar la información del contacto ingresado
la ventana. por el usuario.
def guardar():
Función de
# Se obtiene la información ingresada y se almacena en
Python para variables.
abrir un n = nombre.get()
archivo en un ap = app.get()
Open [1] [5] archivo = open("ag.txt", "w") modo am = apm.get()
específico c = correo.get()
t = telefono.get()
(lectura, # Se añade la información al final de la lista de
escritura, contactos.
etc.). lista.append(n+"$"+ap+"$"+am+"$"+t+"$"+c)
Métodos para escribirContacto() # Se llama a la función que guarda
leer una línea los contactos en un archivo.
messagebox.showinfo("Guardado", "El contacto ha sido
de un archivo guardado en la agenda") # Muestra un mensaje informativo.
linea = y para # Se limpian las variables.
readline, write [1]
archivo.readline(), archivo.write(ele escribir una nombre.set("")
[5]
mento) cadena a un app.set("")
archivo, apm.set("")
respectivame correo.set("")
telefono.set("")
nte. consultar() # Se actualiza la visualización de la lista
Estructuras de contactos.
de datos de
lista.append(...), lista.remove(...), lis Python # Función para eliminar un contacto basado en el número de
Listas [1] [5] teléfono.
ta.sort() utilizadas
def eliminar():
para eliminado = conteliminar.get() # Obtiene el número de
almacenar los teléfono para eliminar.
removido = False app = StringVar()
for elemento in lista: apm = StringVar()
arreglo = elemento.split("$") # Separa los datos del correo = StringVar()
contacto almacenado en la lista. telefono = StringVar()
if conteliminar.get() == arreglo[3]: # Si el conteliminar = StringVar()
teléfono coincide, elimina el contacto. colorFondo = "#006"
lista.remove(elemento) colorLetra = "#FFF"
removido = True iniciarArchivo() # Se asegura de que el archivo exista.
escribirContacto() # Reescribe el archivo de contactos cargar() # Carga los contactos existentes en el archivo.
sin el contacto eliminado. consultar() # Muestra los contactos en la ventana.
consultar() # Actualiza la visualización de la lista de # Se establece el título, tamaño y fondo de la ventana
contactos. principal.
if removido: # Si se eliminó el contacto, muestra un ventana.title("Agenda con archivos")
mensaje. ventana.geometry("700x500")
messagebox.showinfo("Eliminar", "Elemento eliminado " ventana.configure(background=colorFondo)
+ eliminado)
# Se crean y ubican los widgets (etiquetas, entradas y
# Función para consultar la lista de contactos y mostrarla en botones) en la ventana principal.
la interfaz. etiquetaTitulo = Label(ventana, text="Agenda con Archivos",
def consultar(): bg=colorFondo, fg=colorLetra).place(x=270, y=10)
r = Text(ventana, width=80, height=15) # Crea un Widget etiquetaN = Label(ventana, text="Nombre", bg=colorFondo,
Text para mostrar los contactos. fg=colorLetra).place(x=50, y=50)
lista.sort() # Ordena la lista alfabéticamente. cajaN = Entry(ventana, textvariable=nombre).place(x=150,
valores = [] y=50)
# Inserta los títulos de las columnas en el widget Text. etiquetaApp = Label(ventana, text="Apellido Paterno",
r.insert(INSERT, "Nombre\tApellidos P\t\tApellido bg=colorFondo, fg=colorLetra).place(x=50, y=80)
M\t\tTeléfono\t\tCorreo\n") cajaApp = Entry(ventana, textvariable=app).place(x=150, y=80)
for elemento in lista: etiquetaApm = Label(ventana, text="Apellido Materno",
arreglo = elemento.split("$") # Separa los datos del bg=colorFondo, fg=colorLetra).place(x=50, y=110)
contacto. cajaApm = Entry(ventana, textvariable=apm).place(x=150,
valores.append(arreglo[3]) # Añade el número de y=110)
teléfono al listado para el Spinbox. etiquetaT = Label(ventana, text="Teléfono", bg=colorFondo,
# Inserta los datos del contacto en el widget Text. fg=colorLetra).place(x=50, y=140)
r.insert(INSERT, cajaT = Entry(ventana, textvariable=telefono).place(x=150,
arreglo[0]+"\t"+arreglo[1]+"\t\t"+arreglo[2]+"\t\t"+arreglo[3 y=140)
]+"\t\t"+arreglo[4]+"\t\n") etiquetaC = Label(ventana, text="Correo", bg=colorFondo,
r.place(x=20,y=230) # Ubica el widget Text en la fg=colorLetra).place(x=50, y=170)
ventana. cajaC = Entry(ventana, textvariable=correo).place(x=150,
# Crea un Spinbox para seleccionar el número de teléfono y=170)
a eliminar. etiquetaEliminar = Label(ventana, text="Teléfono: ",
spinTelefono = Spinbox(ventana, value=(valores), bg=colorFondo, fg=colorLetra).place(x=370, y=50)
textvariable=conteliminar).place(x=450, y=50) spinTelefono = Spinbox(ventana,
if lista == []: textvariable=conteliminar).place(x=450, y=50)
spinTelefono = Spinbox(ventana, botoGuardar = Button(ventana, text="Guardar",
value=(valores)).place(x=450, y=50) command=guardar, bg="#009", fg="white").place(x=180, y=200)
r.config(state=DISABLED) # Deshabilita el Text para botoEliminar = Button(ventana, text="Eliminar",
prevenir la edición del contenido. command=eliminar, bg="#009", fg="white").place(x=490, y=80)
# Función para iniciar el archivo si aún no existe. mainloop() # Inicia el bucle de eventos principal de la
def iniciarArchivo(): ventana, esperando acciones del usuario.
archivo = open("ag.txt", "a")
archivo.close()
Este será el resultado final: [1]
# Función para cargar los contactos del archivo al iniciar el
programa.
def cargar():
archivo = open("ag.txt", "r")
linea = archivo.readline()
if linea:
while linea:
if linea[-1] == '\n':
linea = linea[:-1]
lista.append(linea)
linea = archivo.readline()
archivo.close()
B. Visualización de Contactos:
VII. ANÁLISIS
Se verificó la capacidad de la aplicación para mostrar una
lista actualizada de los contactos. Al iniciarse el programa o al El análisis de la aplicación de agenda de contactos se
agregar un nuevo contacto, la lista de contactos se actualizó concentra en tres aspectos principales: rendimiento, usabilidad
automáticamente y se mostró en el área de texto dedicada a la y eficacia.
visualización. La legibilidad y el formato del texto permitieron
A. Rendimiento:
a los usuarios ver fácilmente todos los contactos almacenados.
El programa muestra un rendimiento adecuado, con
tiempos de respuesta rápidos al agregar, mostrar y
eliminar contactos. La lectura y escritura en el archivo
de texto ag.txt se lleva a cabo sin retrasos apreciables, lo
que garantiza una experiencia fluida para el usuario
final. Sin embargo, a medida que la base de datos de
contactos crezca, se recomienda evaluar el rendimiento
al manejar un volumen significativo de datos para
asegurar que el programa sigue siendo eficiente.
B. Usabilidad:
La interfaz de la aplicación es intuitiva y fácil de
navegar, lo cual es favorable para usuarios con poca
experiencia en tecnología. Los controles están
claramente etiquetados y el flujo de acciones sigue una
lógica natural de uso. No obstante, la implementación
de herramientas de ayuda en la interfaz, como tooltips o
un sistema de ayuda integrado, podría mejorar aún más
C. Eliminar Contactos:
la usabilidad, particularmente para nuevas La naturaleza intuitiva de la interfaz garantiza que los
funcionalidades que se pudieran añadir en el futuro. usuarios puedan navegar por sus diversas funciones con
C. Eficacia: facilidad y confianza, reflejando el éxito del proyecto en su
La aplicación cumple su propósito principal de gestionar enfoque en la experiencia del usuario. Además, la persistencia
contactos de manera efectiva, permitiendo a los usuarios de los datos ofrece una pieza confiable de software, capaz de
realizar todas las tareas básicas requeridas. La recordar la información de los usuarios de una sesión a otra.
persistencia de los datos asegura que la información del
Mirando hacia el futuro, el proyecto tiene un camino claro
contacto no se pierde entre sesiones, lo cual es esencial
para la evolución y mejora. La integración de la aplicación con
para cualquier aplicación de gestión de datos.
servicios en la nube podría proporcionar opciones de respaldo
D. Mejoras y Recomendaciones:
y sincronización, permitiendo el acceso a los contactos desde
1) Optimización de Manejo de Datos a gran
cualquier dispositivo y salvaguardando la información contra la
escala: Para mejor manejo de grandes cantidades
pérdida de datos local. Asimismo, la incorporación de
de datos, se recomienda la implementación de una
funcionalidades para la importación y exportación de contactos
base de datos más robusta, como SQLite o
facilitaría la interoperabilidad con otras plataformas y
MongoDB, para reemplazar el sistema de archivos
aplicaciones, aumentando la versatilidad de la agenda de
de texto plano.
contactos.
2) Mejoras en la Interfaz de Usuario: Para mejorar la
experiencia del usuario, se sugiere añadir En definitiva, mientras que el camino recorrido hasta el
funcionalidades como la edición de contactos momento ha estado lleno de aprendizaje y logros significativos,
existentes y una búsqueda más avanzada y filtros aún está lleno de oportunidades. La adaptabilidad y la
para manejar una gran cantidad de entradas. innovación continuarán siendo los pilares de este proyecto a
3) Internacionalización y Localización: Implementar medida que avanza, siempre con la mira en enriquecer y
el soporte para múltiples idiomas puede aumentar simplificar la vida de sus usuarios.
la accesibilidad y la adopción de la aplicación en un
público más amplio. IX. REFERENCIAS
4) Seguridad de los Datos: Es esencial garantizar la
seguridad de los datos personales. Se podría añadir
una capa de seguridad con autenticación de usuarios
para acceder a la agenda de contactos.
[1] Christina54, «SCRIBD,» 04 04 2019. [En línea]. Available:
https://es.scribd.com/document/404831563/Python-Tkinter-pdf.
5) Automatización de Pruebas: Para futuras [Último acceso: 8 12 2023].
versiones, se recomienda desarrollar un conjunto de
pruebas automáticas para validar la funcionalidad e [2] © Copyright 2001-2023, Fundación de software Python.,
integridad de la aplicación tras cambios o «Python,» Lenguaje de programación interpretado, interactivo y
actualizaciones. orientado a objetos., 10 12 2023. [En línea]. Available:
Estas recomendaciones son fundamentales para mejorar la https://docs.python.org/3/faq/general.html#what-is-python.
[Último acceso: 10 12 2023].
aplicación y asegurar su escalabilidad y mantenimiento a largo
plazo. Con las mejoras sugeridas, la agenda de contactos no solo
mejorará su rendimiento y usabilidad, sino que también [3] © Copyright 2001-2023, Python Software Foundation.,
«Python,» Lenguaje de programación interpretado, interactivo y
ofrecerá una base más segura y confiable para la gestión de la
orientado a objetos., 9 12 2023. [En línea]. Available:
información de los contactos. https://docs.python.org/es/3/library/tkinter.html. [Último
acceso: 10 12 2023].