import tkinter as tk import datetime import time import pickle student_list = {} book_list = {} student_index = [] book_index = [] s_num_active = None b_num_active = None class book(): def __init__(self, num, name, author, level,con): self.b_num = num #book num self.b_name = name #book name self.b_author = author #author self.b_level = level # book level self.b_con = con #book condition self.b_who_checked = None #holds student number who checked it out self.b_overdue = False #bool for overdue self.b_when = None #Holds date taken self.b_duedate = None #Holds duedate def check_out(self, stu_num): self.b_who_checked = stu_num self.b_when = datetime.date.today() self.b_duedate = datetime.date.today() + datetime.timedelta(days=21) #Can change this to allow for different weeks checked out def check_in(self): self.b_overdue = False self.b_who_checked = None self.b_when = None self.b_duedate = None def update_con(self,con): print(con) self.b_con=con def overdue (self): self.b_overdue = True class student(): def __init__(self, num, name, cls): self.s_num = num # student number self.s_name = name # student name self.s_cls = cls # student class self.s_readinglist = [] # a list of everything the student has read self.s_book = None # holds the book number student is reading def check_out(self,booknum): self.s_book = booknum self.s_readinglist.append(book_list[booknum].b_name) print(self.s_name, " has checked out ", book_list[self.s_book].b_name) def check_in(self): print(self.s_name, " has returned ", book_list[self.s_book].b_name) self.s_book = None def whoami(self): f = open('studentlist.txt', 'w') who = "" if self.s_book != None: print(self.s_num, ": ", self.s_name," - ", self.s_cls," is reading ", book_list[self.s_book].b_name, file =f) print(self.s_name, " has read the following this year:\n", self.s_readinglist, file = f) return f else: print(self.s_num, ": ", self.s_name," - ", self.s_cls, "has read the following this year:\n", self.s_readinglist, file = f) return f class libmain(tk.Tk): def __init__(self, master): tk.Tk.__init__(self,master) self.master = master self.initialize() def initialize(self): self.title("Library Maintenance") self.configure(bg ='#7d171c') # create the title background self.promptVar = tk.StringVar() logo = tk.PhotoImage (file="logo.png") label_title = tk.Label(self,bg="#7d171c", height =100,image=logo) label_title.photo=logo label_title.grid(column=0,row=0,columnspan=10) label_left = tk.Label(self,width=3,bg="#7d171c") label_left.grid(column=0,row=0,rowspan=4) label_right = tk.Label(self,width=6,bg="#7d171c") label_right.grid(column=10,row=0,rowspan=4) label_mid = tk.Label(self,width=6,bg="#7d171c") label_mid.grid(column=5,row=0,rowspan=4) label_prompt = tk.Label(self,bg="#7d171c", height =1, textvariable=self.promptVar, fg="#fff08c") label_prompt.grid(column=0,row=3,columnspan=10,sticky="EW") label_bottom = tk.Label(self,bg="#7d171c", height =1) label_bottom.grid(column=0,row=10,columnspan=8,sticky="EW") # create the listbox (note that size is in characters) listbox_s = tk.Listbox(self, width=60, height=20) listbox_s.grid(row=2, column=1, columnspan=3, sticky="we") listbox_b = tk.Listbox (self, width=60, height = 20) listbox_b.grid(row=2, column=6, columnspan=3, sticky="we") # create the entry fields s_txt=tk.StringVar() s_txt.set("Student List") entry_s = tk.Entry(self, textvariable=s_txt, width=60) entry_s.grid (column = 1, row = 1, columnspan=3,sticky="we") entry_s.bind("",lambda _:self.s_key(s_txt,listbox_s,listbox_b)) b_txt=tk.StringVar() b_txt.set("Book List") entry_b = tk.Entry(self, textvariable=b_txt, width=60) entry_b.grid (column = 6, row = 1, columnspan=3,sticky="we") entry_b.bind("",lambda _:self.b_key(b_txt,listbox_s,listbox_b)) # create the buttons but_s = tk.Button (self, text="Get Info", command=lambda:self.s_getinfo(s_txt)) but_s.grid(column=4,row=1,columnspan=2) but_b = tk.Button (self, text="Get Info", command=lambda:self.b_getinfo(b_txt)) but_b.grid(column=9,row=1, columnspan =2) but_s_add = tk.Button (self, text="Add a Student", command=lambda:self.add_s_win(listbox_s,listbox_b)) but_s_add.grid(column=1,row=4, sticky="ew") but_s_add = tk.Button (self, text="Sort by Class", command=lambda:self.s_cls(listbox_s,listbox_b)) but_s_add.grid(column=3,row=4, sticky="ew") but_b_add = tk.Button (self, text="Add a Book",command=lambda:self.add_bk_win(listbox_s,listbox_b)) but_b_add.grid(column=6,row=4, sticky="ew") but_b_del = tk.Button (self, text="Sort by Level", command=lambda:self.b_lvl(listbox_s,listbox_b)) but_b_del.grid(column=8,row=4, sticky="ew") but_slist = tk.Button (self, text="Student List", command=lambda:query.stu()) but_slist.grid(column=1,row=6, columnspan=3,sticky="we") but_blist = tk.Button (self, text="Book List", command=lambda:query.book()) but_blist.grid(column=6,row=6, columnspan=3,sticky="we") but_save = tk.Button (self, text="Save", command=lambda:query.save(self.promptVar)) but_save.grid(column=1,row=8, columnspan=3,sticky="we") but_load = tk.Button (self, text="Load", command=lambda:query.load(listbox_s,listbox_b,self.promptVar)) but_load.grid(column=6,row=8, columnspan=3,sticky="we") but_checkin = tk.Button (self, text="Check In", command=lambda:self.check_in(s_txt,self.promptVar,listbox_s,listbox_b)) but_checkin.grid(column=1,row=9, columnspan=3,sticky="we") but_checkout = tk.Button (self, text="Check Out", command=lambda:self.check_out(s_txt,b_txt,self.promptVar,listbox_s,listbox_b)) but_checkout.grid(column=6,row=9, columnspan=3,sticky="we") # create a vertical scrollbar to the right of the listbox yscroll_s = tk.Scrollbar(command=listbox_s.yview, orient=tk.VERTICAL) yscroll_s.grid(row=2, column=4, sticky="wns") listbox_s.configure(yscrollcommand=yscroll_s.set) listbox_s.bind('', lambda _:self.get_list_s(listbox_s,entry_s)) listbox_s.insert(0,"") yscroll_b = tk.Scrollbar(command=listbox_b.yview, orient=tk.VERTICAL) yscroll_b.grid(row=2, column=9, sticky="wns") listbox_b.configure(yscrollcommand=yscroll_b.set) listbox_b.bind('', lambda _:self.get_list_b(listbox_b,entry_b)) listbox_b.insert(0,"") def check_in (self,s_txt,promptVar,listbox_s,listbox_b): snum = s_txt.get() if len(snum)<=12: select_error = tk.Toplevel() select_error.title("Select Error") label_error = tk.Label(select_error,text="Please select a student!") label_error.grid(column=0,row=0) close = tk.Button(select_error, text="Close", command=select_error.destroy) close.grid(column=0,row=1) close.focus_set() return snum = int(snum[:9]) chkoutstr = (student_list[snum].s_name + " has checked in " + book_list[student_list[snum].s_book].b_name, ".") promptVar.set(chkoutstr) bnum = student_list[snum].s_book print(bnum) b_con = tk.StringVar() b_con.set(book_list[bnum].b_con) b_info = tk.Toplevel() b_info.title("Check in") label_con = tk.Label(b_info,text="Book Condition:") label_con.grid (column=0, row=0, sticky="w") b_con = tk.StringVar() b_con.set(book_list[bnum].b_con) entry_con = tk.Entry(b_info,textvariable=b_con) entry_con.grid (column =1, row=0,sticky="w") entry_con.focus_set() entry_con.select_range(0,tk.END) but_update = tk.Button (b_info, text= "Update Condition", command=lambda:book_list[bnum].update_con(b_con.get())) but_update.grid (column=2, row=0) but_close = tk.Button (b_info, text="Close", command=b_info.destroy) but_close.grid(column=2,row=1) query.chkin(snum) libmain.update (listbox_s,listbox_b) def check_out (self,s_txt,b_txt,promptVar,listbox_s,listbox_b): snum = s_txt.get() bnum = b_txt.get() if len(snum)<=12 or len(bnum)<=7: select_error = tk.Toplevel() select_error.title("Select Error") label_error = tk.Label(select_error,text="Please select a student and book!") label_error.grid(column=0,row=0) close = tk.Button(select_error, text="Close", command=select_error.destroy) close.grid(column=0,row=1) close.focus_set() return snum = int(snum[:9]) if student_list[snum].s_book!=None: select_error = tk.Toplevel() select_error.title("Student has a Book") label_error = tk.Label(select_error,text="Student already has a book!") label_error.grid(column=0,row=0) close = tk.Button(select_error, text="Close", command=select_error.destroy) close.grid(column=0,row=1) close.focus_set() return bnum = int(bnum[:5]) if book_list[bnum].b_who_checked!=None: select_error = tk.Toplevel() select_error.title("Checked Out") label_error = tk.Label(select_error,text="This Book has been Checked Out") label_error.grid(column=0,row=0) close = tk.Button(select_error, text="Close", command=select_error.destroy) close.grid(column=0,row=1) close.focus_set() return query.chkout(snum,bnum) chkoutstr = (student_list[snum].s_name + " has checked out " + book_list[bnum].b_name, ".") promptVar.set(chkoutstr) libmain.update (listbox_s,listbox_b) def get_list_s(event,listbox_s,entry_s): """ function to read the listbox selection and put the result in an entry widget """ # get selected line index s_num_active = listbox_s.curselection()[0] # get the line's text seltext = listbox_s.get(s_num_active) # delete previous text in enter1 entry_s.delete(0, tk.END) # now display the selected text entry_s.insert(0, seltext) def get_list_b(event,listbox_b,entry_b): """ function to read the listbox selection and put the result in an entry widget """ # get selected line index b_num_active = listbox_b.curselection()[0] # get the line's text seltext = listbox_b.get(b_num_active) # delete previous text in enter1 entry_b.delete(0, tk.END) # now display the selected text entry_b.insert(0, seltext) def update(listbox_s,listbox_b): listbox_s.delete(0,listbox_s.size()) listbox_b.delete(0,listbox_b.size()) for snum in student_list: if student_list[snum].s_book == None: name = (str(student_list[snum].s_num) +": "+student_list[snum].s_name) listbox_s.insert(tk.END, name) else: name = (str(student_list[snum].s_num) +": "+student_list[snum].s_name +" is currently reading: " +book_list[student_list[snum].s_book].b_name +" - Due Date: " +str(book_list[student_list[snum].s_book].b_duedate)) listbox_s.insert(tk.END, name) for bnum in book_list: if book_list[bnum].b_who_checked == None: name = (str(book_list[bnum].b_num)+": "+book_list[bnum].b_name) listbox_b.insert(tk.END, name) else: if book_list[bnum].b_duedate < datetime.date.today(): name = (str(book_list[bnum].b_num)+": "+book_list[bnum].b_name+" is checked out by " +student_list[book_list[bnum].b_who_checked].s_name + " and is overdue since: " +str(book_list[bnum].b_duedate)) else: name = (str(book_list[bnum].b_num)+": "+book_list[bnum].b_name+" is checked out by " +student_list[book_list[bnum].b_who_checked].s_name + " - Due Date: " +str(book_list[bnum].b_duedate)) listbox_b.insert(tk.END, name) def s_getinfo (self, s_txt): snum = s_txt.get() if len(snum)<=12: select_error = tk.Toplevel() select_error.title("Select Error") label_error = tk.Label(select_error,text="Please select a student!") label_error.grid(column=0,row=0) close = tk.Button(select_error, text="Close", command=select_error.destroy) close.grid(column=0,row=1) close.focus_set() return snum = int(snum[:9]) stu_info = tk.Toplevel() stu_info.title("Student Info") label_name = tk.Label(stu_info,text="Student name:") label_name.grid (column=0, row=0,sticky="w") s_name=student_list[snum].s_name print(s_name) label_s_name = tk.Label(stu_info, text=s_name) label_s_name.grid (column = 1, row = 0,sticky="w") label_num = tk.Label(stu_info,text="Student number:") label_num.grid (column=0, row=1, sticky="w") s_num=student_list[snum].s_num label_s_num = tk.Label(stu_info, text=s_num) label_s_num.grid (column = 1, row = 1, sticky="w") label_cls = tk.Label(stu_info,text="Class:") label_cls.grid (column=0, row=2, sticky="w") s_cls=student_list[snum].s_cls label_s_cls = tk.Label(stu_info, text=s_cls) label_s_cls.grid (column = 1, row = 2, sticky="w") label_cls = tk.Label(stu_info,text="Reading List:") label_cls.grid (column=0, row=3, sticky="w") listbox_booklist = tk.Listbox(stu_info) listbox_booklist.grid(row=3, column=1, sticky="we") for book in student_list[snum].s_readinglist: listbox_booklist.insert(0,book) if student_list[snum].s_book!=None: label_bname = tk.Label(stu_info,text=student_list[snum].s_name + " is reading:") label_bname.grid (column=0, row=4, sticky="w") b_name=book_list[student_list[snum].s_book].b_name label_b_due = tk.Label(stu_info, text=b_name) label_b_due.grid (column = 1, row = 4, sticky="w") label_due = tk.Label(stu_info,text="Book is due:") label_due.grid (column=0, row=5, sticky="w") b_due=book_list[student_list[snum].s_book].b_duedate label_b_due = tk.Label(stu_info, text=b_due) label_b_due.grid (column = 1, row = 5, sticky="w") but_close = tk.Button (stu_info, text="Close", command=stu_info.destroy) but_close.grid(column=2,row=6) def b_getinfo (self, b_txt): bnum = b_txt.get() if len(bnum)<=7: select_error = tk.Toplevel() select_error.title("Select Error") label_error = tk.Label(select_error,text="Please select a book!") label_error.grid(column=0,row=0) close = tk.Button(select_error, text="Close", command=select_error.destroy) close.grid(column=0,row=1) close.focus_set() return bnum = int(bnum[:5]) b_info = tk.Toplevel() b_info.title("Student Info") label_name = tk.Label(b_info,text="Book name:") label_name.grid (column=0, row=0,sticky="w") b_name=book_list[bnum].b_name label_b_name = tk.Label(b_info, text=b_name) label_b_name.grid (column = 1, row = 0,sticky="w") label_num = tk.Label(b_info,text="Book number:") label_num.grid (column=0, row=1, sticky="w") b_num=book_list[bnum].b_num label_b_num = tk.Label(b_info, text=b_num) label_b_num.grid (column = 1, row = 1, sticky="w") label_level = tk.Label(b_info,text="Book Level:") label_level.grid (column=0, row=2, sticky="w") b_level=book_list[bnum].b_level label_b_level = tk.Label(b_info, text=b_level) label_b_level.grid (column = 1, row = 2, sticky="w") label_con = tk.Label(b_info,text="Book Condition:") label_con.grid (column=0, row=3, sticky="w") b_con = tk.StringVar() b_con.set(book_list[bnum].b_con) entry_con = tk.Entry(b_info,textvariable=b_con) entry_con.grid (column =1, row=3,sticky="w") but_update = tk.Button (b_info, text= "Update Condition", command=lambda:book_list[bnum].update_con(b_con.get())) but_update.grid (column=2, row=3) if book_list[bnum].b_duedate != None: if book_list[bnum].b_duedate < datetime.date.today(): label_due = tk.Label(b_info,text="Book is overdue since:") label_due.grid (column=0, row=4, sticky="w") b_due=book_list[bnum].b_duedate label_b_due = tk.Label(b_info, text=b_due) label_b_due.grid (column = 1, row = 4, sticky="w") else: label_due = tk.Label(b_info,text="Book is due:") label_due.grid (column=0, row=4, sticky="w") b_due=book_list[bnum].b_duedate label_b_due = tk.Label(b_info, text=b_due) label_b_due.grid (column = 1, row = 4, sticky="w") label_s = tk.Label(b_info,text="Book is checked out by:") label_s.grid (column=0, row=5, sticky="w") b_s=student_list[book_list[bnum].b_who_checked].s_name label_b_s = tk.Label(b_info, text=b_s) label_b_s.grid (column = 1, row = 5, sticky="w") but_close = tk.Button (b_info, text="Close", command=b_info.destroy) but_close.grid(column=2,row=6) def add_s_win (self,listbox_s,listbox_b): add_stu = tk.Toplevel() add_stu.title("Add a Student") label_name = tk.Label(add_stu,text="Student name:") label_name.grid (column=0, row=0,sticky="w") s_name=tk.StringVar() ent_s_name = tk.Entry(add_stu, textvariable=s_name,width=60) ent_s_name.grid (column = 1, row = 0) ent_s_name.focus_set() label_num = tk.Label(add_stu,text="Student number:") label_num.grid (column=0, row=1, sticky="w") s_num=tk.StringVar() ent_s_num = tk.Entry(add_stu, textvariable=s_num,width=60) ent_s_num.grid (column = 1, row = 1, sticky="w") label_cls = tk.Label(add_stu,text="Class:") label_cls.grid (column=0, row=2, sticky="w") s_cls=tk.StringVar() ent_s_cls = tk.Entry(add_stu, textvariable=s_cls,width=60) ent_s_cls.grid (column = 1, row = 2, sticky="w") but_add_s = tk.Button (add_stu, text="Add Student",command=lambda:query.add_s(add_stu,s_name.get(),s_num.get(),s_cls.get(),listbox_s,listbox_b)) but_add_s.grid(column=2,row=3) def add_bk_win (self,listbox_s,listbox_b): add_bk = tk.Toplevel() add_bk.title("Add a Book") label_name = tk.Label(add_bk,text="Book name:") label_name.grid (column=0, row=0,sticky="w") b_name=tk.StringVar() ent_b_name = tk.Entry(add_bk, textvariable=b_name,width=60) ent_b_name.grid (column = 1, row = 0) ent_b_name.focus_set() label_author = tk.Label(add_bk,text="Book Author:") label_author.grid (column=0, row=1, sticky="w") b_author=tk.StringVar() ent_b_author = tk.Entry(add_bk, textvariable=b_author,width=60) ent_b_author.grid (column = 1, row = 1, sticky="w") label_num = tk.Label(add_bk,text="Book number:") label_num.grid (column=0, row=2, sticky="w") b_num=tk.StringVar() ent_b_num = tk.Entry(add_bk, textvariable=b_num,width=60) ent_b_num.grid (column = 1, row = 2, sticky="w") label_cls = tk.Label(add_bk,text="Book Level:") label_cls.grid (column=0, row=3, sticky="w") b_cls=tk.StringVar() ent_b_cls = tk.Entry(add_bk, textvariable=b_cls,width=60) ent_b_cls.grid (column = 1, row = 3, sticky="w") label_con = tk.Label(add_bk,text="Book Condition:") label_con.grid (column=0, row=4, sticky="w") b_con=tk.StringVar() ent_b_con = tk.Entry(add_bk, textvariable=b_con,width=60) ent_b_con.grid (column = 1, row = 4, sticky="w") but_add_b = tk.Button (add_bk, text="Add Book",command=lambda:query.add_b(add_bk,b_name.get(),b_author.get(),b_num.get(),b_cls.get(),b_con.get(),listbox_s,listbox_b)) but_add_b.grid(column=2,row=5) def s_key (self,s_txt,listbox_s,listbox_b): libmain.update (listbox_s,listbox_b) string = s_txt.get() del_i =[123456] for i, entry in enumerate(listbox_s.get(0,tk.END)): seltext = str(entry) print("hi") if seltext.find(string) == -1: del_i.insert(0,i) print(seltext, string,i) for i in del_i: print(i) if i != 123456: listbox_s.delete(i) def s_cls (self, listbox_s,listbox_b): cls = tk.Toplevel() cls.title("Class Sort") cls_lb = tk.Label(cls,text="Enter class code (All for all students):") cls_lb.grid(column=0,row=0) clscode=tk.StringVar() ent_cls = tk.Entry(cls, textvariable=clscode,width=60) ent_cls.grid (column = 0, row = 1, sticky="w") ent_cls.focus_set() but_close = tk.Button (cls, text="Search",command=lambda:self.cls_sort(cls,listbox_s,listbox_b,ent_cls.get())) but_close.grid(column=0,row=2) def cls_sort (self,cls, listbox_s,listbox_b, clscode): listbox_s.delete(0,listbox_s.size()) if clscode == "All": libmain.update(listbox_s,listbox_b) else: for snum in student_list: if student_list[snum].s_book == None and student_list[snum].s_cls == clscode: name = (str(student_list[snum].s_num) +": "+student_list[snum].s_name) listbox_s.insert(tk.END, name) elif student_list[snum].s_cls == clscode: name = (str(student_list[snum].s_num) +": "+student_list[snum].s_name +" is currently reading: " +book_list[student_list[snum].s_book].b_name +" - Due Date: " +str(book_list[student_list[snum].s_book].b_duedate)) listbox_s.insert(tk.END, name) cls.destroy() def b_lvl (self, listbox_s,listbox_b): lvl = tk.Toplevel() lvl.title("Level Sort") lvl_lb = tk.Label(lvl,text="Enter book level (All for all books):") lvl_lb.grid(column=0,row=0) lvlcode=tk.StringVar() ent_lvl = tk.Entry(lvl, textvariable=lvlcode,width=60) ent_lvl.grid (column = 0, row = 1, sticky="w") ent_cls.focus_set() but_close = tk.Button (lvl, text="Search",command=lambda:self.lvl_sort(lvl,listbox_s,listbox_b,lvlcode.get())) but_close.grid(column=0,row=2) def lvl_sort (self,lvl, listbox_s,listbox_b, lvlcode): listbox_b.delete(0,listbox_b.size()) if lvlcode == "All": libmain.update(listbox_s,listbox_b) else: for bnum in book_list: print(lvlcode, book_list[bnum].b_level == lvlcode,book_list[bnum].b_name) if book_list[bnum].b_who_checked == None and book_list[bnum].b_level == lvlcode: name = (str(book_list[bnum].b_num)+": "+book_list[bnum].b_name) listbox_b.insert(tk.END, name) elif book_list[bnum].b_who_checked != None: print("hi") if book_list[bnum].b_duedate < datetime.date.today() and book_list[bnum].b_level == lvlcode: name = (str(book_list[bnum].b_num)+": "+book_list[bnum].b_name+" is checked out by " +student_list[book_list[bnum].b_who_checked].s_name + " and is overdue since: " +str(book_list[bnum].b_duedate)) listbox_b.insert(tk.END, name) elif book_list[bnum].b_level == lvlcode: name = (str(book_list[bnum].b_num)+": "+book_list[bnum].b_name+" is checked out by " +student_list[book_list[bnum].b_who_checked].s_name + " - Due Date: " +str(book_list[bnum].b_duedate)) listbox_b.insert(tk.END, name) lvl.destroy() def b_key (self,b_txt,listbox_s,listbox_b): libmain.update (listbox_s,listbox_b) string = b_txt.get() del_i =[123456] for i, entry in enumerate(listbox_b.get(0,tk.END)): seltext = str(entry) print("hi") if seltext.find(string) == -1: del_i.insert(0,i) print(seltext, string,i) for i in del_i: print(i) if i != 123456: listbox_b.delete(i) class query(): def add_s(add_stu,s_name,s_num,s_cls,listbox_s,listbox_b): if s_name == "" or s_cls == "": short = tk.Toplevel() short.title("Missing Fields!") label_error = tk.Label(short,text="Fill in all the fields!") label_error.grid(column=0,row=0) close = tk.Button(short, text="Close", command=short.destroy) close.grid(column=0,row=1) close.focus_set() return if len(s_num) != 9: short = tk.Toplevel() short.title("Student Number size error") label_error = tk.Label(short,text="Student Number must 9 digits!") label_error.grid(column=0,row=0) close = tk.Button(short, text="Close", command=short.destroy) close.grid(column=0,row=1) close.focus_set() return try: s_num = int(s_num) except (TypeError, ValueError) as e: value_error = tk.Toplevel() value_error.title("Value Error - Add Student") label_error = tk.Label(value_error,text="Student Number must be a number!") label_error.grid(column=0,row=0) close = tk.Button(value_error, text="Close", command=value_error.destroy) close.grid(column=0,row=1) close.focus_set() return for num in student_list.keys(): if s_num == student_list[num].s_num: value_error = tk.Toplevel() value_error.title("Student Number Already in use!") label_error = tk.Label(value_error,text="That student number is already in use!") label_error.grid(column=0,row=0) close = tk.Button(value_error, text="Close", command=value_error.destroy) close.grid(column=0,row=1) close.focus_set() return print(s_name,s_num,s_cls) add_student(s_num, s_name, s_cls) libmain.update(listbox_s,listbox_b) add_stu.destroy() def add_b(add_bk,b_name,b_author,b_num,b_cls,b_con,listbox_s,listbox_b): if b_name == "" or b_author == "" or b_cls == "" or b_con == "": short = tk.Toplevel() short.title("Missing Fields!") label_error = tk.Label(short,text="Fill in all the fields!") label_error.grid(column=0,row=0) close = tk.Button(short, text="Close", command=short.destroy) close.grid(column=0,row=1) close.focus_set() return if len(b_num) != 5: short = tk.Toplevel() short.title("Book Number size error") label_error = tk.Label(short,text="Book Number must 5 digits!") label_error.grid(column=0,row=0) close = tk.Button(short, text="Close", command=short.destroy) close.grid(column=0,row=1) close.focus_set() return try: b_num = int(b_num) except (TypeError, ValueError) as e: value_error = tk.Toplevel() value_error.title("Value Error - Add Book") label_error = tk.Label(value_error,text="Book Number must be a number!") label_error.grid(column=0,row=0) close = tk.Button(value_error, text="Close", command=value_error.destroy) close.grid(column=0,row=1) close.focus_set() return for num in book_list.keys(): if b_num == book_list[num].b_num: value_error = tk.Toplevel() value_error.title("Book Number Already in use!") label_error = tk.Label(value_error,text="That book number is already in use!") label_error.grid(column=0,row=0) close = tk.Button(value_error, text="Close", command=value_error.destroy) close.grid(column=0,row=1) close.focus_set() return add_book(b_name,b_num,b_author,b_cls,b_con) libmain.update(listbox_s,listbox_b) add_bk.destroy() def stu(): f = open('studentlist.txt', 'w') for num in student_list.keys(): if student_list[num].s_book != None: print(student_list[num].s_num, ": ", student_list[num].s_name," - ", student_list[num].s_cls," is reading ", book_list[student_list[num].s_book].b_name, student_list[num].s_name, " has read the following this year:\n", student_list[num].s_readinglist, file = f) else: print(student_list[num].s_num, ": ", student_list[num].s_name," - ", student_list[num].s_cls, "has read the following this year:\n", student_list[num].s_readinglist, file = f) f.close() def book(): f = open ('booklist.txt', 'w') for num, name in book_list.items(): if book_list[num].b_who_checked != None and book_list[num].b_overdue == False: print (num, ": ", book_list[num].b_name, " was in ", "It is currently checked out by ", student_list[book_list[num].b_who_checked].s_name, " and is due on ", book_list[num].b_duedate, file = f) elif book_list[num].b_who_checked != None and book_list[num].b_overdue == True: print (num, ": ", book_list[num].b_name, " was in ", "It is currently checked out by ", book_list[num].b_who_checked, " and was due on ", book_list[num].b_duedate, file = f) else: print (num, ": ", book_list[num].b_name, " is in the library.", file = f) def who(): snum = int(input ("What student (number)?")) print (student_list) ok = check(snum,"s") if ok == False: print ("Invalid student number!") return student_list[snum].whoami() def chkout(snum,bnum): student_list[snum].check_out(bnum) book_list[bnum].check_out(snum) def chkin(snum): book_list[student_list[snum].s_book].check_in() student_list[snum].check_in() def save(promptVariable): f = open('studentdict.pickle', 'wb') pickle.dump(student_list, f) f = open('bookdict.pickle', 'wb') pickle.dump(book_list, f) fp = ("backup/sdbu" + time.strftime("%Y%m%d-%H%M%S")+".pickle") f = open(fp, 'wb+') pickle.dump(student_list, f) fp = ("backup/bdbu" + time.strftime("%Y%m%d-%H%M%S")+".pickle") f = open(fp, 'wb+') pickle.dump(book_list, f) promptVariable.set("Save Successful") print (student_list) print (book_list) def load(listbox_s,listbox_b,promptVar): global student_list global book_list f = open('studentdict.pickle', 'rb') student_list = pickle.load(f) f = open('bookdict.pickle', 'rb') book_list = pickle.load(f) promptVar.set("Load Successful") libmain.update(listbox_s,listbox_b) def add_student(num, name, cls): student_list[num] = name student_list[num] = student(num, name, cls) def add_book (name, num, author, level,con): book_list[num] = name book_list[num] = book(num,name,author, level,con) def check (in_num, kind): if kind == "s": for num in student_list.keys(): if in_num == num: return True return False elif kind == "b": for num in book_list.keys(): if in_num == num: return True return False app = libmain(None) app.mainloop()