Telephone Directory CSV
Telephone Directory CSV
py
import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk
import csv
import traceback
from tkinter import font
from datetime import datetime
import os
from tkinter import messagebox
def validate_field():
try:
global a
global b
global c
global d
a=entry1.get()
b=entry2.get()
c=entry3.get()
d=entry4.get()
entry1.config(bg="white")
entry2.config(bg="white")
entry3.config(bg="white")
entry4.config(bg="white")
if a=="":
entry1.config(bg="red")
return False
if b=="":
entry2.config(bg="red")
return False
if d=="":
entry4.config(bg="red")
return False
if a.isnumeric():
entry1.config(bg="red")
return False
if d.isnumeric():
entry4.config(bg="red")
return False
if c!="":
if c.isnumeric():
entry1.config(bg="white")
entry2.config(bg="white")
entry3.config(bg="white")
entry4.config(bg="white")
return True
else:
entry3.config(bg="red")
return False
else:
entry1.config(bg="white")
entry2.config(bg="white")
entry3.config(bg="white")
entry4.config(bg="white")
return True
except:
handling_error()
def submit():
try:
if save():
messagebox.showinfo("Information", "The entry has been successfully saved!")
entry1.delete(0,tk.END)
entry2.delete(0,tk.END)
entry3.delete(0,tk.END)
entry4.delete(0,tk.END)
except:
handling_error()
def main_menu(window):
window.withdraw()
start()
def save():
try:
if validate_field():
try:
l=[]
p=int(b)
l.extend([a,p,c,d])
o=open("data.csv","a", newline="")
io=csv.writer(o, delimiter=",")
io.writerow(l)
o.close()
global entry1
entry1 = tk.Entry(root2)
entry1.grid(row=0, column=1, pady=2, sticky=tk.W)
global entry2
entry2 = tk.Entry(root2)
entry2.grid(row=1, column=1, pady=2, sticky=tk.W)
global entry3
entry3 = tk.Entry(root2)
entry3.grid(row=2, column=1, pady=2, sticky=tk.W)
global entry4
entry4 = tk.Entry(root2)
entry4.grid(row=3, column=1, pady=5, sticky=tk.W)
validate_cmd = root.register(validate_field)
entry1.config(validate="focusout", validatecommand=(validate_cmd, "%P"))
entry2.config(validate="focusout", validatecommand=(validate_cmd, "%P"))
entry3.config(validate="focusout", validatecommand=(validate_cmd, "%P"))
entry4.config(validate="focusout", validatecommand=(validate_cmd, "%P"))
global table
table_frame = ttk.Frame(root2)
table_frame.grid(row=5, column=0, columnspan=2, pady=2, padx=17)
table_scroll = ttk.Scrollbar(table_frame)
table_scroll.pack(side="right", fill="y")
table_scroll.configure(command=table.yview)
global lines
lines = data()
root2.mainloop()
except:
handling_error()
def enter():
try:
global name_entry
global pn_entry
global country_entry
global lines
lines=data()
if table2.get_children():
table2.delete(*table2.get_children())
p = name_entry.get()
q = str(pn_entry.get())
r = country_entry.get()
count = 0
for i in lines:
if p != "" and q == "" and r == "":
if i[0] == p:
name_entry.delete(0,tk.END)
pn_entry.delete(0,tk.END)
country_entry.delete(0,tk.END)
except:
handling_error()
def searcher():
try:
global root4
global table2
global e
global f
global h
global name_entry
global pn_entry
global country_entry
root.withdraw()
root4 = tk.Tk()
root4.geometry("520x430")
root4.title("Searching data")
name_entry= tk.Entry(root4)
name_entry.grid(row=3, column=0, padx=11, pady=6)
pn_entry = tk.Entry(root4)
pn_entry.grid(row=3, column=1, padx=11, pady=6)
country_entry = tk.Entry(root4)
country_entry.grid(row=3, column=2, padx=11, pady=6)
global label9
label9=tk.Label(root4, text="There are 0 search results")
label9.grid(row=5, column=0, columnspan=3, padx=5,pady=6)
e=name_entry.get()
f=pn_entry.get()
h=country_entry.get()
table_frame = ttk.Frame(root4)
table_frame.grid(row=6, column=0, columnspan=3, pady=2, padx=17)
table_scroll = ttk.Scrollbar(table_frame)
table_scroll.pack(side="right", fill="y")
table_scroll.configure(command=table2.yview)
root4.mainloop()
except:
handling_error()
def select():
try:
selected_item1 = table2.selection()
if selected_item1:
btn10.grid(row=7, column=2, padx=5, pady=6)
else:
btn10.grid_forget()
except:
handling_error()
def delete():
try:
btn10.grid_forget()
selected_item = table2.focus()
if selected_item:
item_values = table2.item(selected_item)["values"]
name12 = item_values[0]
phone_number12 = item_values[1]
alternate_phone_number12 = item_values[2]
country12 = item_values[3]
for i in lines:
if i[0] == name12 and i[3]==country12 and i[1]==phone_number12:
lines.remove(i)
io.writerow(i)
selected_item1 = table2.selection()
if selected_item1:
table2.delete(selected_item1)
except:
handling_error()
def data():
try:
with open("data.csv","r", newline="") as j:
l=[]
io=csv.reader(j, delimiter=",")
for i in io:
if i == []:
continue
elif i==["Name", "Phone Number", "Alternate Phone Number", "Country"]:
continue
else:
i[1]=int(i[1])
l.append(i)
return l
except:
handling_error()
def editor():
try:
root.withdraw()
global root5
root5 = tk.Tk()
root5.geometry("550x600")
root5.title("Editing data")
global name_entry1
name_entry1 = tk.Entry(root5)
name_entry1.grid(row=3, column=0, padx=11, pady=6)
global pn_entry1
pn_entry1 = tk.Entry(root5)
pn_entry1.grid(row=3, column=1, padx=11, pady=6)
global country_entry1
country_entry1 = tk.Entry(root5)
country_entry1.grid(row=3, column=2, padx=11, pady=6)
global labelI
labelI=tk.Label(root5, text="There are 0 search results")
labelI.grid(row=5, column=0, columnspan=3, padx=5,pady=6)
enl=tk.Label(root5, text="Name")
enl.grid(row=8, column=0, padx=11, pady=6)
global ename
ename=tk.Entry(root5)
ename.config(state="disabled")
ename.grid(row=8, column=1, padx=11, pady=6)
global eph
eph=tk.Entry(root5)
eph.config(state="disabled")
eph.grid(row=9, column=1, padx=11, pady=6)
global eaph
eaph=tk.Entry(root5)
eaph.config(state="disabled")
eaph.grid(row=10, column=1, padx=11, pady=6)
ecl=tk.Label(root5, text="Country")
ecl.grid(row=11, column=0, padx=11, pady=6)
global ecountry
ecountry=tk.Entry(root5)
ecountry.config(state="disabled")
ecountry.grid(row=11, column=1, padx=11, pady=6)
global table3
table_frame1 = ttk.Frame(root5)
table_frame1.grid(row=6, column=0, columnspan=3, pady=2, padx=17)
table_scroll1 = ttk.Scrollbar(table_frame1)
table_scroll1.pack(side="right", fill="y")
global btn1
btn1=tk.Button(root5, text="Edit", command=edit)
def select1():
try:
selected_item = table3.selection()
if selected_item:
btn1.grid(row=7, column=2, padx=5, pady=6, sticky=tk.W)
else:
btn1.grid_forget()
except:
handling_error()
def edit():
entry_edit()
add_text()
def entry_edit():
try:
ename.config(state="normal")
eph.config(state="normal")
eaph.config(state="normal")
ecountry.config(state="normal")
global cancel_btn
cancel_btn=tk.Button(root5, text="Cancel",command=cancel)
cancel_btn.grid(row=10, column=2, rowspan=2,padx=3,pady=3)
global btn2
btn2=tk.Button(root5, text="Update", command=update)
btn2.grid(row=9, column=2, rowspan=2,padx=3,pady=3)
except:
handling_error()
def cancel():
try:
ename.delete(0,tk.END)
eph.delete(0,tk.END)
eaph.delete(0,tk.END)
ecountry.delete(0,tk.END)
ename.config(state="disabled")
eph.config(state="disabled")
eaph.config(state="disabled")
ecountry.config(state="disabled")
btn2.destroy()
cancel_btn.destroy()
except:
handling_error()
def update():
try:
btn1.grid_forget()
name12 = ename.get()
phone_number12 = int(eph.get())
alternate_phone_number12 = eaph.get()
country12 = ecountry.get()
y=[name12,phone_number12,alternate_phone_number12,country12]
selected_item = table3.focus()
if selected_item:
item_values = table3.item(selected_item)["values"]
global name1
name1 = item_values[0]
global phone_number1
phone_number1 = item_values[1]
global alternate_phone_number1
alternate_phone_number1 = item_values[2]
global country1
country1 = item_values[3]
enter1()
ename.delete(0,tk.END)
eph.delete(0,tk.END)
eaph.delete(0,tk.END)
ecountry.delete(0,tk.END)
ename.config(state="disabled")
eph.config(state="disabled")
eaph.config(state="disabled")
ecountry.config(state="disabled")
if updated:
except:
handling_error()
def add_text():
try:
selected_item = table3.focus()
if selected_item:
item_values = table3.item(selected_item)["values"]
global name1
name1 = item_values[0]
global phone_number1
phone_number1 = item_values[1]
global alternate_phone_number1
alternate_phone_number1 = item_values[2]
global country1
country1 = item_values[3]
ename.delete(0, tk.END)
ename.insert(0, name1)
eph.delete(0, tk.END)
eph.insert(0, phone_number1)
eaph.delete(0, tk.END)
eaph.insert(0, alternate_phone_number1)
ecountry.delete(0, tk.END)
ecountry.insert(0, country1)
except:
handling_error()
def enter1():
try:
global lines
lines=data()
if table3.get_children():
table3.delete(*table3.get_children())
p = name_entry1.get()
q = str(pn_entry1.get())
r = country_entry1.get()
count = 0
for i in lines:
if p != "" and q == "" and r == "":
if i[0] == p:
table3.insert(parent="", index="end", text="", values=i)
count += 1
except:
handling_error()
def delete_win():
try:
global root4
global table2
global e
global f
global h
global name_entry
global pn_entry
global country_entry
root.withdraw()
root4 = tk.Tk()
root4.geometry("520x430")
root4.title("Deleting data")
name_entry= tk.Entry(root4)
name_entry.grid(row=3, column=0, padx=11, pady=6)
pn_entry = tk.Entry(root4)
pn_entry.grid(row=3, column=1, padx=11, pady=6)
country_entry = tk.Entry(root4)
country_entry.grid(row=3, column=2, padx=11, pady=6)
global label9
label9=tk.Label(root4, text="There are 0 search results")
label9.grid(row=5, column=0, columnspan=3, padx=5,pady=6)
e=name_entry.get()
f=pn_entry.get()
h=country_entry.get()
table_frame = ttk.Frame(root4)
table_frame.grid(row=6, column=0, columnspan=3, pady=2, padx=17)
table_scroll = ttk.Scrollbar(table_frame)
table_scroll.pack(side="right", fill="y")
table_scroll.configure(command=table2.yview)
global btn10
btn10=tk.Button(root4, text="Delete", command=delete)
root4.mainloop()
except:
handling_error()
def close():
try:
pass_window.deiconify()
pass_entry.delete(0, tk.END)
root.withdraw()
except:
handling_error()
def start():
try:
pass_window.withdraw()
global lines
lines = data()
global root
root = tk.Tk()
root.geometry("400x320")
root.title("Telephone Directory")
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
btn_width = 24
root.mainloop()
except:
handling_error()
def toggle_password_visibility():
try:
if show_password.get():
pass_entry.config(show="")
else:
pass_entry.config(show="*")
except:
handling_error()
def submit1():
try:
password = pass_entry.get()
if password=="Bosco@5130":
start()
else:
pass_entry.config(bg="red")
except:
handling_error()
def show_error_dialog():
root.withdraw()
return result
def handling_error():
ok=show_error_dialog()
result = messagebox.askquestion("Question", "Do you want to open log file?")
if result=="yes":
os.startfile("log.txt")
else:
os._exit(0)
if ok=="ok":
current_datetime = datetime.now()
timestamp=current_datetime.strftime("%Y-%m-%d %H:%M:%S")
error_message = traceback.format_exc()
with open("log.txt", "a") as f:
f.write(f"[{timestamp}]\n")
f.write(f"{error_message}\n")
f.write(f"______________________________________________________________\n")
def close_pass():
result = messagebox.askquestion("Question", "Are you sure?")
if result == "yes":
os._exit(0)
else:
pass
try:
pass_window = tk.Tk()
pass_window.geometry("500x500")
pass_window.title("Login")
image = Image.open("logo.jpeg")
tk_image = ImageTk.PhotoImage(image)
show_password = tk.BooleanVar()
show_password_checkbox = tk.Checkbutton(pass_window, text="Show Password",
variable=show_password, command=toggle_password_visibility)
show_password_checkbox.grid(row=5, column=1, padx=10, pady=10, sticky="w")
pass_window.grid_rowconfigure(0, weight=1)
pass_window.grid_rowconfigure(7, weight=1)
pass_window.grid_columnconfigure(0, weight=1)
pass_window.grid_columnconfigure(2, weight=1)
pass_window.mainloop()
except:
handling_error()