import tkinter import tkinter.messagebox import pickle # main (root) GUI menu class CrudGUI: def __init__(self, master): self.master = master self.master.title('Welcome Menu') self.top_frame = tkinter.Frame(self.master) self.bottom_frame = tkinter.Frame(self.master) self.radio_var = tkinter.IntVar() self.radio_var.set(1) # create the radio buttons self.look = tkinter.Radiobutton(self.top_frame, text='Look up customer', variable=self.radio_var, value=1) self.add = tkinter.Radiobutton(self.top_frame, text='Add Customer', variable=self.radio_var, value=2) self.change = tkinter.Radiobutton(self.top_frame, text='Change customer email', variable=self.radio_var, value=3) self.delete = tkinter.Radiobutton(self.top_frame, text='Delete customer', variable=self.radio_var, value=4) # pack the radio buttons self.look.pack(anchor='w', padx=20) self.add.pack(anchor='w', padx=20) self.change.pack(anchor='w', padx=20) self.delete.pack(anchor='w', padx=20) # create ok and quit buttons self.ok_button = tkinter.Button(self.bottom_frame, text='OK', command=self.open_menu) self.quit_button = tkinter.Button(self.bottom_frame, text='QUIT', command=self.master.destroy) # pack the buttons self.ok_button.pack(side='left') self.quit_button.pack(side='left') # pack the frames self.top_frame.pack() self.bottom_frame.pack() def open_menu(self): if self.radio_var.get() == 1: _ = LookGUI(self.master) elif self.radio_var.get() == 2: _ = AddGUI(self.master) elif self.radio_var.get() == 3: _ = ChangeGUI(self.master) elif self.radio_var.get() == 4: _ = DeleteGUI(self.master) # GUI for search class LookGUI: def __init__(self, master): # open the file, load to customers, close file. Do in each class try: input_file = open("customer_file.dat", 'rb') self.customers = pickle.load(input_file) input_file.close() except (FileNotFoundError, IOError): self.customers = {} # tkinter.Toplevel() is like tkinter.Frame() but it opens in a new window self.look = tkinter.Toplevel(master) self.look.title('Search for customer') # create Frames for this Toplevel window self.top_frame = tkinter.Frame(self.look) self.middle_frame = tkinter.Frame(self.look) self.bottom_frame = tkinter.Frame(self.look) # widgets for top frame - label and entry box for name self.search_label = tkinter.Label(self.top_frame, text='Enter customer name to look for: ') self.search_entry = tkinter.Entry(self.top_frame, width=15) # pack top frame self.search_label.pack(side='left') self.search_entry.pack(side='left') # middle frame - label for results self.value = tkinter.StringVar() self.info = tkinter.Label(self.middle_frame, text='Results: ') self.result_label = tkinter.Label(self.middle_frame, textvariable=self.value) # pack Middle frame self.info.pack(side='left') self.result_label.pack(side='left') # buttons for bottom frame self.search_button = tkinter.Button(self.bottom_frame, text='Search', command=self.search) self.back_button = tkinter.Button(self.bottom_frame, text='Main Menu', command=self.back) # pack bottom frame self.search_button.pack(side='left') self.back_button.pack(side='left') # pack frames self.top_frame.pack() self.middle_frame.pack() self.bottom_frame.pack() def search(self): name = self.search_entry.get() result = self.customers.get(name, 'Not Found') self.value.set(result) def back(self): self.look.destroy() # GUI for adding customer values class AddGUI: def __init__(self, master): # open the file, load to customers, close file. Do in each class try: input_file = open("customer_file.dat", 'rb') self.customers = pickle.load(input_file) input_file.close() except (FileNotFoundError, IOError): self.customers = {} # tkinter.Toplevel() is like tkinter.Frame() but it opens in a new window self.add = tkinter.Toplevel(master) self.add.title('Add a customer') # create Frames for this Toplevel window self.top_frame = tkinter.Frame(self.add) self.middle_frame = tkinter.Frame(self.add) self.bottom_frame = tkinter.Frame(self.add) # widgets for top frame - label and entry box for name self.add_name_label = tkinter.Label(self.top_frame, text='Enter customer name to add to database: ') self.add_name_entry = tkinter.Entry(self.top_frame, width=15) self.add_email_label = tkinter.Label(self.middle_frame, text='Enter customer email') self.add_email_entry = tkinter.Entry(self.middle_frame, width=20) # pack top frame self.add_name_label.pack(side='left') self.add_name_entry.pack(side='left') # middle frame - label for results self.add_email_label.pack(side='left') self.add_email_entry.pack(side='left') # pack Middle frame # buttons for bottom frame self.add_button = tkinter.Button(self.bottom_frame, text='Add', command=self.create) self.back_button = tkinter.Button(self.bottom_frame, text='Main Menu', command=self.back) # pack bottom frame self.add_button.pack(side='left') self.back_button.pack(side='left') # pack frames self.top_frame.pack() self.middle_frame.pack() self.bottom_frame.pack() # adds name of customer plus their email def create(self): name = self.add_name_entry.get() email = self.add_email_entry.get() # Checks for duplicates if name not in self.customers: self.customers[name] = email self.save() self.add_name_entry.delete(0, tkinter.END) self.add_email_entry.delete(0, tkinter.END) else: tkinter.messagebox.showinfo("Error!", name + " already exists!") def back(self): self.add.destroy() # saves file def save(self): save_file = open('customer_file.dat', 'wb') pickle.dump(self.customers, save_file) save_file.close() class ChangeGUI: def __init__(self, master): # open the file, load to customers, close file. Do in each class try: input_file = open("customer_file.dat", 'rb') self.customers = pickle.load(input_file) input_file.close() except (FileNotFoundError, IOError): self.customers = {} # tkinter.Toplevel() is like tkinter.Frame() but it opens in a new window self.change = tkinter.Toplevel(master) self.change.title('Update a customer') # create Frames for this Toplevel window self.top_frame = tkinter.Frame(self.change) self.middle_frame = tkinter.Frame(self.change) self.bottom_frame = tkinter.Frame(self.change) # widgets for top frame - label and entry box for name self.update_name_label = tkinter.Label(self.top_frame, text='Enter customer name to be changed: ') self.update_name_entry = tkinter.Entry(self.top_frame, width=15) self.update_email_label = tkinter.Label(self.middle_frame, text='Enter new customer email') self.update_email_entry = tkinter.Entry(self.middle_frame, width=20) # pack top frame self.update_name_label.pack(side='left') self.update_name_entry.pack(side='left') # middle frame - label for results self.update_email_label.pack(side='left') self.update_email_entry.pack(side='left') # pack Middle frame # buttons for bottom frame self.update_button = tkinter.Button(self.bottom_frame, text='Update', command=self.update) self.back_button = tkinter.Button(self.bottom_frame, text='Main Menu', command=self.back) # pack bottom frame self.update_button.pack(side='left') self.back_button.pack(side='left') # pack frames self.top_frame.pack() self.middle_frame.pack() self.bottom_frame.pack() # Updates customer email from name def update(self): name = self.update_name_entry.get() email = self.update_email_entry.get() # Checks if the name is in the dictionary, if true, email updates. if name in self.customers: self.customers[name] = email self.save() self.update_name_entry.delete(0, tkinter.END) self.update_email_entry.delete(0, tkinter.END) # Displays error message else: tkinter.messagebox.showinfo("Error!", name + " not found") def back(self): self.change.destroy() def save(self): save_file = open('customer_file.dat', 'wb') pickle.dump(self.customers, save_file) save_file.close() # Deletion class class DeleteGUI: def __init__(self, master): # open the file, load to customers, close file. Do in each class try: input_file = open("customer_file.dat", 'rb') self.customers = pickle.load(input_file) input_file.close() except (FileNotFoundError, IOError): self.customers = {} # tkinter.Toplevel() is like tkinter.Frame() but it opens in a new window self.delete = tkinter.Toplevel(master) self.delete.title('Update a customer') # create Frames for this Toplevel window self.top_frame = tkinter.Frame(self.delete) self.middle_frame = tkinter.Frame(self.delete) self.bottom_frame = tkinter.Frame(self.delete) # widgets for top frame - label and entry box for name self.remove_name_label = tkinter.Label(self.top_frame, text='Enter customer name to be deleted: ') self.remove_name_entry = tkinter.Entry(self.top_frame, width=15) # pack top frame self.remove_name_label.pack(side='left') self.remove_name_entry.pack(side='left') # buttons for bottom frame self.remove_button = tkinter.Button(self.bottom_frame, text='Delete', command=self.update) self.back_button = tkinter.Button(self.bottom_frame, text='Main Menu', command=self.back) # pack bottom frame self.remove_button.pack(side='left') self.back_button.pack(side='left') # pack frames self.top_frame.pack() self.middle_frame.pack() self.bottom_frame.pack() def delete(self): name = self.remove_name_entry.get() if name in self.customers: del self.customers[name] self.save() self.remove_name_entry.delete(0, tkinter.END) else: tkinter.messagebox.showinfo("Error!", name + " not found, can't delete!") def back(self): self.delete.destroy() def save(self): save_file = open('customer_file.dat', 'wb') pickle.dump(self.customers, save_file) save_file.close() def main(): # create a window root = tkinter.Tk() # call the GUI and send it the root menu # use _ as variable name because the variable will not be needed after instantiating GUI # the GUI itself will handles the remaining program logic _ = CrudGUI(root) # control the mainloop from main instead of the class root.mainloop() main()