class ShowDataWindow(Toplevel): def __init__(self, parent, **kw): Toplevel.__init__(self, parent, **kw) self.parent = parent self.title("Bảng thống kê mặt hàng") self.geometry("600x400") self.data = Database() self.drawDialog() self.linkAccelerator() self.protocol("WM_DELETE_WINDOW", self.quitDialog) def linkAccelerator(self): self.bind_all("<Control-n>", self.onAddItem) self.bind_all("<Control-r>", self.onRefresh) def drawDialog(self): listItem = self.data.getItemList() self.table = Notebook(self) for item in listItem: self.onAddToTab(item) self.table.pack(side=LEFT, fill=BOTH, expand=True, padx=5, pady=5) def onAddToTab(self, item): treeType = TreeType(self.table, item, self) self.table.add(treeType, text=item.name) self.table.pack() def quitDialog(self): self.parent.linkAccelerator() self.destroy() def onRefresh(self, event=None): self.table.destroy() self.drawDialog() def onAddItem(self, event=None): if event != None: print("Ctrl+N") NewItemDialog(self)
class MainApplication(Tk): first_evaluating = True def __init__(self, *args, **kwargs): ''' Establace las configuraciones de la ventana principal ''' self.root = Tk() self.root.title("Sistema de Gestión de Alumnos") self.root.geometry("1010x585") self.root.resizable(0, 0) # Ejecuta la función de actualizar las tablas # cuando la ventana principal obtiene el foco self.root.bind("<FocusIn>", self.update_tablas) self.hay_cursos = False self.create_widgets() # Le otorga el foco a la ventana principal self.root.deiconify() # La mantiene en ejecución self.root.mainloop() def create_widgets(self): ''' Crea todos los componentes de la ventana principal ''' #### TABS #### tabController = Notebook(self.root) tabController.grid(column=0, row=0) self.frameInicio = Frame(tabController, padding=(10, 10)) tabController.add(self.frameInicio, text="Inicio") self.frameCursantes = Frame(tabController, padding=(10, 10)) tabController.add(self.frameCursantes, text="Alumnos") self.frameDocentes = Frame(tabController, padding=(10, 10)) tabController.add(self.frameDocentes, text="Docentes") self.frameCursos = Frame(tabController, padding=(10, 10)) tabController.add(self.frameCursos, text="Cursos") lbl_curso = Label(self.frameInicio, text="Seleccione el curso:", width=35) lbl_curso.grid(row=0, column=0, columnspan=35, padx=(400, 0)) self.id_curso = StringVar() self.cb_curso = Combobox(self.frameInicio, textvariable=self.id_curso, width=20, state="readonly") self.cb_curso.grid(row=1, column=0, columnspan=20, padx=(400, 0)) self.cb_curso.bind("<<ComboboxSelected>>", self.selection_changed) self.create_tab_alumnos() self.create_tab_cursos() self.create_tab_docentes() self.update_tablas() def create_tab_alumnos(self): #### TAB ALUMNOS #### formCreateCursante = FormCreateCursante() btn_nuevoCursante = Button(self.frameCursantes, text="[+] Nuevo estudiante", command=formCreateCursante.show) btn_nuevoCursante.grid(row=0, column=0, columnspan=30, pady=(5, 10)) tablaCursantesFrame = Frame(self.frameCursantes, relief="groove", padding=(5, 5)) tablaCursantesFrame.grid(row=1, column=0, columnspan=980) self.tablaCursantes = Tabla(tablaCursantesFrame, FormDetailsCursante()) def create_tab_docentes(self): #### TAB DOCENTES #### formCreateDocente = FormCreateDocente() btn_nuevoDocente = Button(self.frameDocentes, text="[+] Nuevo docente", command=formCreateDocente.show) btn_nuevoDocente.grid(row=0, column=0, columnspan=30, pady=(5, 10)) tablaDocentesFrame = Frame(self.frameDocentes, relief="groove", padding=(5, 5)) tablaDocentesFrame.grid(row=1, column=0, columnspan=980) self.tablaDocentes = Tabla(tablaDocentesFrame, FormDetailsDocente(), columns_width={ "dni": 15, "telefono": 15, "titulo": 30 }) def create_tab_cursos(self): #### TAB CURSOS #### formCreateCurso = FormCreateCurso() btn_nuevoCurso = Button(self.frameCursos, text="[+] Nuevo curso", command=formCreateCurso.show) btn_nuevoCurso.grid(row=0, column=0, columnspan=30, pady=(5, 10)) tablaCursosFrame = Frame(self.frameCursos, relief="groove", padding=(5, 5)) tablaCursosFrame.grid(row=1, column=0, columnspan=970) self.tablaCursos = Tabla(tablaCursosFrame, FormDetailsCurso(), columns_width={"nombre": 40}) def create_tab_inicio(self): #### TAB INICIO #### self.tabFrameCurso = Notebook(self.frameInicio) self.tabFrameCurso.grid(row=2, column=0, columnspan=970) frameInscriptos = Frame(self.tabFrameCurso, padding=(10, 10)) self.tabFrameCurso.add(frameInscriptos, text="Inscriptos") frameCurDoc = Frame(self.tabFrameCurso, padding=(10, 10)) self.tabFrameCurso.add(frameCurDoc, text="Docentes") frameAsiastencias = Frame(self.tabFrameCurso, padding=(10, 10)) self.tabFrameCurso.add(frameAsiastencias, text="Asistencias") self.formAddAlumno = FormInscriptos("add") self.formRemoveAlumno = FormInscriptos("remove") self.formRemoveAlumno.id_curso = self.id_curso.get() btn_add_cursante = Button( frameInscriptos, text="[+] Agregar", width=15, command=lambda: self.formAddAlumno.show(self.id_curso.get())) btn_add_cursante.grid(row=0, column=0, columnspan=15) btn_remove_cursante = Button( frameInscriptos, text="[-] Remover", width=15, command=lambda: self.formRemoveAlumno.show(self.id_curso.get())) btn_remove_cursante.grid(row=0, column=16, columnspan=15) frameTablaInscriptos = Frame(frameInscriptos, relief="groove", padding=(5, 5)) self.tablaInscriptos = Tabla(frameTablaInscriptos, self.formRemoveAlumno, btn=False, height=400) frameTablaInscriptos.grid(row=1, column=0, columnspan=150, pady=10) btn_certificate = Button(frameInscriptos, text="Generar certificados", width=25, command=lambda: self.generate_certificate()) btn_certificate.grid(row=0, column=126, columnspan=25) self.formAddDocente = FormDocentesCurso("add") self.formRemoveDocente = FormDocentesCurso("remove") self.formRemoveDocente.id_curso = self.id_curso.get() btn_add_doc = Button( frameCurDoc, text="[+] Agregar", width=15, command=lambda: self.formAddDocente.show(self.id_curso.get())) btn_add_doc.grid(row=0, column=0, columnspan=15) btn_remove_doc = Button( frameCurDoc, text="[-] Remover", width=15, command=lambda: self.formRemoveDocente.show(self.id_curso.get())) btn_remove_doc.grid(row=0, column=16, columnspan=15) frameTablaDocentesMiembro = Frame(frameCurDoc, relief="groove", padding=(5, 5)) self.tablaDocentesMiembro = Tabla(frameTablaDocentesMiembro, self.formRemoveDocente, btn=False, height=400) frameTablaDocentesMiembro.grid(row=1, column=0, columnspan=150, pady=10) self.formAsistencias = FormAsistencias() self.formAsistencias.id_curso = self.id_curso.get() btn_asistencia = Button( frameAsiastencias, text="Cargar asistencias", width=25, command=lambda: self.formAsistencias.show(self.id_curso.get())) btn_asistencia.grid(row=0, column=0, columnspan=25) frameTablaAsistencias = Frame(frameAsiastencias, relief="groove", padding=(5, 5)) self.tablaAsistencias = Tabla(frameTablaAsistencias, self.formAsistencias, btn=False, height=400) frameTablaAsistencias.grid(row=1, column=0, columnspan=150, pady=10) def selection_changed(self, *args): ''' Actualiza el ID del curso que se seleccionó en el combobox. ''' self.formRemoveDocente.id_curso = self.id_curso.get() self.formRemoveAlumno.id_curso = self.id_curso.get() self.formAsistencias.id_curso = self.id_curso.get() def update_tablas(self, *args): ''' Le indica a cada tabla que chequee si es necesario actualizar la información visual o que la actualice directamente dependiendo el caso ''' if Curso.modified or MainApplication.first_evaluating: MainApplication.first_evaluating = False values = [dict(item)["codigo"] for item in Curso.get_all()["data"]] self.cb_curso.config(values=(values if values else "--")) self.cb_curso.current( self.cb_curso.current() if self.cb_curso.current() > 0 else 0) if values: if not self.hay_cursos: self.hay_cursos = True self.create_tab_inicio() self.selection_changed() else: if self.hay_cursos: self.hay_cursos = False self.tabFrameCurso.destroy() self.tablaCursos.check_update() self.tablaCursantes.check_update() self.tablaDocentes.check_update() if self.hay_cursos: self.tablaDocentesMiembro.update_table() self.tablaInscriptos.update_table() self.tablaAsistencias.update_table() def generate_certificate(self): data = Curso.get_data_certificados(self.id_curso.get()) for inscripto in data["asistieron"]: info = { "name": inscripto["nombre"].upper(), "dni": inscripto["dni"], "teachers": data["docentes"].upper(), "course": data["curso"].upper(), "dates": data["fechas"] } generar_pdf(info) cant_asist = len(data["asistieron"]) mb.showinfo( "Información", f"Se generó correctamente el certificado\na los {cant_asist} que asistieron al curso." )