class GUI_Main: def __init__(self, master, roomList): master.title("Schedule Planner v0.1") self.placeholderEvent = Events() #Options Section self.frame_OptionMaster = Frame(master, height=100) self.frame_OptionMaster.pack(side="top", fill="both", expand=True) #Open file options self.frame_openFiles = Frame(self.frame_OptionMaster, width=200) self.buildOpenFilesFrame(self.frame_openFiles) #Add room outside of file self.frame_addRoom = Frame(self.frame_OptionMaster) self.buildAddRoomFrame(self.frame_addRoom) #Add Event(class) options outside of file self.frame_addEvent = Frame(self.frame_OptionMaster) self.buildAddEventFrame(self.frame_addEvent) #Search options self.frame_search = Frame(self.frame_OptionMaster) self.buildSearchFrame(self.frame_search) #Grid option frames self.frame_openFiles.grid(column=1, row=0) self.frame_addRoom.grid(column=2, row=0) self.frame_addEvent.grid(column=3, row=0) self.frame_search.grid(column=4, row=0) #Event information Section self.frame_EventInfo = Frame(master, height=100) self.frame_EventInfo.pack(side="bottom", fill="both", expand=True) self.buildEventInfoFrame(self.frame_EventInfo, self.placeholderEvent) #Data Display Section self.canvas_DataMaster = Canvas(master) self.canvas_DataMaster.pack(side="bottom", fill="both", expand=True) self.canvas_rooms = Canvas(self.canvas_DataMaster, height=50) self.frame_rooms = Frame(self.canvas_rooms) self.canvas_times = Canvas(self.canvas_DataMaster, width=55) self.frame_times = Frame(self.canvas_times) self.canvas_classes = Canvas(self.canvas_DataMaster) self.frame_classes = Canvas(self.canvas_classes) self.sbY = Scrollbar(self.canvas_DataMaster, command=self.adjustYview) self.sbX = Scrollbar(self.canvas_DataMaster, orient='horizontal', command=self.adjustXview) self.canvas_rooms.grid(row=0, column=1) self.canvas_times.grid(row=1, column=0) self.canvas_classes.grid(row=1, column=1) self.canvas_rooms.create_window((0, 0), window=self.frame_rooms, anchor="nw") self.canvas_times.create_window((0, 0), window=self.frame_times, anchor='nw') self.canvas_classes.create_window((0, 0), window=self.frame_classes, anchor='nw') self.sbY.grid(row=1, column=2, sticky="ns") self.sbX.grid(row=2, column=1, stick="ew") self.frame_classes.bind("<Configure>", self.function1) self.frame_times.bind("<Configure>", self.function1) self.frame_rooms.bind("<Configure>", self.function1) self.buildItems(roomList, 0, 0) def buildItems(self, roomList, startTime, endTime): #Cleans frame, incase there are items in it: for widget in self.frame_classes.winfo_children(): widget.destroy() for widget in self.frame_times.winfo_children(): widget.destroy() for widget in self.frame_rooms.winfo_children(): widget.destroy() sTime = 0 + startTime #starts at 0, max eTime eTime = 28 - endTime #starts at max of roomList timeslots, should be 28, min sTime #NO ERROR CHECKING, please do error checing before calling buildItems w = len(roomList * 170) if w > 1190: #adding a max w for large sets w = 1190 self.canvas_rooms.configure(width=w) self.canvas_classes.configure(width=w) self.font_HeaderItems = Font(family="Arial", size=15) self.font_DetailItems = Font(family="Verdana", size=10) self.gridWidth = 15 self.gridHeight = 2 i = 1 flag = 0 timeDisplay = 8.0 #start at 8 AM for item in roomList: print("item %d", i) self.label_room = Label(self.frame_rooms, text=item.getRoomName(), font=self.font_HeaderItems, width=self.gridWidth, height=self.gridHeight, bd=2, relief="groove") self.label_room.grid(row=0, column=i, sticky=W) i = i + 1 #time slots on left side for x in range(len(item.timeSlots)): if (flag == 0): if (timeDisplay < 1): timeDisplay = timeDisplay + 12 timeDisplayString = str(format(timeDisplay, ".2f")) timeDisplayString = timeDisplayString.replace(".", ":") self.label_time = Label(self.frame_times, text=timeDisplayString, font=self.font_HeaderItems, height=self.gridHeight * 2, bd=2, relief="groove") self.label_time.grid(row=x + 1, column=0, sticky="EW") timeDisplay = (timeDisplay + .3) if (round(timeDisplay) > timeDisplay): timeDisplay = round(timeDisplay) timeDisplay = (timeDisplay) % 12 flag = 1 #events in each room per time slot for time in range(len(item.timeSlots)): self.placeholderEvent = item.getEvent(time) self.text_header_label_event = self.placeholderEvent.getSubject( )[:10] + " " + self.placeholderEvent.getCourseNum( ) + "-" + self.placeholderEvent.getSection() self.text_details_label_event = " " if (self.placeholderEvent.getSubject() != " "): self.text_details_label_event = "Instructor: " + self.placeholderEvent.getInstructor( ) + "\nCapacity: " + str( self.placeholderEvent.getCapacity()) self.label_eventDetail = Label self.label_eventTitle = Label( self.frame_classes, text=self.text_header_label_event, font=self.font_HeaderItems, width=self.gridWidth, height=self.gridHeight, bd=2, relief="groove", pady=3) self.label_eventDetail = Label( self.frame_classes, text=self.text_details_label_event, font=self.font_DetailItems, width=self.gridWidth, height=self.gridHeight, bd=2, relief="groove", pady=3) self.label_eventTitle.grid(row=(time * 2) + 1, column=i, sticky=W) self.label_eventDetail.grid(row=(time * 2) + 2, column=i, sticky="EW") def function1(self, event): self.canvas_classes.configure( scrollregion=self.canvas_classes.bbox("all")) self.canvas_times.configure(scrollregion=self.canvas_times.bbox("all")) self.canvas_rooms.configure(scrollregion=self.canvas_rooms.bbox("all")) def adjustYview(self, *args): self.canvas_classes.yview(*args) self.canvas_times.yview(*args) def adjustXview(self, *args): self.canvas_classes.xview(*args) self.canvas_rooms.xview(*args) def buildOpenFilesFrame(self, master): # self.fb1Var = 0 # self.fb2Var = 0 self.fileName = " " self.fileType = IntVar() self.fileType.set(0) #0 for room list, 1 for class list self.button_selectFile = Button( master, text="Select File", command=lambda: fOp.selectFile(self, self.fileName)) self.label_fileType = Label(master, text="Select File Type:") self.rbutton_fileType1 = Radiobutton(master, text="Room List", variable=self.fileType, value=0) self.rbutton_fileType2 = Radiobutton(master, text="Class List", variable=self.fileType, value=1) self.button_addFile = Button( master, text="Add Selected File", command=lambda: fOp.addFile(self, self.fileName, self.fileType.get( ))) #fOp.addFile(self,self.fileName,self.fileType self.button_selectFile.grid(row=1) self.label_fileType.grid(row=2) self.rbutton_fileType1.grid(row=3) self.rbutton_fileType2.grid(row=4) self.button_addFile.grid(row=5) def buildAddRoomFrame(self, master): self.label_addRoom_title = Label(master, text="Add Room") self.label_addRoom_name = Label(master, text="Room Name: ") self.entry_addRoom_name = Entry(master) self.label_addRoom_number = Label(master, text="Room Number:") self.entry_addRoom_number = Entry(master) self.label_addRoom_capacity = Label(master, text="Capacity: ") self.entry_addRoom_capacity = Entry(master) #self.button_addRoom = Button(master,text="Add") #command to be added when file reading is complete self.button_addRoom = Button( master, text="Add", command=lambda: [ manualAdd.manualInputRoom(self.entry_addRoom_name, self. entry_addRoom_number, self. entry_addRoom_capacity), self.searchDB(self.entry_search_keyword, self.cb1Var, self. cb2Var, 0, 0) ]) #command to be added when file reading is complete self.label_addRoom_title.grid(row=1, columnspan=2) self.label_addRoom_name.grid(row=2, column=1) self.entry_addRoom_name.grid(row=2, column=2) self.label_addRoom_number.grid(row=3, column=1) self.entry_addRoom_number.grid(row=3, column=2) self.label_addRoom_capacity.grid(row=4, column=1) self.entry_addRoom_capacity.grid(row=4, column=2) self.button_addRoom.grid(row=5, columnspan=2) def buildAddEventFrame(self, master): self.label_addEvent_title = Label(master, text="Add Class") self.label_addEvent_subject = Label(master, text="Subject: ") self.entry_addEvent_subject = Entry(master) self.label_addEvent_courseNum = Label(master, text="Course Number: ") self.entry_addEvent_courseNum = Entry(master) self.label_addEvent_section = Label(master, text="Section Number: ") self.entry_addEvent_section = Entry(master) self.label_addEvent_instructor = Label(master, text="Instructor: ") self.entry_addEvent_instructor = Entry(master) self.label_addEvent_time = Label(master, text="Prefered time: ") self.entry_addEvent_time = Entry(master) self.label_addEvent_capacity = Label(master, text="Capacity: ") self.entry_addEvent_capacity = Entry(master) self.button_addEvent = Button( master, text="Add", command=lambda: [ manualAdd.manualInputEvent( self.entry_addEvent_subject, self.entry_addEvent_courseNum, self.entry_addEvent_time, self.entry_addEvent_section), self.searchDB(self.entry_search_keyword, self.cb1Var, self. cb2Var, 0, 0) ]) #command to be added when file reading is complete self.label_addEvent_title.grid(row=0) self.label_addEvent_subject.grid(row=1, column=0) self.entry_addEvent_subject.grid(row=1, column=1) self.label_addEvent_courseNum.grid(row=2, column=0) self.entry_addEvent_courseNum.grid(row=2, column=1) self.label_addEvent_section.grid(row=3, column=0) self.entry_addEvent_section.grid(row=3, column=1) self.label_addEvent_instructor.grid(row=4, column=0) self.entry_addEvent_instructor.grid(row=4, column=1) self.label_addEvent_time.grid(row=5, column=0) self.entry_addEvent_time.grid(row=5, column=1) self.label_addEvent_capacity.grid(row=6, column=0) self.entry_addEvent_capacity.grid(row=6, column=1) self.button_addEvent.grid(row=7, column=1, columnspan=2) def buildSearchFrame(self, master): self.cb1Var = IntVar() self.cb1Var.set(1) self.cb2Var = IntVar() self.label_search_title = Label(master, text="Search") self.label_search_keyword = Label(master, text="Keywords: ") self.entry_search_keyword = Entry(master) self.label_search_type = Label(master, text="Search catagories: ") self.checkbox_search_room = Checkbutton(master, text="Rooms", variable=self.cb1Var, onvalue=1, offvalue=0) self.checkbox_search_classes = Checkbutton(master, text="Classes", variable=self.cb2Var, onvalue=1, offvalue=0) self.button_search = Button( master, text="Search", command=lambda: self.searchDB(self.entry_search_keyword, self. cb1Var, self.cb2Var, 0, 0) ) #add command at later date self.label_search_title.grid(row=0) self.label_search_keyword.grid(row=1, column=0) self.entry_search_keyword.grid(row=1, column=1) self.label_search_type.grid(row=2, column=0) self.checkbox_search_room.grid(row=3, column=1) self.checkbox_search_classes.grid(row=4, column=1) self.button_search.grid(row=5, column=1) def searchDB(self, keywords, searchRooms, searchEvents, sTime, eTime): print("Testing Search: ", str(keywords.get())) roomList = gOp.searchDB(self, keywords, searchRooms, searchEvents) self.buildItems(roomList, sTime, eTime) def buildEventInfoFrame(self, master, displayEvent): for widget in master.winfo_children(): widget.destroy() self.label_eventInfo_courseName = Label( master, text="Course Name: " + displayEvent.getSubject() + " " + displayEvent.getCourseNum()) self.label_eventInfo_section = Label(master, text="Section: " + displayEvent.getSection()) self.label_eventInfo_instructor = Label(master, text="Instructor: " + displayEvent.getInstructor()) self.label_eventInfo_capacity = Label(master, text="Class Capacity" + str(displayEvent.getCapacity())) self.label_eventInfo_courseName.grid(row=0, column=0) self.label_eventInfo_section.grid(row=1, column=0) self.label_eventInfo_instructor.grid(row=2, column=0) self.label_eventInfo_capacity.grid(row=3, column=0)