Aqui se pone en practica lo aprendido en el curso de python 2019.
Usando click para generar el comando. pythondialog para las ventanas y csv para la permanencia de datos.
En el codigo se declara la clase contacto con un método estatico objects que obtiene todos los objetos de la base de datos. Un metodo save para agregar o actualizar contactos y el método delete para borrar contactos.
La libreria de ventanas pythondialog tiene usa serie de widgets ya creados puedes revizar la documentacion oficial
El modulo os solo se está usando para verificar la existencia del archivo csv que funciona como base de datos. De no existir el archivo se crea en blanco.
Sin más el código. Recomiendo haber terminado el curso antes de ojear este material.
import csv
import click
from dialog import Dialog
import os
class Contact(object):
def __init__(self, name, number):
self.name = name
self.number = number
@staticmethod
def objects():
contacts = []
with open('.contacts.csv') as database:
for contact in csv.DictReader(database, ['name', 'number']):
contacts.append(contact)
return contacts
def to_dict(self):
return {'name': self.name, 'number': self.number}
def save(self):
contacts = self.objects()
with open('.contacts.csv', 'w') as database:
print(contacts)
encontrado = False
for c in contacts:
if c['number'] == self.number:
encontrado = True
c['name'] = self.name
if not encontrado:
contacts.append(self.to_dict())
writer = csv.DictWriter(database, ['name', 'number'])
writer.writerows(contacts)
def delete(self):
contacts = self.objects()
new_contacts = contacts.copy()
with open('.contacts.csv', 'w') as database:
uid = None
for i, c in enumerate(contacts):
if c['number'] == self.number:
uid = i
if uid or uid == 0:
new_contacts.pop(uid)
writer = csv.DictWriter(database, ['name', 'number'])
print(new_contacts)
writer.writerows(new_contacts)
def ListContacts():
window = Dialog()
text = ""
for c in Contact.objects():
text += "|{}|{}|\n".format(c['name'].ljust(25), c['number'].rjust(25))
list = window.scrollbox(text)
main()
def SelectContacts(title):
'''seleccionar una lista de numeros de telefonos'''
window = Dialog()
return window.buildlist(title, 0, 0, 0,
[(contact['number'], contact['name'] + " - " + contact['number'],
False) for contact in
Contact.objects()])
def SelectContact():
'''seleccionar solo un numero de telefono'''
window = Dialog()
options = [(contact['number'] + '|' +contact['name'], '') for contact in Contact.objects()]
return window.menu('SELECCIONA UN CONTACTO', 0, 0, 0, options)
def ContactForm(number="", name=""):
window = Dialog()
return window.form("NUEVO CONTACTO", [
("NUMERO TELEFÓNICO", 1, 1, number, 1, 25, 25, 25),
("NOMBRE DEL CONTACTO", 2, 1, name, 2, 25, 25, 25)
], 0, 0, 0)
@click.command()
def main():
'''
Agenda de Contactos Retro. Práctica del curso de python
'''
if not os.path.exists('.contacts.csv'):
f = open('.contacts.csv', 'w+')
f.close()
window = Dialog()
exit_info, tag, text = window.inputmenu('MENU PRINCIPAL', 0, 0, 15, [
('L', 'Lista de Contactos'),
('N', 'Nuevo Contacto'),
('E', 'Editar Contacto'),
('B', 'Borrar Contacto'),
('S', 'Salir'),
])
if tag == 'L':
ListContacts()
elif tag == 'B':
code, numbers = SelectContacts('SELECCIONE LOS CONTACTOS QUE DESEA ELIMINAR')
if code == 'ok':
for n in numbers:
c = Contact("", n)
c.delete()
elif tag == 'N':
code, data = ContactForm()
if code == 'ok':
contact = Contact(data[1], data[0])
contact.save()
elif tag == 'E':
code, contact = SelectContact()
if code == 'ok':
code , data = ContactForm(contact.split("|")[0], contact.split("|")[1])
if code == 'ok':
edited_contact = Contact(data[1], data[0])
edited_contact.save()
elif tag == 'S':
return 0
main()
Algunas Capturas…
Curso Práctico de Python: Creación de un CRUD