From e19aeb0394c4f3419571958c4e1523392637c7be Mon Sep 17 00:00:00 2001 From: dittko Date: Mon, 22 Apr 2024 21:30:59 +0200 Subject: [PATCH 1/3] =?UTF-8?q?dodawanie=20kontaktow=20do=20poprawy=20jesc?= =?UTF-8?q?ze=20ca=C5=82o=C5=9B=C4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- interface.py | 68 +++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 60 insertions(+), 8 deletions(-) diff --git a/interface.py b/interface.py index 342f08d..7b0a9fa 100644 --- a/interface.py +++ b/interface.py @@ -5,6 +5,7 @@ from tkinter.constants import NORMAL, DISABLED, BOTH, RIDGE, END, LEFT, RIGHT, TOP, X, Y, INSERT, SEL, WORD from models import Contact, IModel, Template from tkhtmlview import HTMLLabel +from tkinter import * def errorHandler(xd, exctype: type, excvalue: Exception, tb): msg = f"{exctype}: {excvalue}, {tb}" @@ -367,7 +368,7 @@ def show_placeholder_menu(event): start_index = end_index class GroupEditor(Toplevel): - def __init__(self, parent: AppUI, groupName: str | None = None, edited: Iterable[Contact] | None = None): + def __init__(self, parent: 'AppUI', groupName: str | None = None, edited: Iterable['Contact'] | None = None): super().__init__(parent.root) self.parent = parent self.groupName = groupName @@ -394,22 +395,73 @@ def prepareInterface(self): if self.currentGroup: [self.add_contact(c) for c in self.currentGroup] - btn_save = Button(self, text="Zapisz", bg="lightblue", fg="black", command=self.__save_group_clicked) - btn_save.grid(row=2, column=0, columnspan=2, padx=5, pady=5, sticky="ew") + btn_add_contact = Button(self, text="Dodaj adres mailowy", bg="lightblue", fg="black", command=self.add_contact_window) + btn_add_contact.grid(row=2, column=0, columnspan=2, padx=5, pady=5, sticky="ew") - def add_contact(self, c: Contact): - self.email_text.insert(INSERT, str(c)) - # self.email_text.update + btn_save = Button(self, text="Zapisz", bg="lightblue", fg="black", command=self.__save_group_clicked) + btn_save.grid(row=3, column=0, columnspan=2, padx=5, pady=5, sticky="ew") + + def add_contact(self, c: 'Contact'): + self.email_text.insert(INSERT, str(c.email) + "\n") + + def add_contact_window(self): + contact_window = Toplevel(self) + contact_window.title("Dodaj kontakt") + contact_window.geometry("%dx%d+%d+%d" % (self.winfo_width(), self.winfo_height(), self.winfo_rootx(), self.winfo_rooty())) + + + email_label = Label(contact_window, text="Adres email:") + email_label.grid(row=0, column=0, padx=5, pady=5) + self.email_entry = Entry(contact_window) + self.email_entry.grid(row=0, column=1, padx=5, pady=5) + + name_label = Label(contact_window, text="Imię:") + name_label.grid(row=0, column=2, padx=5, pady=5) + self.name_entry = Entry(contact_window) + self.name_entry.grid(row=0, column=3, padx=5, pady=5) + + surname_label = Label(contact_window, text="Nazwisko:") + surname_label.grid(row=0, column=4, padx=5, pady=5) + self.surname_entry = Entry(contact_window) + self.surname_entry.grid(row=0, column=5, padx=5, pady=5) + + + btn_add = Button(contact_window, text="Dodaj kontakt", bg="lightblue", fg="black", command=self.add_contact_to_group) + btn_add.grid(row=1, column=0, columnspan=6, padx=5, pady=5) + + + self.feedback_label = Label(contact_window, text="", bg="lightblue") + self.feedback_label.grid(row=2, column=0, columnspan=6, padx=5, pady=5, sticky="ew") + + def add_contact_to_group(self): + email = self.email_entry.get() + name = self.name_entry.get() + surname = self.surname_entry.get() + + if email and name and surname: + contact_info = f"{email} - {name} {surname}" + self.email_text.insert(END, email + "\n") + self.feedback_label.config(text="Kontakt dodany", fg="green") + else: + self.feedback_label.config(text="Uzupełnij wszystkie pola", fg="red") def __save_group_clicked(self) -> None: result = [] group_name, email_addresses = self.name_entry.get(), self.email_text.get(1.0, END) for mail in email_addresses.replace("\n", "").split(","): - # TODO jeżeli kontakt już istnieje, to nie tworzyć nowego, tylko zwrócić istniejący try: result.append(Contact("", "", mail)) except AttributeError as e: - # print(e) raise e self.parent.add_group(group_name, result) self.destroy() + + +class Contact: + def __init__(self, name, surname, email): + self.name = name + self.surname = surname + self.email = email + + def __str__(self): + return f"{self.name} {self.surname} - {self.email}" From 1ab0dcc456858faed49fe8df63038275f95fe97f Mon Sep 17 00:00:00 2001 From: dittko Date: Tue, 23 Apr 2024 19:35:12 +0200 Subject: [PATCH 2/3] =?UTF-8?q?poprawione=20grupy=20i=20dodawanie=20kontak?= =?UTF-8?q?t=C3=B3w=20wersja=20pokazowa=20do=20poprawy=20jescze?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- interface.py | 117 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 80 insertions(+), 37 deletions(-) diff --git a/interface.py b/interface.py index 7b0a9fa..199a2cc 100644 --- a/interface.py +++ b/interface.py @@ -395,8 +395,11 @@ def prepareInterface(self): if self.currentGroup: [self.add_contact(c) for c in self.currentGroup] - btn_add_contact = Button(self, text="Dodaj adres mailowy", bg="lightblue", fg="black", command=self.add_contact_window) - btn_add_contact.grid(row=2, column=0, columnspan=2, padx=5, pady=5, sticky="ew") + btn_add_list_contact = Button(self, text="Dodaj z listy", bg="lightblue", fg="black", command=self.add_contact_from_list_window) + btn_add_list_contact.grid(row=2, column=0, padx=5, pady=5, sticky="ew") + + btn_add_manual_contact = Button(self, text="Dodaj ręcznie", bg="lightblue", fg="black", command=self.add_manual_contact_window) + btn_add_manual_contact.grid(row=2, column=1, padx=5, pady=5, sticky="ew") btn_save = Button(self, text="Zapisz", bg="lightblue", fg="black", command=self.__save_group_clicked) btn_save.grid(row=3, column=0, columnspan=2, padx=5, pady=5, sticky="ew") @@ -404,59 +407,99 @@ def prepareInterface(self): def add_contact(self, c: 'Contact'): self.email_text.insert(INSERT, str(c.email) + "\n") - def add_contact_window(self): + def add_contact_from_list_window(self): contact_window = Toplevel(self) - contact_window.title("Dodaj kontakt") - contact_window.geometry("%dx%d+%d+%d" % (self.winfo_width(), self.winfo_height(), self.winfo_rootx(), self.winfo_rooty())) + contact_window.title("Dodaj kontakt z listy") + + contact_frame = Frame(contact_window) + contact_frame.pack(fill=BOTH, expand=True) + + scrollbar = Scrollbar(contact_frame, orient=VERTICAL) + scrollbar.pack(side=RIGHT, fill=Y) + + contact_canvas = Canvas(contact_frame, yscrollcommand=scrollbar.set) + contact_canvas.pack(side=LEFT, fill=BOTH, expand=True) + + scrollbar.config(command=contact_canvas.yview) + + contact_inner_frame = Frame(contact_canvas) + contact_canvas.create_window((0, 0), window=contact_inner_frame, anchor='nw') + + fake_data = [("mail1@example.com", "John", "Doe"), + ("mail2@example.com", "Jane", "Smith"), + ("mail3@example.com", "Michael", "Johnson"), + ("mail4@example.com", "Emily", "Brown"), + ("mail5@example.com", "William", "Jones"), + ("mail6@example.com", "Olivia", "Taylor"), + ("mail7@example.com", "David", "Anderson"), + ("mail8@example.com", "Sophia", "Thomas"), + ("mail9@example.com", "James", "Jackson"), + ("mail10@example.com", "Emma", "White"), + ("mail11@example.com", "Benjamin", "Harris"), + ("mail12@example.com", "Isabella", "Martin"), + ("mail13@example.com", "Daniel", "Thompson"), + ("mail14@example.com", "Ava", "Garcia"), + ("mail15@example.com", "Alexander", "Martinez"), + ("mail16@example.com", "TEST", "16")] + + def add_contact_from_list(email): + self.email_text.insert(END, email + "\n") + + for idx, (email, name, surname) in enumerate(fake_data): + Label(contact_inner_frame, text=f"Mail {idx+1}:").grid(row=idx, column=0, padx=5, pady=5) + Label(contact_inner_frame, text=f"{email}").grid(row=idx, column=1, padx=5, pady=5) + Button(contact_inner_frame, text="Dodaj kontakt", bg="lightblue", fg="black", command=lambda email=email: add_contact_from_list(email)).grid(row=idx, column=2, padx=5, pady=5) - - email_label = Label(contact_window, text="Adres email:") + def on_frame_configure(event): + contact_canvas.configure(scrollregion=contact_canvas.bbox("all")) + + contact_inner_frame.bind("", on_frame_configure) + + def add_manual_contact_window(self): + contact_window = Toplevel(self) + contact_window.title("Dodaj kontakt ręcznie") + + email_label = Label(contact_window, text="Adres email:", bg="lightblue") email_label.grid(row=0, column=0, padx=5, pady=5) - self.email_entry = Entry(contact_window) + self.email_entry = Entry(contact_window, bg="white", fg="black") self.email_entry.grid(row=0, column=1, padx=5, pady=5) - name_label = Label(contact_window, text="Imię:") - name_label.grid(row=0, column=2, padx=5, pady=5) - self.name_entry = Entry(contact_window) - self.name_entry.grid(row=0, column=3, padx=5, pady=5) - - surname_label = Label(contact_window, text="Nazwisko:") - surname_label.grid(row=0, column=4, padx=5, pady=5) - self.surname_entry = Entry(contact_window) - self.surname_entry.grid(row=0, column=5, padx=5, pady=5) + name_label = Label(contact_window, text="Imię:", bg="lightblue") + name_label.grid(row=1, column=0, padx=5, pady=5) + self.name_entry = Entry(contact_window, bg="white", fg="black") + self.name_entry.grid(row=1, column=1, padx=5, pady=5) - - btn_add = Button(contact_window, text="Dodaj kontakt", bg="lightblue", fg="black", command=self.add_contact_to_group) - btn_add.grid(row=1, column=0, columnspan=6, padx=5, pady=5) + surname_label = Label(contact_window, text="Nazwisko:", bg="lightblue") + surname_label.grid(row=2, column=0, padx=5, pady=5) + self.surname_entry = Entry(contact_window, bg="white", fg="black") + self.surname_entry.grid(row=2, column=1, padx=5, pady=5) - - self.feedback_label = Label(contact_window, text="", bg="lightblue") - self.feedback_label.grid(row=2, column=0, columnspan=6, padx=5, pady=5, sticky="ew") + btn_add_contact = Button(contact_window, text="Dodaj kontakt", bg="lightblue", fg="black", command=self.add_manual_contact) + btn_add_contact.grid(row=3, column=0, columnspan=2, padx=5, pady=5, sticky="ew") - def add_contact_to_group(self): + def add_manual_contact(self): email = self.email_entry.get() name = self.name_entry.get() surname = self.surname_entry.get() - - if email and name and surname: - contact_info = f"{email} - {name} {surname}" - self.email_text.insert(END, email + "\n") - self.feedback_label.config(text="Kontakt dodany", fg="green") + if email: + self.email_text.insert(END, f"{email}\n") else: - self.feedback_label.config(text="Uzupełnij wszystkie pola", fg="red") + messagebox.showerror("Błąd", "Podaj adres e-mail") def __save_group_clicked(self) -> None: result = [] group_name, email_addresses = self.name_entry.get(), self.email_text.get(1.0, END) - for mail in email_addresses.replace("\n", "").split(","): - try: - result.append(Contact("", "", mail)) - except AttributeError as e: - raise e + for line in email_addresses.split("\n"): + if line.strip(): + email, *name_surname = line.strip().split(" - ") + if name_surname: + name, surname = " ".join(name_surname[:-1]), name_surname[-1] + else: + name, surname = "", "" + result.append(Contact(name, surname, email)) self.parent.add_group(group_name, result) self.destroy() - class Contact: def __init__(self, name, surname, email): self.name = name @@ -464,4 +507,4 @@ def __init__(self, name, surname, email): self.email = email def __str__(self): - return f"{self.name} {self.surname} - {self.email}" + return f"{self.name} {self.surname} - {self.email}" \ No newline at end of file From daaa54bcad85f7fa599526a86b4059cd91c8f5ad Mon Sep 17 00:00:00 2001 From: dittko Date: Wed, 24 Apr 2024 14:18:46 +0200 Subject: [PATCH 3/3] guigroupsfixed full --- interface.py | 59 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 16 deletions(-) diff --git a/interface.py b/interface.py index 199a2cc..cdb78be 100644 --- a/interface.py +++ b/interface.py @@ -408,12 +408,38 @@ def add_contact(self, c: 'Contact'): self.email_text.insert(INSERT, str(c.email) + "\n") def add_contact_from_list_window(self): + def search_contact(): + search_criteria = search_entry.get().strip().lower() + for widget in contact_inner_frame.winfo_children(): + widget.destroy() + for idx, (email, name, surname) in enumerate(fake_data): + if search_criteria in name.lower() or search_criteria in surname.lower() or search_criteria in email.lower(): + Label(contact_inner_frame, text=f"Mail {idx+1}:").grid(row=idx, column=0, padx=5, pady=5) + Label(contact_inner_frame, text=f"{email} - {name} {surname}").grid(row=idx, column=1, padx=5, pady=5) + Button(contact_inner_frame, text="Dodaj kontakt", bg="lightblue", fg="black", command=lambda email=email: add_contact_from_list(email)).grid(row=idx, column=2, padx=5, pady=5) + contact_window = Toplevel(self) contact_window.title("Dodaj kontakt z listy") + + group_editor_geometry = self.winfo_geometry() + + contact_window.geometry(group_editor_geometry) contact_frame = Frame(contact_window) contact_frame.pack(fill=BOTH, expand=True) + search_frame = Frame(contact_frame, bg="lightblue") + search_frame.pack(fill=X, padx=5, pady=5) + + search_label = Label(search_frame, text="Wyszukaj:", bg="lightblue") + search_label.pack(side=LEFT, padx=5, pady=5) + + search_entry = Entry(search_frame, bg="white", fg="black") + search_entry.pack(side=LEFT, padx=5, pady=5, expand=True, fill=X) + + search_button = Button(search_frame, text="Szukaj", bg="lightblue", fg="black", command=search_contact) + search_button.pack(side=LEFT, padx=5, pady=5) + scrollbar = Scrollbar(contact_frame, orient=VERTICAL) scrollbar.pack(side=RIGHT, fill=Y) @@ -426,28 +452,29 @@ def add_contact_from_list_window(self): contact_canvas.create_window((0, 0), window=contact_inner_frame, anchor='nw') fake_data = [("mail1@example.com", "John", "Doe"), - ("mail2@example.com", "Jane", "Smith"), - ("mail3@example.com", "Michael", "Johnson"), - ("mail4@example.com", "Emily", "Brown"), - ("mail5@example.com", "William", "Jones"), - ("mail6@example.com", "Olivia", "Taylor"), - ("mail7@example.com", "David", "Anderson"), - ("mail8@example.com", "Sophia", "Thomas"), - ("mail9@example.com", "James", "Jackson"), - ("mail10@example.com", "Emma", "White"), - ("mail11@example.com", "Benjamin", "Harris"), - ("mail12@example.com", "Isabella", "Martin"), - ("mail13@example.com", "Daniel", "Thompson"), - ("mail14@example.com", "Ava", "Garcia"), - ("mail15@example.com", "Alexander", "Martinez"), - ("mail16@example.com", "TEST", "16")] + ("mail2@example.com", "Jane", "Smith"), + ("mail3@example.com", "Michael", "Johnson"), + ("mail4@example.com", "Emily", "Brown"), + ("mail5@example.com", "William", "Jones"), + ("mail6@example.com", "Olivia", "Taylor"), + ("mail7@example.com", "David", "Anderson"), + ("mail8@example.com", "Sophia", "Thomas"), + ("mail9@example.com", "James", "Jackson"), + ("mail10@example.com", "Emma", "White"), + ("mail11@example.com", "Benjamin", "Harris"), + ("mail12@example.com", "Isabella", "Martin"), + ("mail13@example.com", "Daniel", "Thompson"), + ("mail14@example.com", "Ava", "Garcia"), + ("mail15@example.com", "Alexander", "Martinez"), + ("mail16@example.com", "TEST", "16"), + ("mail17@example.com", "TEST", "17")] def add_contact_from_list(email): self.email_text.insert(END, email + "\n") for idx, (email, name, surname) in enumerate(fake_data): Label(contact_inner_frame, text=f"Mail {idx+1}:").grid(row=idx, column=0, padx=5, pady=5) - Label(contact_inner_frame, text=f"{email}").grid(row=idx, column=1, padx=5, pady=5) + Label(contact_inner_frame, text=f"{email} - {name} {surname}").grid(row=idx, column=1, padx=5, pady=5) Button(contact_inner_frame, text="Dodaj kontakt", bg="lightblue", fg="black", command=lambda email=email: add_contact_from_list(email)).grid(row=idx, column=2, padx=5, pady=5) def on_frame_configure(event):