def init_frm_doc_report(self): doctors_list = list(db().getConn().execute("Select email from private.users where role = 1;")) doctors_list = ft.reduce(operator.iconcat, doctors_list, []) doctor = ttk.Combobox(self.frm_doc_report, state="readonly", values=["Select Doctor"] + doctors_list) doctor.set('Select Doctor') doctor.place(relx=.075, rely=.1 + 11.5 / 16, anchor='nw', height=30, width=200) tk.Label(self.frm_doc_report, text='Start Date', anchor='w', width=10, relief='groove') \ .place(relx=.325, rely=.1 + 11.5 / 16, height=30) start_date = DateEntry(self.frm_doc_report, width=15, background='darkblue', year=2019, month=6, day=17, foreground='white', borderwidth=2, state='readonly') start_date.place(relx=.415, rely=.1 + 11.5 / 16, height=30) tk.Label(self.frm_doc_report, text='End Date', anchor='w', width=10, relief='groove') \ .place(relx=.325, rely=.1 + 12.5 / 16, height=30) end_date = DateEntry(self.frm_doc_report, width=15, background='darkblue', foreground='white', borderwidth=2, state='readonly') end_date.place(relx=.415, rely=.1 + 12.5 / 16, height=30) cols = ('Email', 'Name', 'Number of Visits', 'Date') listBox = ttk.Treeview(self.frm_doc_report, columns=cols, show='headings', selectmode='browse') # set column headings for col in cols: listBox.heading(col, text=col) listBox.column(col, minwidth=100, width=205, anchor=tk.CENTER) vsb = ttk.Scrollbar(self.frm_doc_report, orient="vertical", command=listBox.yview) vsb.place(relx=.925, rely=.05, height=500) listBox.configure(yscrollcommand=vsb.set) listBox.place(relx=.05, rely=.05, height=500, width=820) tk.Button(self.frm_doc_report, text='Generate', command=lambda: self.generate_doc_report(doctor.get(), start_date.get_date(), end_date.get_date(), listBox)) \ .place(relx=.6, rely=.1 + 11.3 / 16, anchor='nw', width=180, height=40) tk.Button(self.frm_doc_report, text='Clear', command=lambda: self.clear_table(listBox)) \ .place(relx=.6, rely=.1 + 12.3 / 16, anchor='nw', width=180, height=40)
def test_dateentry_init(self): widget = DateEntry(self.window, width=12, background='darkblue', foreground='white', borderwidth=2, justify='center', style='my.DateEntry') widget.pack() self.window.update() widget.destroy() widget = DateEntry(self.window, year=2012) widget.pack() self.window.update() widget.destroy() widget = DateEntry(self.window, year=2012, day=32) self.window.update() self.assertEqual(widget.get_date(), date.today())
def init_frm_patient_report(self): from tkcalendar import DateEntry tk.Label(self.frm_patient_report, text='Date', anchor='w', width=10, relief='groove') \ .place(relx=.075, rely=.1, height=30) date = DateEntry(self.frm_patient_report, width=16, background='darkblue', year=2020, month=1, day=2, foreground='white', borderwidth=2, state='readonly') date.place(relx=.160, rely=.1, height=30) tk.Label(self.frm_patient_report, text='Patients Average Waiting Time:', anchor='w', width=25, relief='groove') \ .place(relx=.075, rely=.1 + 8 / 16, height=40) avg_result = tk.Label(self.frm_patient_report, text=f'', anchor='w', width=25, relief='groove') avg_result.place(relx=.075, rely=.1 + 9 / 16, height=30) cols = ('ID', 'Name', 'Arrival Time', 'Start Time', 'Waiting Time') listBox = ttk.Treeview(self.frm_patient_report, columns=cols, show='headings', selectmode='browse') # set column headings for col in cols[:3]: listBox.heading(col, text=col) listBox.column(col, minwidth=50, width=70) for col in cols[3:]: listBox.heading(col, text=col) listBox.column(col, minwidth=50, width=145) vsb = ttk.Scrollbar(self.frm_patient_report, orient="vertical", command=listBox.yview) vsb.place(relx=.945, rely=.05, height=550) listBox.configure(yscrollcommand=vsb.set) listBox.place(relx=.32, rely=.05, height=550, width=590) tk.Button(self.frm_patient_report, text='Show', command=lambda: self.showWaitingTimes(listBox, avg_result, date.get_date())) \ .place(relx=.075, rely=.1 + 1 / 16, anchor='nw', width=200, height=40) tk.Button(self.frm_patient_report, text='Clear', command=lambda: self.clear_table(listBox)) \ .place(relx=.075, rely=.1 + 2 / 16, anchor='nw', width=200, height=40)
class RequestsPage(tk.Frame): def __init__(self, parent, controller, conn, **kwargs): tk.Frame.__init__(self, parent) self.controller = controller self.conn = conn self.controller.title('Майстерня "ПрацівничОк"') self.controller.iconphoto(False, tk.PhotoImage(file='spanner.png')) # Top frame for main label and icon top_frame = tk.Frame(self, borderwidth=10, bg='#9E9E9E') top_frame.pack(fill='x', side='top') #icon icon = tk.PhotoImage(file='spanner.png') icon_label = tk.Label(top_frame, image=icon, bg='#9E9E9E') icon_label.pack(side='left') icon_label.image = icon #main label heading_label = tk.Label(top_frame, text=' Запити', font=('dejavu sans mono', 40), pady=15, fg='#212121', bg='#9E9E9E') heading_label.pack(side="top") #label bellow main label selection_label = tk.Label(self, text='Оберіть запит та введіть дані:', font=('dejavu sans mono', 20), bg='#BDBDBD', fg='white', anchor='w') selection_label.pack(fill='x') #frame for requests requests_frame = tk.Frame(self, bg='#F5F5F5') requests_frame.pack(fill='both', expand=True) self.answer_message = tk.Message(requests_frame, width=600, font=('dejavu sans mono', 12), anchor='n', fg='#212121', bg='#F5F5F5') self.answer_message.grid(row=0, column=3, padx=10, pady=10, sticky='N', rowspan=20) req1_label = tk.Label( requests_frame, new_lbl_args, text= '1) Телефони та прізвища клієнтів, що замовили роботу, що коштує більше ніж X$' ) req1_label.grid(row=0, column=0, columnspan=2) self.req1_entry = tk.Entry(requests_frame) self.req1_entry.grid(row=1, column=0) req1_button = tk.Button(requests_frame, new_btn_args, command=self.proccess_req1) req1_button.grid(row=1, column=1, sticky='E') req2_label = tk.Label( requests_frame, new_lbl_args, text= '2) Коди та назви роботи, яку виконують майстри, винагорода яких менша за Х%' ) req2_label.grid(row=2, column=0, columnspan=2) self.req2_entry = tk.Entry(requests_frame) self.req2_entry.grid(row=3, column=0) req2_button = tk.Button(requests_frame, new_btn_args, command=self.proccess_req2) req2_button.grid(row=3, column=1, sticky='E') req3_label = tk.Label( requests_frame, new_lbl_args, text= '3) Коди та прізвища майстрів, що прийняли замовлення не раніше за день Х' ) req3_label.grid(row=4, column=0, columnspan=2) self.req3_entry = DateEntry(requests_frame, background='#7C4DFF', locale='uk', selectbackground='#7C4DFF') self.req3_entry.grid(row=5, column=0) req3_button = tk.Button(requests_frame, new_btn_args, command=self.proccess_req3) req3_button.grid(row=5, column=1, sticky='E') req4_label = tk.Label( requests_frame, new_lbl_args, text='4) Телефони та прізвища клієнтів, що замовили Х виробів') req4_label.grid(row=6, column=0, columnspan=2) self.req4_entry = tk.Entry(requests_frame) self.req4_entry.grid(row=7, column=0) req4_button = tk.Button(requests_frame, new_btn_args, command=self.proccess_req4) req4_button.grid(row=7, column=1, sticky='E') req5_label = tk.Label( requests_frame, new_lbl_args, text='5) Код та прізвище майстрів, що не виконують виріб Х') req5_label.grid(row=8, column=0, columnspan=2) self.req5_entry = ttk.Combobox(requests_frame, state='readonly') self.req5_entry.grid(row=9, column=0) req5_button = tk.Button(requests_frame, new_btn_args, command=self.proccess_req5) req5_button.grid(row=9, column=1, sticky='E') req6_label = tk.Label( requests_frame, new_lbl_args, text= '6) Код та прізвища майстрів, що виконують такі ж роботи, що й майстер Х' ) req6_label.grid(row=10, column=0, columnspan=2) self.req6_entry = ttk.Combobox(requests_frame, state='readonly') self.req6_entry.grid(row=11, column=0) req6_button = tk.Button(requests_frame, new_btn_args, command=self.proccess_req6) req6_button.grid(row=11, column=1, sticky='E') req7_label = tk.Label( requests_frame, new_lbl_args, text= '7) Телефони та прізвища клієнтів, що зробили замовлення раніше, за клієнта Х' ) req7_label.grid(row=12, column=0, columnspan=2) self.req7_entry = ttk.Combobox(requests_frame, state='readonly') self.req7_entry.grid(row=13, column=0) req7_button = tk.Button(requests_frame, new_btn_args, command=self.proccess_req7) req7_button.grid(row=13, column=1, sticky='E') req8_label = tk.Label( requests_frame, new_lbl_args, text='8) Код та назва роботи, що замовив тільки клієнт Х') req8_label.grid(row=14, column=0, columnspan=2) self.req8_entry = ttk.Combobox(requests_frame, state='readonly') self.req8_entry.grid(row=15, column=0) req8_button = tk.Button(requests_frame, new_btn_args, command=self.proccess_req8) req8_button.grid(row=15, column=1, sticky='E') #return to menu button back_button = tk.Button(requests_frame, button_args, command=lambda: self.return_clicked(), text='Повернутись до меню') back_button.grid(row=16, column=0, pady=20) def return_clicked(self): self.controller.show_frame('StartPage') self.clear_entries() self.clear_message() def clear_message(self): pass def clear_entries(self): self.req1_entry.delete(0, 'end') self.req2_entry.delete(0, 'end') self.req3_entry.set_date(datetime.datetime.now()) self.req4_entry.delete(0, 'end') self.req5_entry.set('') self.req6_entry.set('') self.req7_entry.set('') self.req8_entry.set('') def proccess_req8(self): x = re.findall( "\d+", self.req8_entry.get())[0] if self.req8_entry.get() else '' if not x: self.update_text('') return command = ''' SELECT p1.code, p1.work_name FROM pricelist AS p1 INNER JOIN order_details AS d2 ON p1.code = d2.work_code WHERE NOT EXISTS ( SELECT d1.work_code FROM order_details AS d1 INNER JOIN ( orders AS o1 INNER JOIN clients AS c1 ON o1.client_phone = c1.phone ) ON d1.order_code = o1.code WHERE p1.code = d1.work_code AND c1.phone != %s);''' self.proccess_query(x, command) def proccess_req7(self): x = re.findall( "\d+", self.req7_entry.get())[0] if self.req7_entry.get() else '' if not x: self.update_text('') return command = ''' SELECT c1.phone, c1.lastname FROM clients AS c1 INNER JOIN orders AS o1 ON c1.phone = o1.client_phone WHERE EXISTS ( SELECT 1 FROM clients AS c2 INNER JOIN orders AS o2 ON c2.phone = o2.client_phone WHERE c2.phone = %s AND o2.date > o1.date );''' self.proccess_query(x, command) def get_client_info(self): cur = self.conn.cursor() cur.execute('SELECT phone, lastname FROM clients;') res = cur.fetchall() cur.close() return tuple(res) def proccess_req6(self): x = re.findall( "\d+", self.req6_entry.get())[0] if self.req6_entry.get() else '' if not x: self.update_text('') return command = ''' SELECT m1.code, m1.lastname FROM masters AS m1 WHERE NOT EXISTS ( (SELECT DISTINCT d1.work_code FROM order_details AS d1 INNER JOIN masters AS m2 ON m2.code = d1.master_code WHERE m2.code = %s) EXCEPT ( SELECT DISTINCT d2.work_code FROM order_details AS d2 WHERE m1.code = d2.master_code) ); ''' self.proccess_query(x, command) def get_master_info(self): cur = self.conn.cursor() cur.execute('SELECT code, lastname FROM masters;') res = cur.fetchall() cur.close() return res def get_work_info(self): cur = self.conn.cursor() cur.execute('SELECT code, work_name FROM pricelist;') res = cur.fetchall() cur.close() return res def proccess_req5(self): x = re.findall( "\d+", self.req5_entry.get())[0] if self.req5_entry.get() else '' if not x: self.update_text('') return command = ''' SELECT m1.code, m1.lastname FROM masters AS m1 WHERE m1.code NOT IN ( SELECT m2.code FROM masters AS m2 INNER JOIN order_details AS d1 ON m2.code = d1.work_code WHERE d1.work_code = %s);''' self.proccess_query(x, command) def proccess_req4(self): x = self.req4_entry.get() if not x.isdigit(): self.update_text('') return command = ''' SELECT c1.phone, c1.lastname FROM clients AS c1 INNER JOIN ( orders AS o1 INNER JOIN order_details AS d1 ON o1.code = d1.order_code) ON c1.phone = o1.client_phone GROUP BY c1.phone HAVING COUNT(d1.work_code) = %s; ''' self.proccess_query(x, command) def proccess_req3(self): x = self.req3_entry.get_date() command = ''' SELECT DISTINCT masters.code, masters.lastname FROM masters INNER JOIN (order_details INNER JOIN orders ON order_details.order_code = orders.code ) ON masters.code = order_details.master_code WHERE orders.date >= %s''' self.proccess_query(x, command) def proccess_req2(self): x = self.req2_entry.get() if not x.isdigit(): self.update_text('') return command = ''' SELECT DISTINCT pricelist.code, pricelist.work_name FROM pricelist INNER JOIN ( order_details INNER JOIN masters ON order_details.master_code = masters.code ) ON pricelist.code = order_details.work_code WHERE masters.reward_percent < %s''' self.proccess_query(x, command) def proccess_req1(self): x = self.req1_entry.get() if not x.isdigit(): self.update_text('') return command = ''' SELECT DISTINCT clients.phone, clients.lastname FROM clients INNER JOIN ( orders INNER JOIN ( order_details INNER JOIN pricelist ON order_details.work_code = pricelist.code ) ON orders.code = order_details.order_code ) ON clients.phone = orders.client_phone WHERE pricelist.price > %s''' self.proccess_query(x, command) def proccess_query(self, x, command): cur = self.conn.cursor() cur.execute(command, [x]) res = cur.fetchall() cur.close() self.update_text(res) def update_text(self, info): if info == '': message = 'Неправильне введення' elif info == []: message = 'Порожній результат' else: message = '\n'.join([' '.join([str(j) for j in i]) for i in info]) self.answer_message.config(text=message) def update_data(self): self.req5_entry['values'] = self.get_work_info() self.req6_entry['values'] = self.get_master_info() self.req7_entry['values'] = self.get_client_info() self.req8_entry['values'] = self.get_client_info()
class NewPredictionWindow(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.grid_columnconfigure(0, weight=1) self.grid_columnconfigure(2, weight=1) label = tk.Label(self, text="New Prediction", font=LARGE_FONT) label.grid(column=0, columnspan=3, row=0, sticky=tk.N, pady=10) self.drawNameField(parent, controller) self.drawAvailableListBox(parent, controller) self.drawSelectedListBox(parent, controller) self.drawSpinBox(parent, controller) self.drawIntitialDateEntry(parent, controller) self.drawEndDateEntry(parent, controller) saveButton = tk.Button(self, text="Save Prediction", font=SMALL_FONT, command=lambda: controller.saveNewPrediction()) saveButton.grid(column=2, columnspan=10, row=7, sticky=tk.N, padx=10, pady=20) button1 = tk.Button(self, text="Back To Main Page", font=SMALL_FONT, command=lambda: controller.toHome()) button1.grid(column=0, columnspan=10, row=10, sticky=tk.S, padx=10, pady=20) #======================================= Draw Functions ======================================== def drawNameField(self, parent, controller): nameFieldLabel = tk.Label(self, text="Prediction Name", font=SMALL_FONT) nameFieldLabel.grid(column=0, row=1, sticky=tk.W, pady=10, padx=10) newName = tk.StringVar() self.nameField = tk.Entry( self, width=20, textvariable=newName, font=SMALL_FONT, ) self.nameField.grid(column=1, columnspan=2, row=1, padx=10, pady=10, sticky=tk.W) def drawAvailableListBox(self, parent, controller): availableStockLabel = tk.Label(self, text="Available Stocks", font=SMALL_FONT) availableStockLabel.grid(column=0, row=2, sticky=tk.S + tk.W, padx=10, pady=3) availableStocks = controller.getAvailableStockNames() scrollBarforAvailable = tk.Scrollbar(self) scrollBarforAvailable.grid(column=1, row=3, rowspan=2, padx=0, pady=3, sticky=tk.W) self.availableStockListBox = tk.Listbox( self, font=SMALL_FONT, height=6, yscrollcommand=scrollBarforAvailable.set) self.availableStockListBox.grid(column=0, row=3, rowspan=2, padx=0, pady=3) self.availableStockListBox.bind('<Double-Button-1>', self.selectStock) scrollBarforAvailable.config(command=self.availableStockListBox.yview) for S in availableStocks: self.availableStockListBox.insert(tk.END, S) def drawSelectedListBox(self, parent, controller): selectedStockLabel = tk.Label(self, text="Selected Stocks", font=SMALL_FONT) selectedStockLabel.grid(column=0, row=5, sticky=tk.S + tk.W, padx=10, pady=3) scrollBarforSelected = tk.Scrollbar(self) scrollBarforSelected.grid(column=1, row=6, rowspan=2, padx=0, pady=3, sticky=tk.W) self.selectedStockListBox = tk.Listbox( self, font=SMALL_FONT, height=4, yscrollcommand=scrollBarforSelected.set) self.selectedStockListBox.grid(column=0, row=6, rowspan=2, padx=0, pady=3) self.selectedStockListBox.bind('<Double-Button-1>', self.deselectStock) scrollBarforSelected.config(command=self.selectedStockListBox.yview) def drawSpinBox(self, parent, controller): spinBoxLabel = tk.Label(self, text="# Days to Analyze", font=SMALL_FONT) spinBoxLabel.grid(column=2, row=2, sticky=tk.E + tk.S, padx=10, pady=3) self.spinBox = ttk.Spinbox(self, width=10, from_=0, to=100) self.spinBox.grid(column=2, row=3, sticky=tk.E, padx=10, pady=3) def drawIntitialDateEntry(self, parent, controller): widgetRow = 8 widgetCol = 0 initialDateLabel = tk.Label(self, text="Initial Date", font=SMALL_FONT) initialDateLabel.grid(column=widgetCol, row=widgetRow, sticky=tk.S, padx=10, pady=3) self.initialDateEntry = DateEntry(self, width=10, borderwidth=2) self.initialDateEntry.grid(column=widgetCol, row=widgetRow + 1, padx=10, pady=3) def drawEndDateEntry(self, parent, controller): widgetRow = 8 widgetCol = 2 endDateLabel = tk.Label(self, text="End Date", font=SMALL_FONT) endDateLabel.grid(column=widgetCol, row=widgetRow, sticky=tk.S, padx=10, pady=3) self.endDateEntry = DateEntry(self, width=10, borderwidth=2) self.endDateEntry.grid(column=widgetCol, row=widgetRow + 1, padx=10, pady=3) #======================================= Frame Functions ======================================= def updateComboBox(self, controller): self.selectionBox['values'] = controller.getAvailableModels() def selectStock(self, event): try: index = self.availableStockListBox.curselection()[0] name = self.availableStockListBox.get(index) self.selectedStockListBox.insert(tk.END, name) self.availableStockListBox.delete(index) except: return def deselectStock(self, event): try: index = self.selectedStockListBox.curselection()[0] name = self.selectedStockListBox.get(index) self.availableStockListBox.insert(tk.END, name) self.selectedStockListBox.delete(index) except: return def getCurrentlySelectedStocks(self): return list(self.selectedStockListBox.get(0, tk.END)) def getStartDate(self): return self.initialDateEntry.get_date() def getEndDate(self): return self.endDateEntry.get_date() def getName(self): return self.nameField.get() def getPredictionWindow(self): return self.spinBox.get()
class App(tk.Frame): def __init__(self, master): super().__init__(master) self.master.title("Pilates Invoice Manager") tk.Label(text="Pick month of invoice (any day):").grid(row=0, column=0, sticky="E") # INITIATE DICTIONARY TO KEEP HOURS WORKED self.allentries = dict() self.cal = DateEntry(master, width=12, background='darkblue', foreground='white', borderwidth=2, date_pattern="dd/mm/yyyy") self.cal.set_date(dt.datetime.now()) self.cal.grid(row=0, column=1, sticky="W") tk.Label(text="Day rate in £ (ex: 30.00) :").grid(row=1, column=0, sticky="E") # GET WEEKDAY AND WEEKEND RATES self.default_rate = 30 self.default_rate_setter = tk.StringVar() self.default_rate_setter.set(str(self.default_rate)) self.weekendrate = tk.Entry(textvariable=self.default_rate_setter) self.weekendrate.grid(row=1, column=1, sticky="W") # self.weekendrate.bind('<Key-Return>', self.print_contents) # # DISPLAY CURRENT DATE # self.w = tk.Entry(master, fg="white", bg="black", font=("helvetica", 12)) # self.w.insert(0,f"{dt.datetime.now():%a, %b %d %Y}") # self.w.grid(row=2, column=1, sticky="E") # checkbox for weekend only display self.CheckVar1 = tk.IntVar() self.C1 = tk.Checkbutton(master, command=self.check_status, text="Display only Sundays", variable=self.CheckVar1, onvalue=1, offvalue=0) self.C1.grid(row=2, columnspan=2) # self.weekendmessage = tk.Label(text="All days will be displayed") # self.weekendmessage.grid(row=2, column=1, sticky="W") tk.Label(text="Enter number of hours worked: ").grid(row=3, columnspan=2) self.check_status() tk.Button(text="Save", command=self.savetotals).grid() tk.Button(text="Export to PDF", command=self.export_topdf).grid() # self.contents = tk.StringVar() # OPTIONS = ["egg", "bunny", "chicken"] # self.contents.set(OPTIONS[0]) # default value # self.w = tk.OptionMenu(master, self.contents, *OPTIONS) # self.w.pack() def export_topdf(self): # pd.DataFrame.from_dict(data=self.allentries, orient='index').to_csv('dict_file.csv', header=False) # save FPDF() class into a # variable pdf pdf = FPDF() # Add a page pdf.add_page() # set style and size of font # that you want in the pdf pdf.set_font("Arial", size=15) pdf.rect(5.0, 5.0, 200.0, 287.0) # create a cell pdf.cell(200, 10, txt="Eleni Theodoridou Pilates", ln=1, align='C') invoice_month = self.cal.get_date().strftime("%B") # add another cell pdf.cell(200, 10, txt=f"Invoice for {invoice_month} {self.cal.get_date().year}", ln=2, align='C') pdf.set_font("times", size=10) pdf.cell(75, 10, txt=f"Bill to:", border=0, ln=0, align='L') pdf.cell(75, 10, txt=f"Pepilates Limited", border=0, ln=1, align='L') pdf.cell(75, 10, txt=f"Date:", border=0, ln=0, align='L') pdf.cell(75, 10, txt=f"{dt.datetime.now():%d %b %Y}", border=0, ln=1, align='L') pdf.set_font("Arial", size=10) for day, entry in self.allentries.items(): if entry > 0: pdf.cell(100, 10, txt=f"{day}", border=1, ln=0, align='L') pdf.cell(50, 10, txt=f"£ {entry}", border=1, ln=1, align='L') monthly_total = sum(self.allentries.values()) pdf.cell(100, 10, txt=f"Monthly Total", border=1, ln=0, align='L') pdf.cell(50, 10, txt=f"£ {monthly_total}", border=1, ln=1, align='L') pdf.ln(5) pdf.cell(150, 10, txt=f"Please make payment to:", border=0, ln=1, align='L') pdf.cell(50, 10, txt=f"Account Name", border=0, ln=0, align='L') pdf.cell(50, 10, txt=f"Eleni Theodoridou", border=0, ln=1, align='L') pdf.cell(50, 10, txt=f"Bank", border=0, ln=0, align='L') pdf.cell(50, 10, txt=f"Lloyds Bank", border=0, ln=1, align='L') pdf.cell(50, 10, txt=f"Sort Code", border=0, ln=0, align='L') pdf.cell(50, 10, txt=f"30-94-21", border=0, ln=1, align='L') pdf.cell(50, 10, txt=f"Account No", border=0, ln=0, align='L') pdf.cell(50, 10, txt=f"32455260", border=0, ln=1, align='L') # save the pdf with name .pdf pdf.output(f"Invoice_{invoice_month}{self.cal.get_date().year}.pdf") def savetotals(self): self.default_rate = float(self.default_rate_setter.get()) self.allentries = dict( (day.cget("text"), float(entry.get()) * self.default_rate) if r.match(entry.get()) else (day.cget("text"), 0) for day, entry in alldays) self.monthly_total = sum(self.allentries.values()) print(self.monthly_total) def find_weekends(self, Sundayonly=False): year = self.cal.get_date().year month = self.cal.get_date().month first_day_of_month = dt.date(year, month, 1) first_saturday_of_month = first_day_of_month + dt.timedelta( days=5 - first_day_of_month.weekday()) first_sunday_of_month = first_saturday_of_month + dt.timedelta(days=1) if Sundayonly: while first_sunday_of_month.year == year and first_sunday_of_month.month == month: yield first_sunday_of_month first_sunday_of_month += dt.timedelta(days=7) else: while first_day_of_month.year == year and first_day_of_month.month == month: yield first_day_of_month first_day_of_month += dt.timedelta(days=1) def check_status(self): Sundayonly = bool(self.CheckVar1.get()) global alldays if not Sundayonly: alldays = [(tk.Label(text=f"{d}"), tk.Entry()) for d in self.find_weekends(Sundayonly=False)] row = 4 for label, entry in alldays: label.grid_remove() entry.grid_remove() label.grid(row=row, column=0, sticky="E") entry.grid(row=row, column=1, sticky="W") row += 1 elif Sundayonly: for label, entry in alldays: label.grid_remove() entry.grid_remove() alldays = [(tk.Label(text=f"{d}"), tk.Entry()) for d in self.find_weekends(Sundayonly=True)] row = 4 for label, entry in alldays: label.grid(row=row, column=0, sticky="E") entry.grid(row=row, column=1, sticky="W") row += 1 def print_contents(self, event): x = float(self.weekendrate.get().partition(" ")[0]) print("Hi. The current entry content and type are:", x, type(x))
class Calendar(Frame): def __init__(self, parent): Frame.__init__(self, parent, highlightbackground="black", highlightcolor="black", highlightthickness=2) self.day_name = StringVar() self.__calendar() def __calendar(self): self.calendar_title_label = Label(self, text="Fecha", anchor="center", relief="groove") self.calendar_title_label.grid(row=0, column=0, padx=(0, CELL_PADDING), pady=CELL_PADDING, ipadx=CELL_MARGIN, ipady=CELL_MARGIN, sticky=W + E + N + S) self.calendar_date_entry = DateEntry(self, width=5, justify="center", background='darkblue', foreground='white', borderwidth=0, day=datetime.now().day - 1, month=datetime.now().month, year=datetime.now().year, locale="es_ES", date_pattern="dd/mm/yyyy") self.calendar_date_entry.grid(row=1, column=0, padx=(0, CELL_PADDING), pady=CELL_PADDING, ipadx=CELL_MARGIN, ipady=CELL_MARGIN, sticky=W + E + N + S) self.calendar_date_entry.bind("<<DateEntrySelected>>", self.__print_name_day) self.calendar_title_label = Label(self, text="Día", anchor="center", relief="groove") self.calendar_title_label.grid(row=0, column=1, padx=(0, CELL_PADDING), pady=CELL_PADDING, ipadx=CELL_MARGIN, ipady=CELL_MARGIN, sticky=W + E + N + S) self.calendar_label = Label(self, anchor="center", textvariable=self.day_name, relief="groove") self.calendar_label.grid(row=1, column=1, padx=(0, CELL_PADDING), pady=CELL_PADDING, ipadx=CELL_MARGIN, ipady=CELL_MARGIN, sticky=W + E + N + S) def __print_name_day(self, event): w = event.widget date = w.get_date() locale.setlocale(locale.LC_TIME, 'es_ES.UTF-8') date_with_format = date.strftime("%A, %d de %B de %Y") # Para windows #date_with_format = date.strftime("%A, %-d de %B de %Y") # Para Linux self.day_name.set(date_with_format) def return_date(self): # Poner alguna condición para que no le devuelva esto si no hay nada en el campo del formato de la fecha. if self.day_name.get() == "": variable_return = "0" else: variable_return = self.calendar_date_entry.get_date().strftime("%d/%m/%Y") return variable_return def clear(self): self.day_name.set("")
class Window(Frame): inputs = {'RSD': [], '€': [], '$': [], 'CHF': []} def __init__(self, master=None): Frame.__init__(self, master) self.master = master root.password = None root.yesno = None self.render() def render(self): self.set_up_frames() self.render_headers() self.render_rsd() self.render_eur() self.render_usd() self.render_chf() self.render_treeview() self.render_buttons() def set_up_frames(self): tab_parent = ttk.Notebook(root) self.tab_1 = Frame(tab_parent) self.tab_1.grid(column=0, row=0, sticky="nsew") self.tab_2 = Frame(tab_parent) self.tab_2.grid(column=0, row=0, sticky="nsew") self.tab_2.rowconfigure(1, weight=1) self.tab_2.columnconfigure(0, weight=1) tab_parent.add(self.tab_1, text="Specifikacija") tab_parent.add(self.tab_2, text="Istorija") tab_parent.pack(expand=True, fill='both') # tab 1 self.frame_header_tab_1 = Frame(self.tab_1) self.frame_header_tab_1.grid(row=0, column=0, sticky="we", padx=10, pady=10) self.frame_header_tab_1.grid_columnconfigure(0, weight=1) frame_center_tab_1 = Frame(self.tab_1) frame_center_tab_1.grid(row=1, column=0, padx=10, pady=(0, 10)) frame_footer_tab_1 = Frame(self.tab_1) frame_footer_tab_1.grid(row=2, column=0, sticky="nsew", padx=10, pady=(0, 10)) frame_footer_tab_1.columnconfigure(0, weight=1) self.frame_rsd = Frame(frame_center_tab_1) self.frame_rsd.grid(row=0, column=0, sticky="nsew") self.frame_eur = Frame(frame_center_tab_1) self.frame_eur.grid(row=0, column=1, sticky="nsew") self.frame_usd = Frame(frame_center_tab_1) self.frame_usd.grid(row=0, column=2, sticky="nsew") self.frame_chf = Frame(frame_center_tab_1) self.frame_chf.grid(row=0, column=3, sticky="nsew") self.frame_menu_tab_1 = Frame(frame_footer_tab_1) self.frame_menu_tab_1.grid(row=0, column=1) # tab 2 self.frame_header_tab_2 = Frame(self.tab_2) self.frame_header_tab_2.grid(row=0, column=0, sticky="we", padx=10, pady=10) self.frame_header_tab_2.grid_columnconfigure(0, weight=1) self.frame_center_tab_2 = Frame(self.tab_2) self.frame_center_tab_2.grid(row=1, column=0, sticky="nsew", padx=10, pady=(0, 10)) self.frame_center_tab_2.rowconfigure(0, weight=1) self.frame_center_tab_2.columnconfigure(1, weight=1) frame_footer_tab_2 = Frame(self.tab_2) frame_footer_tab_2.grid(row=2, column=0, sticky="nsew", padx=10, pady=(0, 10)) frame_footer_tab_2.columnconfigure(0, weight=1) self.frame_menu_tab_2 = Frame(frame_footer_tab_2) self.frame_menu_tab_2.grid(row=0, column=1) def render_headers(self): # tab 1 self.title_label_tab_1 = Label(self.frame_header_tab_1, text="Specifikacija") self.title_label_tab_1.grid(row=0, column=0, sticky="we") self.calendar = DateEntry(self.frame_header_tab_1, width=12, background='darkblue', foreground='white', borderwidth=2) self.calendar.grid(row=0, column=1, sticky="e") # tab 2 self.title_label_tab_2 = Label(self.frame_header_tab_2, text="Izaberite period:") self.title_label_tab_2.grid(row=0, column=0) self.label_start_date = Label(self.frame_header_tab_2, text="Početni datum") self.label_start_date.grid(row=0, column=1, padx=(0, 2), sticky='e') self.history_calendar_start = DateEntry(self.frame_header_tab_2, width=12, background='darkblue', foreground='white', borderwidth=2) self.history_calendar_start.grid(row=0, column=2, sticky="e") self.label_end_date = Label(self.frame_header_tab_2, text="Završni datum") self.label_end_date.grid(row=0, column=3, padx=(8, 2), sticky='e') self.history_calendar_end = DateEntry(self.frame_header_tab_2, width=12, background='darkblue', foreground='white', borderwidth=2) self.history_calendar_end.grid(row=0, column=4, sticky="e") def render_rsd(self): for i in range(len(DENOMINATIONS_RSD)): label = Label(self.frame_rsd, text="{} RSD".format(DENOMINATIONS_RSD[i])) label.grid(row=i, column=0, padx=2, pady=2) entry = Entry(self.frame_rsd) entry.grid(row=i, column=1, padx=2, pady=2) self.inputs['RSD'].append((DENOMINATIONS_RSD[i], entry)) def render_eur(self): for i in range(len(DENOMINATIONS_EUR)): label = Label(self.frame_eur, text="{} €".format(DENOMINATIONS_EUR[i])) label.grid(row=i, column=0, padx=2, pady=2) entry = Entry(self.frame_eur) entry.grid(row=i, column=1, padx=2, pady=2) self.inputs['€'].append((DENOMINATIONS_EUR[i], entry)) def render_usd(self): for i in range(len(DENOMINATIONS_USD)): label = Label(self.frame_usd, text="$ {}".format(DENOMINATIONS_USD[i])) label.grid(row=i, column=0, padx=2, pady=2) entry = Entry(self.frame_usd) entry.grid(row=i, column=1, padx=2, pady=2) self.inputs['$'].append((DENOMINATIONS_USD[i], entry)) def render_chf(self): for i in range(len(DENOMINATIONS_CHF)): label = Label(self.frame_chf, text="{} CHF".format(DENOMINATIONS_CHF[i])) label.grid(row=i, column=0, padx=2, pady=2) entry = Entry(self.frame_chf) entry.grid(row=i, column=1, padx=2, pady=2) self.inputs['CHF'].append((DENOMINATIONS_CHF[i], entry)) def render_treeview(self): # left treeview self.treeview_frame_left = ttk.Labelframe( self.frame_center_tab_2, text="Specifikacija po danima") self.treeview_frame_left.grid(row=0, column=0, pady=(5, 0), padx=5, sticky="nsew") self.treeview_frame_left.rowconfigure(0, weight=1) self.treeview_left = ttk.Treeview(self.treeview_frame_left, selectmode='browse') self.treeview_left.grid(row=0, column=0, pady=5, padx=(5, 0), sticky="nsw") vertical_scrollbar_left = ttk.Scrollbar( self.treeview_frame_left, orient='vertical', command=self.treeview_left.yview) vertical_scrollbar_left.grid(row=0, column=1, pady=5, padx=(0, 5), sticky="nsw") self.treeview_left.configure( yscrollcommand=vertical_scrollbar_left.set) self.treeview_left['columns'] = ('1', '2', '3', '4') self.treeview_left['show'] = 'headings' self.treeview_left.column("1", width=110, anchor='c') self.treeview_left.column("2", width=110, anchor='se') self.treeview_left.column("3", width=110, anchor='se') self.treeview_left.column("4", width=110, anchor='se') self.treeview_left.heading("1", text="Datum") self.treeview_left.heading("2", text="Denominacija") self.treeview_left.heading("3", text="Količina") self.treeview_left.heading("4", text="Iznos") # right treeview self.treeview_frame_right = ttk.Labelframe( self.frame_center_tab_2, text="Specifikacija po denominaciji") self.treeview_frame_right.grid(row=0, column=1, pady=(5, 0), padx=5, sticky="nsew") self.treeview_frame_right.rowconfigure(0, weight=1) self.treeview_frame_right.columnconfigure(0, weight=1) self.treeview_right = ttk.Treeview(self.treeview_frame_right, selectmode='browse') self.treeview_right.grid(row=0, column=0, pady=5, padx=(5, 0), sticky="nsew") vertical_scrollbar_right = ttk.Scrollbar( self.treeview_frame_right, orient='vertical', command=self.treeview_right.yview) vertical_scrollbar_right.grid(row=0, column=1, pady=5, padx=(0, 5), sticky="nsw") self.treeview_right.configure( yscrollcommand=vertical_scrollbar_right.set) self.treeview_right['columns'] = ('1', '2', '3') self.treeview_right['show'] = 'headings' self.treeview_right.column("1", width=110, anchor='se') self.treeview_right.column("2", width=110, anchor='se') self.treeview_right.column("3", width=110, anchor='se') self.treeview_right.heading("1", text="Denominacija") self.treeview_right.heading("2", text="Količina") self.treeview_right.heading("3", text="Iznos") def render_buttons(self): # tab 1 button_get = Button(self.frame_menu_tab_1, command=self.get, text="Učitaj") button_get.grid(row=0, column=0, sticky="nse", padx=2, pady=2) button_save = Button(self.frame_menu_tab_1, command=self.save, text="Sačuvaj") button_save.grid(row=0, column=1, sticky="nse", padx=2, pady=2) button_print = Button(self.frame_menu_tab_1, command=self._print, text="Štampaj") button_print.grid(row=0, column=2, sticky="nse", padx=2, pady=2) # tab 2 button_get_history = Button(self.frame_menu_tab_2, command=self.get_history, text="Učitaj") button_get_history.grid(row=0, column=0, sticky='e', padx=2, pady=2) def clear_inputs(self): for k, v in self.inputs.items(): for label, _input in v: _input.delete(0, 'end') def prepare_values(self): error = False values = {} for k, v in self.inputs.items(): validated_denomination_values = [] for denomination, entry in v: quantity = entry.get() if quantity == '': quantity = 0 if self.validate_input(quantity): validated_denomination_values.append( (denomination, int(quantity))) values[k] = validated_denomination_values else: error = True if not error: date = self.calendar.get_date() date = date.strftime("%Y-%m-%d") calculated_vales = self.calculate(values) request = {'date': date, 'values': calculated_vales} return request else: tkMessageBox.showerror("Greška", "A-a, probaj opet") return False def validate_input(self, quantity): try: quantity = int(quantity) if not 0 <= quantity <= 9999: raise ValueError except ValueError: return False else: return True def calculate(self, values): response = {} for k, v in values.items(): response[k] = {} total = 0 calculated_denomination_values = [] for denomination, quantity in v: amount = denomination * quantity total += amount calculated_denomination_values.append( (denomination, quantity, amount)) response[k]['specification'] = calculated_denomination_values response[k]['total'] = total return response def get(self): date = self.calendar.get_date() date = date.strftime("%Y-%m-%d") data = Database().get(date) if data: for _id, date, currency, denomination, quantity, amount in data: for k, v in self.inputs.items(): if k == currency: for label, _input in v: if label == denomination: _input.delete(0, 'end') _input.insert(0, quantity) else: tkMessageBox.showinfo("Obaveštenje", "Nema podataka za izabrani datum") def get_history(self): start = self.history_calendar_start.get_date() start = start.strftime("%Y-%m-%d") end = self.history_calendar_end.get_date() end = end.strftime("%Y-%m-%d") data = Database().get_by_date_range(start, end) for _id, date, currency, denomination, quantity, amount in data: if currency != '$': self.treeview_left.insert( "", 'end', text="L1", values=(date, "{} {}".format(denomination, currency), quantity, "{} {}".format(amount, currency))) else: self.treeview_left.insert( "", 'end', text="L1", values=(date, "{} {}".format(currency, denomination), quantity, "{} {}".format(currency, amount))) self.calculate_total_for_time_period(data) def calculate_total_for_time_period(self, data): total = {} for _id, date, currency, denomination, quantity, amount in data: try: total[currency] except KeyError: total[currency] = {} try: total[currency][denomination] except KeyError: total[currency][denomination] = {'quantity': 0, 'amount': 0} total[currency][denomination]['quantity'] += quantity total[currency][denomination]['amount'] = total[currency][ denomination]['quantity'] * denomination for currency_key, currency_value in total.items(): currency_value = OrderedDict(sorted(currency_value.items())) for denomination_key, denomination_value in currency_value.items(): if currency_key != '$': self.treeview_right.insert( "", 'end', text="L1", values=("{} {}".format(denomination_key, currency_key), denomination_value['quantity'], "{} {}".format(denomination_value['amount'], currency_key))) else: self.treeview_right.insert( "", 'end', text="L1", values=("{} {}".format(currency_key, denomination_key), denomination_value['quantity'], "{} {}".format(currency_key, denomination_value['amount']))) def save(self, already_printed=False): request = self.prepare_values() if request: # checking if user is trying to update some older dates date = request['date'] today = datetime.now() today = today.date() yesterday = today - timedelta(days=1) selected_date = datetime.strptime(date, "%Y-%m-%d") selected_date = selected_date.date() check_if_already_exists = Database().check_if_already_exists( request) save = None if check_if_already_exists: if selected_date not in (today, yesterday): root.wait_window(PasswordDialog(master=root)) if root.password == 'metla12345': save = Database().write(request, update=True) else: tkMessageBox.showerror( "Greška", "Nemate privilegiju da menjate podatke za datume starije od jednog dana" ) else: save = Database().write(request, update=True) else: save = Database().write(request) if save: if not already_printed: root.wait_window( YesNoDialog( master=root, text="Da li želite da odštampate podatke?")) if root.yesno: self._print(already_saved=True) self.clear_inputs() def _print(self, already_saved=False): request = self.prepare_values() if request: _print = Print()._print(request) if not already_saved: root.wait_window( YesNoDialog(master=root, text="Da li želite da sačuvate podatke?")) if root.yesno: self.save(already_printed=True)
class Application(tk.Frame): def __init__(self, parent, *args, **kwargs): tk.Frame.__init__(self, parent, *args, **kwargs) self.parent = parent self.fileSelect = "" self.parent.title("Pronóstico de Ventas") self.menubar = tk.Menu(parent) self.filemenu = tk.Menu(self.menubar, tearoff=0) self.filemenu.add_command(label="Cargar data", command=self.selectFile) self.filemenu.add_separator() #self.filemenu.add_command(label = "Guardar reporte", command = self.saveReport) #self.filemenu.add_separator() #self.filemenu.add_command(label = "Guardar model", command = self.saveModel) #self.filemenu.add_separator() self.filemenu.add_command(label="Salir", command=root.quit) self.menubar.add_cascade(label="Dataset", menu=self.filemenu) self.editmenu = tk.Menu(self.menubar, tearoff=0) self.editmenu.add_command(label="Entrena Red Neuronal", command=self.entrenamiento) self.menubar.add_cascade(label="Entrenamiento", menu=self.editmenu) self.helpmenu = tk.Menu(self.menubar, tearoff=0) self.helpmenu.add_command(label="Acerca de") self.menubar.add_cascade(label="Ayuda", menu=self.helpmenu) self.parent.config(menu=self.menubar) self.text1 = StringVar() self.text1.set('Cargar archivo .csv') self.texto1 = ttk.Label(self.parent, textvariable=self.text1) self.texto1.grid(row=0) self.labelR = Label(self.parent, text="Ingrese rango de fechas: ") self.labelR.grid(row=1, column=0) self.cal1 = DateEntry(self.parent, dateformat=3, width=12, background='darkblue', foreground='white', borderwidth=4, year=2020, month=3, day=1) self.cal1.grid(row=2, column=0) #self.cal2 = DateEntry(self.parent,dateformat=3,width=12, background='darkblue',foreground='white', borderwidth=4,yeaar =2020,month=2,day=29) #self.cal2.grid(row=1, column=2) self.butInter = Button(self.parent, text="Pronóstico", command=self.graficar_predicciones) self.butInter.grid(row=2, column=1) ttk.Separator(self.parent, orient=HORIZONTAL).grid(row=1, column=3, columnspan=4, ipadx=250) self.lf = ttk.Labelframe(self.parent, text='Ventas') self.lf.grid(row=3, column=0, sticky='nwes', padx=3, pady=3) ''' t = np.arange(0.0,3.0,0.01) df = pd.DataFrame({'t':t, 's':((2*t/3)*np.pi+120)}) fig = Figure(figsize=(5,4), dpi=100) ax = fig.add_subplot(111) df.plot(x='t', y='s', ax=ax) self.canvas = FigureCanvasTkAgg(fig, master=lf) self.canvas.draw() self.canvas.get_tk_widget().grid(row=0, column=0) ''' def saveReport(self): if path.exists('report.png'): workbook = xlsxwriter.Workbook('reporte.xlsx') worksheet = workbook.add_worksheet() workbook.close() wb = openpyxl.load_workbook('reporte.xlsx') ws = wb.active img = openpyxl.drawing.image.Image('report.png') #img.anchor(ws.cell('A1')) ws.add_image(img) wb.save('reporte.xlsx') def saveModel(self): print("GUARDADO") def graficar_predicciones(self): #fig = Figure(figsize=(5,4), dpi=100) ''' fig = plt.figure(figsize=(6, 5)) plt.plot(real[0:len(prediccion)],color='red', label='Valor real') plt.plot(prediccion, color='blue', label='Predicción') plt.ylim(1.1 * np.min(prediccion)/2, 1.1 * np.max(prediccion)) plt.xlabel('Tiempo') plt.ylabel('Ingresos') plt.legend() plt.savefig("report.png", dpi = 150) #plt.show() canvas = FigureCanvasTkAgg(fig, master=self.lf) canvas.draw() canvas.get_tk_widget().grid(row=2, column=2) ''' ##INTERPRETACION for widget in self.lf.winfo_children(): widget.destroy() PASOS = 7 fechaIni = str(self.cal1.get_date() - datetime.timedelta(days=15)) fechaFin = str(self.cal1.get_date() - datetime.timedelta(days=1)) #fechaFin = str(self.cal2.get_date()) print(fechaFin) print(fechaIni) self.df = pd.read_csv('temp.csv', parse_dates=[0], header=None, index_col=0, names=['fecha', 'unidades']) self.df['weekday'] = [x.weekday() for x in self.df.index] self.df['month'] = [x.month for x in self.df.index] ultimosDias = self.df[fechaIni:fechaFin] print("ULTIMOS DIAS") print(ultimosDias) values = ultimosDias['unidades'].values values = values.astype('float32') scaler = MinMaxScaler(feature_range=(-1, 1)) values = values.reshape(-1, 1) scaled = scaler.fit_transform(values) reframed = self.series_to_supervised(scaled, PASOS, 1) reframed.reset_index(inplace=True, drop=True) contador = 0 reframed['weekday'] = ultimosDias['weekday'] reframed['month'] = ultimosDias['month'] for i in range(reframed.index[0], reframed.index[-1]): reframed['weekday'].loc[contador] = ultimosDias['weekday'][i + 8] reframed['month'].loc[contador] = ultimosDias['month'][i + 8] contador = contador + 1 reframed.head() reordenado = reframed[[ 'weekday', 'month', 'var1(t-7)', 'var1(t-6)', 'var1(t-5)', 'var1(t-4)', 'var1(t-3)', 'var1(t-2)', 'var1(t-1)' ]] reordenado.dropna(inplace=True) values = reordenado.values x_test = values[5:, :] x_test = x_test.reshape((x_test.shape[0], 1, x_test.shape[1])) ultDiaSemana = reordenado.weekday[len(reordenado) - 1] def agregarNuevoValor(x_test, nuevoValor, ultDiaSemana): for i in range(x_test.shape[2] - 3): x_test[0][0][i + 2] = x_test[0][0][i + 3] ultDiaSemana = ultDiaSemana + 1 if ultDiaSemana > 6: ultDiaSemana = 0 x_test[0][0][0] = ultDiaSemana x_test[0][0][1] = 12 x_test[0][0][x_test.shape[2] - 1] = nuevoValor return x_test, ultDiaSemana results = [] if not path.exists("model.h5"): print("No existe el modelo pre-entrenado") return False self.model = load_model('model.h5') for i in range(7): dia = np.array([x_test[0][0][0]]) mes = np.array([x_test[0][0][1]]) valores = np.array([x_test[0][0][2:9]]) parcial = self.model.predict([dia, mes, valores]) results.append(parcial[0]) print('pred', i, x_test) x_test, ultDiaSemana = agregarNuevoValor(x_test, parcial[0], ultDiaSemana) adimen = [x for x in results] inverted = scaler.inverse_transform(adimen) #inverted prediccionProxSemana = pd.DataFrame(inverted) prediccionProxSemana.columns = ['pronostico'] prediccionProxSemana.plot() prediccionProxSemana.to_csv('pronostico.csv') predicciones = prediccionProxSemana.to_numpy() y_values = [] for i in range(len(predicciones)): y_values.append(predicciones[i][0]) x_values = [] for i in range(len(predicciones)): x_values.append( datetime.datetime.strptime( str(self.cal1.get_date() + datetime.timedelta(days=i)), "%Y-%m-%d").date()) fig = plt.figure(figsize=(5, 5)) dates = matplotlib.dates.date2num(x_values) matplotlib.pyplot.plot_date(dates, y_values) plt.plot(x_values, y_values) plt.gcf().autofmt_xdate() plt.title('Predicción de la semana') print(prediccionProxSemana) canvas = FigureCanvasTkAgg(fig, master=self.lf) canvas.draw() canvas.get_tk_widget().grid(row=3, column=0) def selectFile(self): fname = askopenfilename(filetypes=(("Archivo Dataset", "*.csv"), ("Todos los archivos", "*.*"))) if fname: try: self.text1.set(fname) self.fileSelect = fname except: print("") def series_to_supervised(self, data, n_in=1, n_out=1, dropnan=True): n_vars = 1 if type(data) is list else data.shape[1] df = pd.DataFrame(data) cols, names = list(), list() # input sequence (t-n, ... t-1) for i in range(n_in, 0, -1): cols.append(df.shift(i)) names += [('var%d(t-%d)' % (j + 1, i)) for j in range(n_vars)] # forecast sequence (t, t+1, ... t+n) for i in range(0, n_out): cols.append(df.shift(-i)) if i == 0: names += [('var%d(t)' % (j + 1)) for j in range(n_vars)] else: names += [('var%d(t+%d)' % (j + 1, i)) for j in range(n_vars)] # put it all together agg = pd.concat(cols, axis=1) agg.columns = names # drop rows with NaN values if dropnan: agg.dropna(inplace=True) return agg ''' def crear_modeloFF(self): PASOS=7 model = Sequential() model.add(Dense(PASOS, input_shape=(1,PASOS),activation='tanh')) model.add(Flatten()) model.add(Dense(1, activation='tanh')) model.compile(loss='mean_absolute_error',optimizer='Adam',metrics=["mse"]) model.summary() return model ''' def agregarNuevoValor(self, x_test, nuevoValor): for i in range(x_test.shape[2] - 3): x_test[0][0][i + 2] = x_test[0][0][i + 3] ultDiaSemana = ultDiaSemana + 1 if ultDiaSemana > 6: ultDiaSemana = 0 x_test[0][0][0] = ultDiaSemana x_test[0][0][1] = 12 x_test[0][0][x_test.shape[2] - 1] = nuevoValor return x_test, ultDiaSemana def crear_modeloEmbeddings(self): PASOS = 7 emb_dias = 2 emb_meses = 4 in_dias = Input(shape=[1], name='dias') emb_dias = Embedding(7 + 1, emb_dias)(in_dias) in_meses = Input(shape=[1], name='meses') emb_meses = Embedding(12 + 1, emb_meses)(in_meses) in_cli = Input(shape=[PASOS], name='cli') fe = concatenate([(emb_dias), (emb_meses)]) x = Flatten()(fe) x = Dense(PASOS, activation='tanh')(x) outp = Dense(1, activation='tanh')(x) model = Model(inputs=[in_dias, in_meses, in_cli], outputs=outp) model.compile(loss='mean_absolute_error', optimizer='adam', metrics=['MSE']) model.summary() return model def entrenamiento(self): if "csv" in self.fileSelect: ''' dias = (pd.to_datetime(fechaFin) - pd.to_datetime(fechaIni)).days diasValidos = int(20*dias/100) finValido = datetime.datetime.strptime(fechaFin, '%Y-%m-%d') inicioValido = finValido - timedelta(days=diasValidos) inicioEntrenamiento = datetime.datetime.strptime(fechaIni, '%Y-%m-%d') finEntrenamiento = inicioValido - timedelta(days=1) ''' self.df = pd.read_csv(self.fileSelect, parse_dates=[0], header=None, index_col=0, names=['fecha', 'unidades']) copyfile(self.fileSelect, './temp.csv') self.df.head() self.df['weekday'] = [x.weekday() for x in self.df.index] self.df['month'] = [x.month for x in self.df.index] self.df.head() self.df.describe() print(self.df.head()) PASOS = 7 values = self.df['unidades'].values values = values.astype('float32') scaler = MinMaxScaler(feature_range=(-1, 1)) values = values.reshape(-1, 1) scaled = scaler.fit_transform(values) reframed = self.series_to_supervised(scaled, PASOS, 1) reframed.reset_index(inplace=True, drop=True) contador = 0 reframed['weekday'] = self.df['weekday'] reframed['month'] = self.df['month'] for i in range(reframed.index[0], reframed.index[-1]): reframed['weekday'].loc[contador] = self.df['weekday'][i + 8] reframed['month'].loc[contador] = self.df['month'][i + 8] contador = contador + 1 reframed.head() reordenado = reframed[[ 'weekday', 'month', 'var1(t-7)', 'var1(t-6)', 'var1(t-5)', 'var1(t-4)', 'var1(t-3)', 'var1(t-2)', 'var1(t-1)', 'var1(t)' ]] reordenado.dropna(inplace=True) training_data = reordenado.drop('var1(t)', axis=1) #.values target_data = reordenado['var1(t)'] #training_data.head() valid_data = training_data[len(values) - 30:len(values)] valid_target = target_data[len(values) - 30:len(values)] training_data = training_data[0:len(values) - 30] target_data = target_data[0:len(values) - 30] print(training_data.shape, target_data.shape, valid_data.shape, valid_target.shape) EPOCHS = 5000 self.model = self.crear_modeloEmbeddings() #print(model.layers[0].get_weights()[0]) print(str("<---------------------------------->")) for i in range(len(self.model.layers)): print((self.model.layers[i]).get_weights()) print("********************") print(str("<---------------------------------->")) continuas = training_data[[ 'var1(t-7)', 'var1(t-6)', 'var1(t-5)', 'var1(t-4)', 'var1(t-3)', 'var1(t-2)', 'var1(t-1)' ]] valid_continuas = valid_data[[ 'var1(t-7)', 'var1(t-6)', 'var1(t-5)', 'var1(t-4)', 'var1(t-3)', 'var1(t-2)', 'var1(t-1)' ]] print("DATAAAAAAAAAAAAAAAAAA") print(training_data['weekday']) history = self.model.fit( [training_data['weekday'], training_data['month'], continuas], target_data, epochs=EPOCHS, validation_data=([ valid_data['weekday'], valid_data['month'], valid_continuas ], valid_target)) print(str("<---------------------------------->")) for i in range(len(self.model.layers)): print((self.model.layers[i]).get_weights()) print("********************") print(str("<---------------------------------->")) self.model.save('model.h5') #plot_model(self.model, "multi_input_and_output_model.png", show_shapes=True) ''' plt.scatter(range(len(y_val)),y_val,c='g') plt.scatter(range(len(results)),results,c='r') plt.title('validate') plt.show() plt.plot(history.history['loss']) plt.title('loss') plt.plot(history.history['val_loss']) plt.title('validate loss') plt.show() ''' results = self.model.predict( [valid_data['weekday'], valid_data['month'], valid_continuas]) ''' plt.scatter(range(len(valid_target)),valid_target,c='g') plt.scatter(range(len(results)),results,c='r') plt.title('validate') ''' #plt.show() fig = plt.figure(figsize=(6, 5)) plt.plot(history.history['loss'], label='loss') plt.title('loss') plt.plot(history.history['val_loss'], label='val loss') plt.title('validate loss') plt.legend(loc='best') #plt.show() canvas = FigureCanvasTkAgg(fig, master=self.lf) canvas.draw() canvas.get_tk_widget().grid(row=3, column=1) ''' plt.title('Accuracy') plt.plot(history.history['mean_squared_error']) plt.show() ''' print("VALIDATE ") compara = pd.DataFrame( np.array([valid_target, [x[0] for x in results]])).transpose() compara.columns = ['real', 'prediccion'] inverted = scaler.inverse_transform(compara.values) compara2 = pd.DataFrame(inverted) compara2.columns = ['real', 'prediccion'] compara2['diferencia'] = compara2['real'] - compara2['prediccion'] print(compara2['real']) x_vals = [] x_vals = self.df.index[len(values) - 30:len(values)].to_numpy() x_values = [] for x in x_vals: x_values.append( str( datetime.datetime.strptime( str(x)[:10], '%Y-%m-%d').strftime('%d-%m-%Y'))) print(x_values) fig = plt.figure(figsize=(6, 5)) compara2['real'].plot() #plt.plot(x_values, compara2['real'][0]) compara2['prediccion'].plot() #plt.plot(x_values, compara2['prediccion'][0]) canvas = FigureCanvasTkAgg(fig, master=self.lf) canvas.draw() canvas.get_tk_widget().grid(row=3, column=2) '''
class DateDialog(tk.Toplevel): def __init__(self, parent, controller): tk.Toplevel.__init__(self, parent) self.title("Änderung via Datum") self.resizable(0,0) self.controller = controller self.return_value = None self.date = datetime.datetime.now() tk.Label(self, text="Datum auswählen:").pack(side=tk.TOP, pady=8) values_frame = tk.Frame(self) values_frame.pack(pady=4) self.calendar = DateEntry( values_frame, year=self.date.year, month=self.date.month, day=self.date.day, locale="de_DE", ) self.calendar.bind("<<DateEntrySelected>>", self.set_new_date) self.calendar.pack(pady=6) self.labels = { "Stunde" : None, "Minute" : None, "Sekunde" : None } for label in self.labels: frame = tk.Frame(values_frame) frame.pack(side=tk.LEFT, padx=2) tk.Label(frame, text=label).pack(side=tk.LEFT) if label == "Stunde": self.labels[label] = tk.Spinbox(frame, from_=0, to=23, width=5) else: self.labels[label] = tk.Spinbox(frame, from_=0, to=60, width=5) self.labels[label].pack(side=tk.RIGHT, padx=2) button_frame = tk.Frame(self) button_frame.pack(side=tk.BOTTOM, pady=6) self.ok_button = tk.Button(button_frame, text="OK", width=10, command=self.on_ok) self.cancle_button = tk.Button(button_frame, text="Abbrechen", width=10, command=self.on_cancle) self.ok_button.pack(side=tk.LEFT, padx=5) self.cancle_button.pack(side=tk.RIGHT, padx=5) def set_new_date(self, e): self.date = self.calendar.get_date() def on_ok(self, event=None): self.return_value = datetime.datetime( year=self.date.year, month=self.date.month, day=self.date.day, hour=int(self.labels["Stunde"].get()), minute=int(self.labels["Minute"].get()), second=int(self.labels["Sekunde"].get()) ) self.destroy() def on_cancle(self, event=None): self.destroy() def show(self): self.wm_deiconify() self.wait_window() return self.return_value
class placeOrder: """This class contains method and attributes of the system that allows user to rent a car""" def __init__(self, user): self.wn = tk.ThemedTk() self.wn.configure(bg="#6262ED") self.wn.title("Rent a car") self.wn.geometry("650x450+200+50") self.item_index = "" self.my_index = 1 self.user = user self.wn.get_themes() self.wn.set_theme('plastik') self.item = Admn.Admin() self.order = Orders.Order() #==========================Frame1==============================# self.frame1 = Frame(self.wn) self.frame1.place(x=10, y=10) self.frame1.configure(bg="#6262ED") self.lbl_add = Label(self.frame1, font=("Calibri", 14, "bold"), text="Address:", bg="#6262ED") self.lbl_add.grid(row=0, column=0) self.combo_tbl1 = ttk.Combobox(self.frame1, state='readonly', width=20) self.combo_tbl1.grid(row=0, column=1, padx=5) self.combo_tbl1['values'] = self.order.all_address() self.btn1 = Button(self.frame1, text='Search', font=('Calibri', 11, "bold"), fg="white", background='#6262ED', width=12, bd=1, command=self.search) self.btn1.grid(row=0, column=2, padx=10) #==========================Frame2==============================# self.frame2 = Frame(self.wn, bg="#6262ED") self.frame2.place(x=10, y=50) self.cars_tree = ttk.Treeview(self.frame2, columns=('Brand', 'Model', 'Price', 'Address')) self.cars_tree.grid(row=0, column=0) self.cars_tree['show'] = 'headings' self.cars_tree.column('Brand', width=150, anchor='center') self.cars_tree.column('Model', width=150, anchor='center') self.cars_tree.column('Price', width=150, anchor='center') self.cars_tree.column('Address', width=155, anchor='center') self.cars_tree.heading('Brand', text="Brand") self.cars_tree.heading('Model', text="Model") self.cars_tree.heading('Price', text="Price") self.cars_tree.heading('Address', text="Address") self.cars_tree.bind("<Double-1>", self.select_item) self.vsb = ttk.Scrollbar(self.frame2, orient="vertical", command=self.cars_tree.yview) self.vsb.place(x=591, y=2, height=225) self.cars_tree.configure(yscrollcommand=self.vsb.set) #==========================Frame3==============================# self.frame3 = Frame(self.wn, bg="#6262ED") self.frame3.place(x=10, y=300) self.lbl_brand = Label(self.frame3, font=("Calibri", 14, "bold"), text="Brand:", bg="#6262ED") self.lbl_brand.grid(row=0, column=0) self.lbl_model = Label(self.frame3, font=("Calibri", 14, "bold"), text="Model:", bg="#6262ED") self.lbl_model.grid(row=1, column=0) self.ent_cbrand = ttk.Entry(self.frame3, font=("Verdana", 12), state="readonly") self.ent_cbrand.grid(row=0, column=1, padx=10) self.ent_cmodel = ttk.Entry(self.frame3, font=("Verdana", 12), state="readonly") self.ent_cmodel.grid(row=1, column=1, padx=10) self.lbl_price = Label(self.frame3, font=("Calibri", 14, "bold"), text="Price:", bg="#6262ED") self.lbl_price.grid(row=2, column=0) self.ent_cprice = ttk.Entry(self.frame3, font=("Verdana", 12), state="readonly") self.ent_cprice.grid(row=2, column=1, padx=10) self.lbl_date = Label(self.frame3, font=("Calibri", 14, "bold"), text="Pick up Date:", bg="#6262ED") self.lbl_date.grid(row=0, column=3) self.cal = DateEntry(self.frame3, width=12, background='darkblue', foreground='white', borderwidth=2, state="readonly") self.cal.grid(row=0, column=4) self.lbl_days = Label(self.frame3, font=("Calibri", 14, "bold"), text="Days:", bg="#6262ED") self.lbl_days.grid(row=1, column=3) self.combo_tbl2 = ttk.Combobox(self.frame3, state='readonly', width=11) self.combo_tbl2.grid(row=1, column=4, padx=5) self.combo_tbl2['values'] = [ '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15' ] self.btn1 = Button(self.wn, text="Order", font=('Calibri', 11, "bold"), fg="white", background='#6262ED', borderwidth=0.5, width=15, command=self.submitOrder) self.btn1.place(x=260, y=400) self.show_menu() self.wn.mainloop() def search(self): key = self.combo_tbl1.get() items = self.order.searchBy_Add(key) self.cars_tree.delete(*self.cars_tree.get_children()) for i in items: self.cars_tree.insert("", "end", text=i[0], value=(i[1], i[2], i[3], i[4] + ', Nepal')) def select_item(self, event): self.ent_cbrand.configure(state="normal") self.ent_cmodel.configure(state="normal") self.ent_cprice.configure(state="normal") selected_item = self.cars_tree.selection()[0] self.item_index = self.cars_tree.item(selected_item, 'text') item_data = self.cars_tree.item(selected_item, 'values') self.ent_cbrand.delete(0, END) self.ent_cbrand.insert(0, item_data[0]) self.ent_cmodel.delete(0, END) self.ent_cmodel.insert(0, item_data[1]) self.ent_cprice.delete(0, END) self.ent_cprice.insert(0, item_data[2]) self.ent_cbrand.bind("<1>", self.entry_bind) self.ent_cmodel.bind("<1>", self.entry_bind) self.ent_cprice.bind("<1>", self.entry_bind) def entry_bind(self, event): self.ent_cbrand.configure(state="readonly") self.ent_cmodel.configure(state="readonly") self.ent_cprice.configure(state="readonly") def show_menu(self): my_menu = Menu(self.wn, bg="#6262ED") self.wn.config(menu=my_menu) file_menu = Menu(my_menu) my_menu.add_cascade(label="Menu", menu=file_menu) file_menu.add_cascade(label="Parking", command=self.openParking) file_menu.add_cascade(label="History", command=self.openHistory) file_menu.add_cascade(label="Log Out", command=self.logOut) def submitOrder(self): cid = self.cars_tree.item(self.cars_tree.selection()[0], 'text') date = self.cal.get_date() days = self.combo_tbl2.get() user = self.user[1] if self.order.add_order(cid, date, days, user): messagebox.showinfo("Ordered", "Order Placed") else: messagebox.showerror("Error", "Something went wrong") def openHistory(self): user = self.user self.wn.destroy() iv = userMenu.Transaction(user) def openParking(self): self.wn.destroy() iv = userParking.Parking(self.user) def logOut(self): ans = messagebox.askquestion("Log Out", "Are you sure you want to log out?") if ans == "yes": self.wn.destroy() import loginWn
class AgeCalculator(Frame): def __init__(self,root): Frame.__init__(self,root) Frame.configure(self,bg='#222') self.root = root self.root.title('Main Page') self.root.geometry('580x340') self.root.resizable(0,0) Label(text='Input',bg='#222',fg='#fff',font='montserrat 16').place(x=30,y=20) Label(text='Results',bg='#222',fg='#fff',font='montserrat 16').place(x=450,y=20)#280 self.main_frame = Frame(borderwidth=2,relief='ridge',width=220,height=245,bg='#fff') self.main_frame.place(x=20,y=60) self.result_frame = Frame(borderwidth=2,relief='ridge',width=300,height=245,bg='#fff') self.result_frame.place(x=260,y=60) Label(self.main_frame,text='Date of Birth:',bg='#fff',fg='teal',font='montserrat 12').place(x=50,y=20) self.dob_date = DateEntry(self.main_frame,width=12, background='teal', font='montserrat 12',foreground='white',borderwidth=5,justify='center') self.dob_date.place(x=30,y=50) Label(self.main_frame,text='Target Date:',bg='#fff',fg='teal',font='montserrat 12').place(x=50,y=90) self.target_date = DateEntry(self.main_frame,width=12, background='teal', font='montserrat 12',foreground='white',borderwidth=5,justify='center') self.target_date.place(x=30,y=120) Button(self.main_frame,text='Calculate',fg='#fff',bg='teal',width=13,bd=0, font='montserrat 14',command=self.calculate_it).place(x=27,y=160) self.results = Text(self.result_frame,fg='#fff',bg='#444',font='montserrat 18', width=18,height=7) self.results.place(x=3,y=3) # self.cal = DateEntry(font='candara 14') # self.cal.pack() # Button(text='test', command=self.test).pack() # self.results = Label() # def test(self): # self.results.config(text=self.cal.get_date()) # self.results.pack() def calculate_it(self): self.results.delete(1.0, END) dob_date = self.dob_date.get_date() target_date = self.target_date.get_date() splitted_dob = str(dob_date).split('-') splitted_target = str(target_date).split('-') a,b,c = int(splitted_dob[0]), int(splitted_dob[1]), int(splitted_dob[2]) x,y,z = int(splitted_target[0]), int(splitted_target[1]), int(splitted_target[2]) diff = datetime(x,y,z) - datetime(a,b,c) total_secs = int(diff.total_seconds()) minute = total_secs/60 hours = minute/60 days = hours/24 weeks = days/7 months = weeks/4 years = days/356.25 y = 'years' if years > 1 else 'year' mo = 'months' if months > 1 else 'month' w = 'weeks' if weeks > 1 else 'week' d = 'days' if days > 1 else 'day' h = 'hours' if hours > 1 else 'hour' mi = 'minutes' if minute > 1 else 'minute' se = 'seconds' if total_secs > 1 else 'second' self.results.insert(END, f' {round(years, 2)} {y}\n') self.results.insert(END, f' {round(months, 2)} {mo}\n') self.results.insert(END, f' {round(weeks, 2)} {w}\n') self.results.insert(END, f' {round(days, 2)} {d}\n') self.results.insert(END, f' {round(hours, 2)} {h}\n') self.results.insert(END, f' {round(minute, 2)} {mi}\n') self.results.insert(END, f' {total_secs} {se}\n')
class ForgotPassword: def __init__(self, root1): self.root = root1 self.root.title("Sign In Form") self.root.geometry("400x600+400+50") self.root.resizable(FALSE, FALSE) Label(self.root, bg="#D4F1F4").place(x=0, y=0, relwidth=1, relheight=1) # catch variables self.name = tkinter.StringVar() self.surname = StringVar() self.email = StringVar() self.contact = StringVar() self.checkbox = IntVar() # heading "User Details" Label(self.root, text="Enter Your Details", bg="#D4F1F4", fg="#000C66", font=("Goudy old style", 20, "bold", "underline")).place(x=80, y=10) # title: First Name Label(self.root, text="First Name", bg="#D4F1F4", fg="#000C66", font=("Goudy old style", 15, "bold")).place(x=30, y=60) # 1st name entry area Entry(self.root, bd=1, relief=GROOVE, textvariable=self.name, font=("", 15)).place(x=30, y=90, width=340, height=30) # title: Surname Label(self.root, text="Surname", bg="#D4F1F4", fg="#000C66", font=("Goudy old style", 15, "bold")).place(x=30, y=140) # surname entry area Entry(self.root, bd=1, relief=GROOVE, textvariable=self.surname, font=("", 15)).place(x=30, y=170, width=340, height=30) # title: "date of birth" with icon Label(self.root, text="Date of birth", bg="#D4F1F4", fg="#000C66", font=("Goudy old style", 15, "bold")).place(x=30, y=220) # dob entry area self.cal = DateEntry(self.root, bd=1, relief=GROOVE, font=("", 15), date_pattern='dd/MM/yyyy') self.cal.place(x=30, y=250, width=340, height=30) # title: "e-mail address" Label(self.root, text="e-mail address", bg="#D4F1F4", fg="#000C66", font=("Goudy old style", 15, "bold")).place(x=30, y=300) # e-mail address entry area Entry(self.root, bd=1, relief=GROOVE, textvariable=self.email, font=("", 15)).place(x=30, y=330, width=340, height=30) # title: "contact number" with icon Label(self.root, text="Contact Number", bg="#D4F1F4", fg="#000C66", font=("Goudy old style", 15, "bold")).place(x=30, y=380) # contact number entry area Entry(self.root, bd=1, relief=GROOVE, textvariable=self.contact, font=("", 15)).place(x=30, y=410, width=340, height=30) # check box Checkbutton(self.root, text="I am accepting all terms and condition.", offvalue=0, bg="#D4F1F4", fg="#000C66", variable=self.checkbox).place(x=30, y=450) # Action buttons # log in button Button(self.root, text="Register", bg="white", fg="#000C66", cursor="hand2", command=self.fg_pass, font=("Goudy old style", 13, "bold", "underline"), width=15).place(x=30, y=520) # cancel button Button(self.root, text="Cancel", bg="white", fg="#000C66", width=15, cursor="hand2", command=self.root.quit, font=("Goudy old style", 13, "bold", "underline")).place(x=210, y=520) def fg_pass(self): i = self.cal.get_date() if self.name.get() == "" or self.surname.get() == "" or self.email.get() == "" or self.contact.get() == "" or \ self.checkbox.get() == 0 or i.year == 2020: tkinter.messagebox.showwarning("Warning", "All fields are required", parent=self.root) else: user_n, passwd = nrg.reg_new(self.name.get(), self.surname.get(), i, self.email.get(), self.contact.get()) tkinter.messagebox.showinfo( "Registration Successful", f"Welcome, {self.name.get()}!\n Your Username is {user_n}" f"\n Your password is {passwd}", parent=self.root) self.root.quit()
class Toplevel1: def __init__(self, top=None): '''This class configures and populates the toplevel window. top is the toplevel containing window.''' _bgcolor = '#40e0d0' # X11 color: 'gray85' _fgcolor = '#000000' # X11 color: 'black' _compcolor = '#40e0d0' # X11 color: 'gray85' _ana1color = '#40e0d0' # X11 color: 'gray85' _ana2color = '#ececec' # Closest X11 color: 'gray92' self.style = ttk.Style() if sys.platform == "win32": self.style.theme_use('winnative') self.style.configure('.', background=_bgcolor) self.style.configure('.', foreground=_fgcolor) self.style.configure('.', font="TkDefaultFont") self.style.map('.', background=[ ('selected', _compcolor), ('active', _ana2color)]) self.db = DataBase() top.geometry("1300x760+20+20") top.minsize(800, 500) top.maxsize(1500, 750) top.resizable(0, 0) top.title("New Toplevel") top.configure(background="#78909C") top.configure(highlightbackground="#d9d9d9") top.configure(highlightcolor="black") self.Gid_10 = tk.Label(top) self.Gid_10.place(relx=0.427, rely=0.021, height=38, width=209) self.Gid_10.configure(activebackground="#f9f9f9") self.Gid_10.configure(activeforeground="black") self.Gid_10.configure(background="#d9d9d9") self.Gid_10.configure(disabledforeground="#a3a3a3") self.Gid_10.configure(font="-family {Segoe UI} -size 20 -weight bold") self.Gid_10.configure(foreground="#000000") self.Gid_10.configure(highlightbackground="#d9d9d9") self.Gid_10.configure(highlightcolor="black") self.Gid_10.configure(text='''ADD GOAT''') self.isBornOrBought = IntVar(None, 0) self.Rbtnborn = tk.Radiobutton(top, command=self.disableVaccination) self.Rbtnborn.place(relx=0.427, rely=0.095, relheight=0.034, relwidth=0.075) self.Rbtnborn.configure(activebackground="#ececec") self.Rbtnborn.configure(activeforeground="#000000") self.Rbtnborn.configure(background="#d9d9d9") self.Rbtnborn.configure(disabledforeground="#a3a3a3") self.Rbtnborn.configure(foreground="#000000") self.Rbtnborn.configure(highlightbackground="#d9d9d9") self.Rbtnborn.configure(highlightcolor="black") self.Rbtnborn.configure(justify='left') self.Rbtnborn.configure(text='''BORN''') self.Rbtnborn.configure(value=0) self.Rbtnborn.configure(variable=self.isBornOrBought) self.Rbtnbought = tk.Radiobutton(top, command=self.disableMotherId) self.Rbtnbought.place(relx=0.513, rely=0.095, relheight=0.034, relwidth=0.075) self.Rbtnbought.configure(activebackground="#ececec") self.Rbtnbought.configure(activeforeground="#000000") self.Rbtnbought.configure(background="#d9d9d9") self.Rbtnbought.configure(disabledforeground="#a3a3a3") self.Rbtnbought.configure(foreground="#000000") self.Rbtnbought.configure(highlightbackground="#d9d9d9") self.Rbtnbought.configure(highlightcolor="black") self.Rbtnbought.configure(justify='left') self.Rbtnbought.configure(text='''BOUGHT''') self.Rbtnbought.configure(value=1) self.Rbtnbought.configure(variable=self.isBornOrBought) self.gdetails = tk.Label(top) self.gdetails.place(x=130,y=100, height=35, width=130) self.gdetails.configure(activebackground="#f9f9f9") self.gdetails.configure(activeforeground="black") self.gdetails.configure(background="#d9d9d9") self.gdetails.configure(disabledforeground="#a3a3a3") self.gdetails.configure(font="-family {Segoe UI} -size 13") self.gdetails.configure(foreground="#000000") self.gdetails.configure(highlightbackground="#d9d9d9") self.gdetails.configure(highlightcolor="black") self.gdetails.configure(text='''GOAT DETAILS''') self.Gid = tk.Label(top) self.Gid.place(x=80,y=155, height=35, width=98) self.Gid.configure(activebackground="#f9f9f9") self.Gid.configure(activeforeground="black") self.Gid.configure(background="#d9d9d9") self.Gid.configure(disabledforeground="#a3a3a3") self.Gid.configure(foreground="#000000") self.Gid.configure(highlightbackground="#d9d9d9") self.Gid.configure(highlightcolor="black") self.Gid.configure(text='''Goat ID''') self.TEntry1 = ttk.Entry(top) self.TEntry1.place(x=250,y=155, height=35, width=140) self.TEntry1.configure(takefocus="") self.breed = tk.Label(top) self.breed.place(x=80,y=200, height=35, width=98) self.breed.configure(activebackground="#f9f9f9") self.breed.configure(activeforeground="black") self.breed.configure(background="#d9d9d9") self.breed.configure(disabledforeground="#a3a3a3") self.breed.configure(foreground="#000000") self.breed.configure(highlightbackground="#d9d9d9") self.breed.configure(highlightcolor="black") self.breed.configure(text='''Breed''') self.TEntry1_22 = ttk.Entry(top) self.TEntry1_22.place(x=250,y=200,height=35, width=140) self.TEntry1_22.configure(takefocus="") self.DOB = tk.Label(top) self.DOB.place(x=80,y=245, height=35, width=98) self.DOB.configure(activebackground="#f9f9f9") self.DOB.configure(activeforeground="black") self.DOB.configure(background="#d9d9d9") self.DOB.configure(disabledforeground="#a3a3a3") self.DOB.configure(foreground="#000000") self.DOB.configure(highlightbackground="#d9d9d9") self.DOB.configure(highlightcolor="black") self.DOB.configure(text='''DOB''') self.goatDob = DateEntry(top, width=12, year=2019, month=6, day=22, background='darkblue', foreground='white', borderwidth=2) self.goatDob.place(x=250,y=245, height=35, width=140) self.mother_id = tk.Label(top) self.mother_id.place(x=80,y=290, height=35, width=98) self.mother_id.configure(activebackground="#f9f9f9") self.mother_id.configure(activeforeground="black") self.mother_id.configure(background="#d9d9d9") self.mother_id.configure(disabledforeground="#a3a3a3") self.mother_id.configure(foreground="#000000") self.mother_id.configure(highlightbackground="#d9d9d9") self.mother_id.configure(highlightcolor="black") self.mother_id.configure(text='''Mother ID''') self.TEntry1_24 = ttk.Entry(top) self.TEntry1_24.place(x=250,y=335,height=35, width=140) self.TEntry1_24.configure(takefocus="") self.weight = tk.Label(top) self.weight.place(x=80,y=335, height=35, width=98) self.weight.configure(activebackground="#f9f9f9") self.weight.configure(activeforeground="black") self.weight.configure(background="#d9d9d9") self.weight.configure(disabledforeground="#a3a3a3") self.weight.configure(foreground="#000000") self.weight.configure(highlightbackground="#d9d9d9") self.weight.configure(highlightcolor="black") self.weight.configure(text='''Weight''') self.TEntry1_25 = ttk.Entry(top) self.TEntry1_25.place(x=250,y=290,height=35, width=140) self.TEntry1_25.configure(takefocus="") self.gender = tk.Label(top) self.gender.place(x=80,y=395, height=40, width=98) self.gender.configure(activebackground="#f9f9f9") self.gender.configure(activeforeground="black") self.gender.configure(background="#d9d9d9") self.gender.configure(disabledforeground="#a3a3a3") self.gender.configure(foreground="#000000") self.gender.configure(highlightbackground="#d9d9d9") self.gender.configure(highlightcolor="black") self.gender.configure(text='''Gender''') self.genderVal = IntVar() self.RbtnMale = tk.Radiobutton(top) self.RbtnMale.place(x=250,y=380,height=30,width=80) self.RbtnMale.configure(activebackground="#ececec") self.RbtnMale.configure(activeforeground="#000000") self.RbtnMale.configure(background="#d9d9d9") self.RbtnMale.configure(disabledforeground="#a3a3a3") self.RbtnMale.configure(foreground="#000000") self.RbtnMale.configure(highlightbackground="#d9d9d9") self.RbtnMale.configure(highlightcolor="black") self.RbtnMale.configure(justify='left') self.RbtnMale.configure(text='''MALE''') self.RbtnMale.configure(value=0) self.RbtnMale.configure(variable=self.genderVal) self.RbtnFemale = tk.Radiobutton(top) self.RbtnFemale.place(x=250,y=420,height=30,width=80) self.RbtnFemale.configure(activebackground="#ececec") self.RbtnFemale.configure(activeforeground="#000000") self.RbtnFemale.configure(background="#d9d9d9") self.RbtnFemale.configure(disabledforeground="#a3a3a3") self.RbtnFemale.configure(foreground="#000000") self.RbtnFemale.configure(highlightbackground="#d9d9d9") self.RbtnFemale.configure(highlightcolor="black") self.RbtnFemale.configure(justify='left') self.RbtnFemale.configure(text='''FEMALE''') self.RbtnFemale.configure(value=1) self.RbtnFemale.configure(variable=self.genderVal) self.health = tk.Label(top) self.health.place(x=890,y=100, height=35, width=150) self.health.configure(activebackground="#f9f9f9") self.health.configure(activeforeground="black") self.health.configure(background="#d9d9d9") self.health.configure(disabledforeground="#a3a3a3") self.health.configure(font="-family {Segoe UI} -size 12") self.health.configure(foreground="#000000") self.health.configure(highlightbackground="#d9d9d9") self.health.configure(highlightcolor="black") self.health.configure(text='''LAST VACCINATED''') self.v1 = tk.Label(top) self.v1.place(x=800,y=155, height=35, width=98) self.v1.configure(activebackground="#f9f9f9") self.v1.configure(activeforeground="black") self.v1.configure(background="#d9d9d9") self.v1.configure(disabledforeground="#a3a3a3") self.v1.configure(foreground="#000000") self.v1.configure(highlightbackground="#d9d9d9") self.v1.configure(highlightcolor="black") self.v1.configure(text='''V1''') self.cal1 = DateEntry(top, width=12, year=2020, month=6, day=22, background='darkblue', foreground='white', borderwidth=2) self.cal1.place(x=1000,y=155, height=35, width=98) self.v2 = tk.Label(top) self.v2.place(x=800,y=200, height=35, width=98) self.v2.configure(activebackground="#f9f9f9") self.v2.configure(activeforeground="black") self.v2.configure(background="#d9d9d9") self.v2.configure(disabledforeground="#a3a3a3") self.v2.configure(foreground="#000000") self.v2.configure(highlightbackground="#d9d9d9") self.v2.configure(highlightcolor="black") self.v2.configure(text='''V2''') self.cal2 = DateEntry(top, width=12, year=2019, month=6, day=22, background='darkblue', foreground='white', borderwidth=2) self.cal2.place(x=1000,y=200, height=35, width=98) self.v3 = tk.Label(top) self.v3.place(x=800,y=245, height=35, width=98) self.v3.configure(activebackground="#f9f9f9") self.v3.configure(activeforeground="black") self.v3.configure(background="#d9d9d9") self.v3.configure(disabledforeground="#a3a3a3") self.v3.configure(foreground="#000000") self.v3.configure(highlightbackground="#d9d9d9") self.v3.configure(highlightcolor="black") self.v3.configure(text='''V3''') self.cal3 = DateEntry(top, width=12, year=2019, month=6, day=22, background='darkblue', foreground='white', borderwidth=2) self.cal3.place(x=1000,y=245, height=35, width=98) self.v4 = tk.Label(top) self.v4.place(x=800,y=290, height=35, width=98) self.v4.configure(activebackground="#f9f9f9") self.v4.configure(activeforeground="black") self.v4.configure(background="#d9d9d9") self.v4.configure(disabledforeground="#a3a3a3") self.v4.configure(foreground="#000000") self.v4.configure(highlightbackground="#d9d9d9") self.v4.configure(highlightcolor="black") self.v4.configure(text='''V4''') self.cal4 = DateEntry(top, width=12, year=2019, month=6, day=22, background='darkblue', foreground='white', borderwidth=2) self.cal4.place(x=1000,y=290, height=35, width=98) self.v5 = tk.Label(top) self.v5.place(x=800,y=335, height=35, width=98) self.v5.configure(activebackground="#f9f9f9") self.v5.configure(activeforeground="black") self.v5.configure(background="#d9d9d9") self.v5.configure(disabledforeground="#a3a3a3") self.v5.configure(foreground="#000000") self.v5.configure(highlightbackground="#d9d9d9") self.v5.configure(highlightcolor="black") self.v5.configure(text='''V5''') self.cal5 = DateEntry(top, width=12, year=2019, month=6, day=22, background='darkblue', foreground='white', borderwidth=2) self.cal5.place(x=1000,y=335, height=35, width=98) self.v6 = tk.Label(top) self.v6.place(x=800,y=380, height=35, width=98) self.v6.configure(activebackground="#f9f9f9") self.v6.configure(activeforeground="black") self.v6.configure(background="#d9d9d9") self.v6.configure(disabledforeground="#a3a3a3") self.v6.configure(foreground="#000000") self.v6.configure(highlightbackground="#d9d9d9") self.v6.configure(highlightcolor="black") self.v6.configure(text='''V6''') self.cal6 = DateEntry(top, width=12, year=2019, month=6, day=22, background='darkblue', foreground='white', borderwidth=2) self.cal6.place(x=1000,y=380, height=35, width=98) self.v7 = tk.Label(top) self.v7.place(x=800,y=425, height=35, width=98) self.v7.configure(activebackground="#f9f9f9") self.v7.configure(activeforeground="black") self.v7.configure(background="#d9d9d9") self.v7.configure(disabledforeground="#a3a3a3") self.v7.configure(foreground="#000000") self.v7.configure(highlightbackground="#d9d9d9") self.v7.configure(highlightcolor="black") self.v7.configure(text='''V7''') self.cal7 = DateEntry(top, width=12, year=2019, month=6, day=22, background='darkblue', foreground='white', borderwidth=2) self.cal7.place(x=1000,y=425, height=35, width=98) self.v8 = tk.Label(top) self.v8.place(x=800,y=470, height=35, width=98) self.v8.configure(activebackground="#f9f9f9") self.v8.configure(activeforeground="black") self.v8.configure(background="#d9d9d9") self.v8.configure(disabledforeground="#a3a3a3") self.v8.configure(foreground="#000000") self.v8.configure(highlightbackground="#d9d9d9") self.v8.configure(highlightcolor="black") self.v8.configure(text='''V8''') self.cal8 = DateEntry(top, width=12, year=2019, month=6, day=22, background='darkblue', foreground='white', borderwidth=2) self.cal8.place(x=1000,y=470, height=35, width=98) self.Submit = tk.Button(top, command=self.acceptValues) self.Submit.place(relx=0.550, rely=0.842, height=30, width=59) self.Submit.configure(activebackground="#ececec") self.Submit.configure(activeforeground="#000000") self.Submit.configure(background="#d9d9d9") self.Submit.configure(disabledforeground="#a3a3a3") self.Submit.configure(foreground="#000000") self.Submit.configure(highlightbackground="#d9d9d9") self.Submit.configure(highlightcolor="black") self.Submit.configure(pady="0") self.Submit.configure(text='''SUBMIT''') self.Cancel = tk.Button(top, command=lambda: addGoat_support.destroy_window()) self.Cancel.place(relx=0.430, rely=0.842, height=30, width=59) self.Cancel.configure(activebackground="#ececec") self.Cancel.configure(activeforeground="#000000") self.Cancel.configure(background="#d9d9d9") self.Cancel.configure(disabledforeground="#a3a3a3") self.Cancel.configure(foreground="#000000") self.Cancel.configure(highlightbackground="#d9d9d9") self.Cancel.configure(highlightcolor="black") self.Cancel.configure(pady="0") self.Cancel.configure(text='''CANCEL''') self.goatDob.set_date(datetime.date(datetime.now())) self.cal1.set_date(datetime.date(datetime.now())) self.cal2.set_date(datetime.date(datetime.now())) self.cal3.set_date(datetime.date(datetime.now())) self.cal4.set_date(datetime.date(datetime.now())) self.cal5.set_date(datetime.date(datetime.now())) self.cal6.set_date(datetime.date(datetime.now())) self.cal7.set_date(datetime.date(datetime.now())) self.cal8.set_date(datetime.date(datetime.now())) self.disableVaccination() def acceptValues(self): try: goat_id = int(self.TEntry1.get()) g_breed = self.TEntry1_22.get() g_dob = self.goatDob.get_date() g_weight = int(self.TEntry1_24.get()) g_motherId = self.TEntry1_25.get() g_gender = 'm' if int(self.genderVal.get()) == 0 else 'f' g_isBornOrBought = self.isBornOrBought.get() v1Date = self.cal1.get_date() v2Date = self.cal2.get_date() v3Date = self.cal3.get_date() v4Date = self.cal4.get_date() v5Date = self.cal5.get_date() v6Date = self.cal6.get_date() v7Date = self.cal7.get_date() v8Date = self.cal8.get_date() # born = 0 print(g_isBornOrBought) addGoatData = {'goat_id': goat_id, 'breed': g_breed, 'date_of_birth': g_dob, 'weight': g_weight, 'gender': g_gender, 'pregnant': 'No', 'v1': str(v1Date), 'v2': str(v2Date), 'v3': str(v3Date), 'v4': str(v4Date), 'v5': str(v5Date), 'v6': str(v6Date), 'v7': str(v7Date), 'v8': str(v8Date), 'curdate': datetime.date(datetime.now())} if g_gender == 'f' and g_isBornOrBought == 0: self.db.insertGoatRecord(addGoatData, mother_id=g_motherId) elif g_gender == 'f' and g_isBornOrBought == 1: self.db.insertGoatRecord(addGoatData, mother_id='null') elif g_gender == 'm' and g_isBornOrBought == 0: self.db.insertGoatRecord(addGoatData, mother_id=g_motherId) elif g_gender == 'm' and g_isBornOrBought == 1: self.db.insertGoatRecord(addGoatData, mother_id='null') except: self.errorMsg() else: self.showSuccess() print({'goat_id': goat_id, 'breed': g_breed, 'date_of_birth': g_dob, 'weight': g_weight, 'gender': g_gender, 'pregnant': 'No', 'v1': str(v1Date), 'v2': str(v2Date), 'v3': str(v3Date), 'v4': str(v4Date), 'v5': str(v5Date), 'v6': str(v6Date), 'v7': str(v6Date), 'v8': str(v6Date)}) addGoat_support.destroy_window() def disableVaccination(self): self.TEntry1_25.config(state=NORMAL) self.cal1.config(state=DISABLED) self.cal2.config(state=DISABLED) self.cal3.config(state=DISABLED) self.cal4.config(state=DISABLED) self.cal5.config(state=DISABLED) self.cal6.config(state=DISABLED) self.cal7.config(state=DISABLED) self.cal8.config(state=DISABLED) def disableMotherId(self): self.TEntry1_25.config(state=DISABLED) self.cal1.config(state=NORMAL) self.cal2.config(state=NORMAL) self.cal3.config(state=NORMAL) self.cal4.config(state=NORMAL) self.cal5.config(state=NORMAL) self.cal6.config(state=NORMAL) self.cal7.config(state=NORMAL) self.cal8.config(state=NORMAL) def errorMsg(self): tk.messagebox.showerror("Input Error","Incorrect Data!") def showSuccess(self): tk.messagebox.showinfo("Success","Successfully Inserted")
class Gui: interval = 0.1 # Период обновления окна в секундах def __init__(self, run_callback: Callable, close_callback: Callable): self._root = tk.Tk() self._root.wm_title("YouTube статистика") label = tk.Label(width=40) label["text"] = "Дата отсечки:" label.pack() self._date = DateEntry(master=self._root, width=38) self._date.pack() Hovertip( self._date, text= "Программа будет искать видео на каналах из списка channels.txt, которые вышли \n" "после указанной даты. На анализ видео из списка videos.txt этот параметр не влияет", ) label = tk.Label(width=40) label["text"] = "Google API ключ:" label.pack() self._api = tk.StringVar() key_entry = tk.Entry(master=self._root, textvariable=self._api, width=40) key_entry.pack() self._api.set(Settings.api_key()) Hovertip(key_entry, text="Ваш Google API Key для доступа к YouTube") self._bots_frame = tk.LabelFrame(self._root, text="Группы ботов", width=40) Hovertip(self._bots_frame, "Какие категории ботов будут учитываться при анализе") self._bot_groups = dict() for bot_group in Settings.bot_list_links().keys(): self._bot_groups[bot_group] = tk.IntVar(value=0) check = tk.Checkbutton( self._bots_frame, text=bot_group, width=38, variable=self._bot_groups[bot_group], ) check.pack() self._bots_frame.pack(padx=5, pady=5) self._bot_list_inverted = tk.IntVar(value=0) inverter = tk.Checkbutton(text="Только из указанных списков", variable=self._bot_list_inverted) inverter.pack() Hovertip( inverter, "Если этот пункт выбран, в статистике будут учитываться только акаунты ботов из выбранных\n" "выше списков (групп). Если этот пункт не выбран, в статистике будут учитываться аккаунты\n" "всех пользователей, кроме тех, которые есть в выбранных списках", ) self._video_stat = tk.IntVar(value=0) video_stat = tk.Checkbutton(text="Распределять по видео", variable=self._video_stat) video_stat.pack() Hovertip( video_stat, "Если этот пункт выбран, в статистике будет распределение комментариев по видеороликам, а не только " "по каналам", ) self._start_btn = tk.Button(master=self._root, text="Начать", command=lambda: run_callback(self)) self._start_btn.pack() self._root.protocol("WM_DELETE_WINDOW", close_callback) def disable(self): self._start_btn.config(state=tk.DISABLED) @property def date(self) -> date: return self._date.get_date() @property def ignore_bots(self) -> bool: return not bool(self._bot_list_inverted.get()) @property def selected_bot_groups(self) -> List[str]: return [key for key, value in self._bot_groups.items() if value.get()] @property def video_stat(self): return bool(self._video_stat.get()) @property def api(self) -> str: return self._api.get() async def run(self): # По образцу https://gist.github.com/Lucretiel/e7d9a50b7b1960a56a1c try: while True: self._root.update() await sleep(self.interval) except tk.TclError as e: if "application has been destroyed" not in e.args[0]: raise
class InsatongGUI: def __init__(self, webdriver): # data variable self.__page_num = 1 self.__webdriver = webdriver self.__do_action = False # initial request for url request_url = _WEB_URL.format(self.__page_num) self.__webdriver.get(request_url) self.__root = Tk() posX, posY = int(GetSystemMetrics(0) / 3), int(GetSystemMetrics(1) / 3) self.__root.title("최근 인사통 Helper") self.__root.geometry("270x350+{}+{}".format(posX, posY)) self.__root.resizable(True, True) date_frame = LabelFrame(self.__root, text="검색 시작일", padx=20, pady=10) date_frame.place(x=50, y=30) self.__cal = DateEntry(date_frame, width=12, background='darkblue', foreground='white', borderwidth=2, date_pattern="y-mm-dd") self.__cal.pack(padx=10, pady=10) serach_frame = LabelFrame(self.__root, text="회사명", padx=10, pady=20) serach_frame.place(x=50, y=110) self.__search_txt = Entry(serach_frame, width=20) self.__search_txt.pack() page_frame = LabelFrame(self.__root, text="검색 시작 페이지", padx=10, pady=20) page_frame.place(x=50, y=190) self.__page_txt = Entry(page_frame, width=20) self.__page_txt.bind("<Return>", self.__page_move_event) self.__page_txt.pack() self.__page_txt.insert(0, str(self.__page_num)) button_frame = Frame(self.__root, width=100, height=50) button_frame.place(x=50, y=270) # define buttons active_btn = Button(button_frame, text="실행", width=9, height=3, padx=5, command=self.__active_btn_event) active_btn.bind("<Return>", self.__active_btn_event) active_btn.grid(row=0, column=0) stop_btn = Button(button_frame, text="중지", width=9, height=3, padx=5, command=self.__action_stop_event) stop_btn.bind("<Return>", self.__action_stop_event) stop_btn.grid(row=0, column=1, padx=5) self.__root.mainloop() def window_quit(self): self.__root.destroy() @property def do_action(self): return self.__do_action @do_action.setter def do_action(self, isdo): self.__do_action = isdo def __active_btn_event(self, *args): sys_date = str(date.today()) search_date = str(self.__cal.get_date()) search_txt = self.__search_txt.get().strip() self.do_action = True if len(search_txt) == 0: msgbox.showwarning("확인", "회사명을 입력해주세요") return input_page = self.__page_txt.get().strip() try: self.__page_num = int(input_page) except ValueError: msgbox.showerror("오류", "숫자가 아닌 값이 입력되었습니다") self.__page_txt.delete(0, END) self.__page_txt.insert(0, str(self.__page_num)) return if search_date == sys_date: job = Thread(target=_worker_thread1, args=(self, self.__webdriver, self.__page_num, search_txt)) job.start() else: job = Thread(target=_worker_thread2, args=(self, self.__webdriver, self.__page_num, search_date, search_txt)) job.start() def __page_move_event(self, *args): input_page = self.__page_txt.get().strip() try: self.__page_num = int(input_page) except ValueError: msgbox.showerror("오류", "숫자가 아닌 값이 입력되었습니다") self.__page_txt.delete(0, END) self.__page_txt.insert(0, str(self.__page_num)) return request_url = _WEB_URL.format(self.__page_num) try: self.__webdriver.get(request_url) except WebDriverException: msgbox.showerror("오류", "웹 브라우저를 제어 할 수 없습니다.\n 프로그램을 다시 실행 시켜주세요") self.window_quit() def __action_stop_event(self, *args): self.do_action = False msgbox.showwarning("확인", "탐색이 중지 되었습니다.")
class InsertStudent(Toplevel): def backf(self, event=""): self.destroy() self.root.deiconify() def c_w(self, event=""): m = messagebox.askyesno("School Software", "Are you Want to Close Application?", parent=self.root) if m > 0: query4 = "update staff set currentuser = 0 where currentuser = 1;" self.conn.execute(query4) self.conn.commit() self.main_root.destroy() else: return # ========================================================validation function============================================================ def validNumber(self, s): Pattern = re.compile("(0/91)?[6-9][0-9]{9}") return Pattern.match(s) def validEmail(self, s): Pattern = re.compile("^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w{2,3}$") return Pattern.match(s) def validName(self, s): Pattern = re.compile("([A-Za-z]+)*$") return Pattern.match(s) def validRollno(self, s): Pattern = re.compile("^[0-9]*$") return Pattern.match(s) def validDivision(self, s): Pattern = re.compile("([A-Za-z]+)*$") return Pattern.match(s) def validFee(self, s): Pattern = re.compile("^[0-9]*$") return Pattern.match(s) # ===========================================================to check whether exam is started or not========================================================= def checkExam(self): try: sqliteConnection = sqlite3.connect('sinfo.db') cursor = sqliteConnection.cursor() print("Connected to SQLite") exams = """SELECT data FROM exams;""" cursor.execute(exams) return cursor.fetchall() except sqlite3.Error as error: print("Failed to insert Python variable into sqlite table", error) finally: if (sqliteConnection): sqliteConnection.close() print("The SQLite connection is closed") # ===========================================================to get gr number========================================================= def getGrno(self): try: sqliteConnection = sqlite3.connect('sinfo.db') cursor = sqliteConnection.cursor() print("Connected to SQLite") grnoCount = """SELECT grno FROM master WHERE grno = (SELECT MAX(grno) FROM master);""" cursor.execute(grnoCount) return cursor.fetchall() except sqlite3.Error as error: print("Failed to insert Python variable into sqlite table", error) finally: if (sqliteConnection): sqliteConnection.close() print("The SQLite connection is closed") # ===========================================================to get Roll number========================================================= def getRollno( self, std, ): try: sqliteConnection = sqlite3.connect('sinfo.db') cursor = sqliteConnection.cursor() print("Connected to SQLite") grnoCount = """SELECT MAX(rollno) FROM master WHERE standard = ?;""" data_tuple = (std, ) cursor.execute(grnoCount, data_tuple) return cursor.fetchall() cursor.close() except sqlite3.Error as error: print("Failed to insert Python variable into sqlite table", error) print("here") finally: if (sqliteConnection): sqliteConnection.close() print("The SQLite connection is closed") # ============================================================to set all field as null======================================================== def setValue(self): self.rno = "-" self.std.set("") self.medium.set("Select Medium") self.stream.set("Select Stream") # self.div.set("") self.fname.set("") self.mname.set("") self.lname.set("") self.addressentry.delete(1.0, END) self.phnos.set("") self.phnop.set("") self.email.set("") self.poaddentry.delete(1.0, END) self.pophno.set("") self.fee.set("") self.caste.set("") self.dobentry.set_date(self.today_date) self.bloodg.set("Select Blood Group") self.category.set("Select Category") # ============================================================to insert value in database======================================================== def insertVaribleIntoTable(self, rollno, std, fname, mname, lname, address, phnos, phnop, email, poadd, pophno, fee, dob, category, bloodg, caste, jdate, ayear): try: sqliteConnection = sqlite3.connect('sinfo.db') cursor = sqliteConnection.cursor() print("Connected to SQLite") sqlite_insert = """INSERT INTO master (rollno, standard, fname, mname, lname, address, student_phno, parents_phno, email, parent_office_address, parents_office_phno, fee, date_of_birth, category, blood_group, cast, joining_date, ayear) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);""" data_tuple = (rollno, std, fname, mname, lname, address, phnos, phnop, email, poadd, pophno, fee, dob, category, bloodg, caste, jdate, ayear) cursor.execute(sqlite_insert, data_tuple) sqliteConnection.commit() print("Python Variables inserted successfully into detail table") messagebox.showinfo('Successfully done', 'Entry is done in database') text = Label(self, text="GR no.") text.place(x=900, y=185, height=25) self.grno = int(self.getGrno()[0][0]) text = Label(self, text=self.grno) text.place(x=1000, y=185, height=25) self.grn = "Your Gr number is " + str(self.grno) messagebox.showinfo('GR number', self.grn) if (int(self.std.get()) < 11): print(self.getRollno(self.std.get() + "~" + self.medium.get())) self.rno = str( self.getRollno(self.std.get() + "~" + self.medium.get())[0][0]) else: print( self.getRollno(self.std.get() + "~" + self.medium.get() + "~" + self.stream.get())) self.rno = str( self.getRollno(self.std.get() + "~" + self.medium.get() + "~" + self.stream.get())[0][0]) text = Label(self, text="Roll no.") text.place(x=900, y=220, height=25) self.roll = Label(self, text=self.rno) self.roll.place(x=1000, y=220, height=25) self.rn = "Your Roll number is " + (self.rno) messagebox.showinfo('Roll number', self.rn) cursor.close() except sqlite3.Error as error: print("Failed to insert Python variable into sqlite table", error) messagebox.showinfo('Error!!!!', 'Entry is not done in database') finally: if (sqliteConnection): sqliteConnection.close() print("The SQLite connection is closed") # ==========================================================to check validation========================================================== def submitvalue(self): self.dob = str(self.dobentry.get_date()) self.address = self.addressentry.get(1.0, END) self.poadd = self.poaddentry.get(1.0, END) exam = self.checkExam() counter = 0 try: for x in exam: if (x[0].split("_")[1].split("-")[0] == self.std.get()): counter = 1 break if (counter != 1): pass else: raise ValueError except: messagebox.showerror( "School Software", "exam is started for your standard so now you cannot enter") self.stdentry.focus_set() return try: if (len(self.address) != 1): pass else: raise ValueError except: messagebox.showerror("School Software", "Please enter address") return try: if (len(self.poadd) != 1): pass else: raise ValueError except: messagebox.showerror("School Software", "Please enter parent office address") return try: if self.category.get() != "Select Category": pass else: raise ValueError except: messagebox.showerror("School Software", "Please select category") return try: if self.caste.get() != "": pass else: raise ValueError except: messagebox.showerror("School Software", "Please enter caste") self.casteentry.focus_set() return try: if self.dobentry.get_date() != self.today_date: pass else: raise ValueError except: messagebox.showerror("School Software", "Please select date of birth") return try: if self.bloodg.get() != "Select Blood Group": pass else: raise ValueError except: messagebox.showerror("School Software", "Please select blood group") return try: if ((self.std.get() != "") and (int(self.std.get()) >= 1) and (int(self.std.get()) <= 12)): pass else: raise ValueError except: messagebox.showerror("School Software", "Please enter valid standard") self.stdentry.focus_set() return try: if ((self.validFee(self.fee.get())) and (self.fee.get() != "")): pass else: raise ValueError except: messagebox.showerror("School Software", "Please enter valid fee") self.feesentry.focus_set() return try: if ((self.validName(self.fname.get())) and (self.fname.get() != "")): pass else: raise ValueError except: messagebox.showerror("School Software", "Please enter valid first name") self.fnameentry.focus_set() return try: if ((self.validName(self.mname.get())) and (self.mname.get() != "")): pass else: raise ValueError except: messagebox.showerror("School Software", "Please enter valid middle name") self.mnameentry.focus_set() return try: if ((self.validName(self.lname.get())) and (self.lname.get() != "")): pass else: raise ValueError except: messagebox.showerror("School Software", "Please enter valid last name") self.lnameentry.focus_set() return try: if (self.medium.get() != "Select Medium"): pass else: raise ValueError except: messagebox.showerror( 'Error', 'please select medium but select medium after entering standard' ) return try: if ((self.validNumber(self.phnos.get())) and (len(self.phnos.get()) == 10)): pass else: raise ValueError except: messagebox.showerror("School Software", "Please enter valid student phone number") self.phnosentry.focus_set() return try: if ((self.validNumber(self.phnop.get())) and (len(self.phnop.get()) == 10)): pass else: raise ValueError except: messagebox.showerror("School Software", "Please enter valid parent phone number") self.phnopentry.focus_set() return try: if ((self.validNumber(self.pophno.get())) and (len(self.pophno.get()) == 10)): pass else: raise ValueError except: messagebox.showerror( "School Software", "Please enter valid parent office phone number") self.pophnoentry.focus_set() return try: if (self.validEmail(self.email.get())): pass else: raise ValueError except: messagebox.showerror("School Software", "Please enter valid email address") self.emailentry.focus_set() return """if (self.validNumber(self.phnop.get()) and self.validNumber(self.phnos.get()) and self.validNumber( self.pophno.get()) and (len(self.phnos.get()) == 10) and (len(self.phnop.get()) == 10) and ( len(self.pophno.get()) == 10)): if (self.validEmail(self.email.get()) and self.medium.get() != "Select Medium"): if (self.validName(self.fname.get()) and self.validName(self.mname.get()) and self.validName( self.lname.get()) and (self.fname.get() != "") and (self.mname.get() != "") and ( self.lname.get() != "")): if (((self.std.get() != "") and (int(self.std.get()) >= 1) and ( int(self.std.get()) <= 12)) and ( (self.fee.get() != "") and self.validFee(self.fee.get()))):""" if (int(self.std.get()) < 11): text = Label(self, text="Roll no.") text.place(x=900, y=220, height=25) self.rno = self.getRollno(self.std.get() + "~" + self.medium.get()) print(self.rno) if (self.rno[0][0] == None or len(self.rno) == 0): self.rno = str(1) else: print(self.rno) self.rno = str( self.getRollno(self.std.get() + "~" + self.medium.get())[0][0] + 1) self.roll = Label(self, text=self.rno) self.roll.place(x=1000, y=220, height=25) self.insertVaribleIntoTable( self.rno, self.std.get() + "~" + self.medium.get(), self.fname.get(), self.mname.get(), self.lname.get(), self.address, self.phnos.get(), self.phnop.get(), self.email.get(), self.poadd, self.pophno.get(), self.fee.get(), self.dob, self.category.get(), self.bloodg.get(), self.caste.get(), str(self.today_date), str(self.ayear.get())) self.setValue() self.stdentry.focus_set() text = Label(self, text="GR no.") text.place(x=900, y=185, height=25) self.grno = self.getGrno() if (len(self.grno) == 0): self.grno = 1 else: self.grno = self.getGrno()[0][0] + 1 text = Label(self, text=self.grno) text.place(x=1000, y=185, height=25) text = Label(self, text="Roll no.") text.place(x=900, y=220, height=25) self.roll = Label(self, text=self.rno) self.roll.place(x=1000, y=220, height=25) print("done") else: if (self.stream.get() == "Select Stream"): messagebox.showerror('Error', 'Please select stream') else: text = Label(self, text="Roll no.") text.place(x=900, y=220, height=25) self.rno = self.getRollno(self.std.get() + "~" + self.medium.get() + "~" + self.stream.get()) print(self.rno) if (len(self.rno) == 0 or self.rno[0][0] == None): self.rno = str(1) else: print(self.rno) self.rno = str( self.getRollno(self.std.get() + "~" + self.medium.get() + "~" + self.stream.get())[0][0] + 1) self.roll = Label(self, text=self.rno) self.roll.place(x=1000, y=220, height=25) self.insertVaribleIntoTable( self.rno, self.std.get() + "~" + self.medium.get() + "~" + self.stream.get(), self.fname.get(), self.mname.get(), self.lname.get(), self.address, self.phnos.get(), self.phnop.get(), self.email.get(), self.poadd, self.pophno.get(), self.fee.get(), self.dob, self.category.get(), self.bloodg.get(), self.caste.get(), str(self.today_date), str(self.ayear.get())) self.setValue() self.stdentry.focus_set() print(self.ayear) print(type(self.ayear)) text = Label(self, text="GR no.") text.place(x=900, y=185, height=25) self.grno = self.getGrno() if (len(self.grno) == 0): self.grno = 1 else: self.grno = self.getGrno()[0][0] + 1 text = Label(self, text=self.grno) text.place(x=1000, y=185, height=25) text = Label(self, text="Roll no.") text.place(x=900, y=220, height=25) self.roll = Label(self, text=self.rno) self.roll.place(x=1000, y=220, height=25) print("done") """else: if ((self.rno.get() == "") or (not(self.validRollno(self.rno.get())))): self.rnoentry.focus_set() tkinter.messagebox.showinfo('Error', 'Please enter valid Roll number') elif (self.div.get() == ""): self.diventry.focus_set() tkinter.messagebox.showinfo('Error', 'Please enter Division') if ((self.std.get() == "") or (int(self.std.get()) < 1) or (int(self.std.get()) > 12)): print(self.std.get()) print(type(self.std.get())) messagebox.showerror('Error', 'Please enter valid standard') self.stdentry.focus_set() elif ((not (self.validFee(self.fee.get()))) or (self.fee.get() == "")): messagebox.showerror('Error', 'Please enter valid fees') self.feesentry.focus_set() else: if ((not (self.validName(self.fname.get()))) or (self.fname.get() == "")): messagebox.showerror('Error', 'Invalid first name') self.fnameentry.focus_set() elif ((not (self.validName(self.mname.get()))) or (self.mname.get() == "")): messagebox.showerror('Error', 'Invalid middle name') self.mnameentry.focus_set() elif ((not (self.validName(self.lname.get()))) or (self.lname.get() == "")): messagebox.showerror('Error', 'Invalid last name') self.lnameentry.focus_set() else: if (self.medium.get() == "Select Medium"): messagebox.showerror('Error', 'please select medium but select medium after entering standard') else: messagebox.showerror('Error', 'Invalid email address') self.emailentry.focus_set() else: if ((not (self.validNumber(self.phnop.get()))) or (len(self.phnop.get()) != 10)): messagebox.showinfo('Error', 'Invalid parent mobile number') self.phnopentry.focus_set() elif ((not (self.validNumber(self.phnos.get()))) or (len(self.phnos.get()) != 10)): messagebox.showerror('Error', 'Invalid student mobile number') self.phnosentry.focus_set() elif ((not (self.validNumber(self.pophno.get()))) or (len(self.pophno.get()) != 10)): messagebox.showerror('Error', 'Invalid parent office mobile number') self.pophnoentry.focus_set()""" # ==================================================================================================================== # ==================================================================================================================== def streamselect(self, event): text = Label(self.lf2, text="Select Stream : ") text.place(x=500, y=170, height=25) if (int(self.std.get()) < 11): self.streamchoosen = Combobox(self.lf2, state="disable", textvariable=self.stream) else: self.streamchoosen = Combobox(self.lf2, state="readonly", textvariable=self.stream) self.streamchoosen.place(x=640, y=170, height=25, width=200) self.streamchoosen['values'] = ["Sci", "Com"] # ==================================================================================================================== def __init__(self, root, main_root): self.main_root = main_root self.root = root try: self.conn = sqlite3.connect('sinfo.db') except: messagebox.showerror("School Software", "Database Connection Error.") Toplevel.__init__(self) self.lift() self.focus_force() self.grab_set() self.grab_release() self.bgclr1 = "#0080c0" self.bgclr2 = "#e7d95a" self.f1 = "Arial Bold" self.f2 = "times new roman" self.title("INSERT STUDENTS") self.config(background=self.bgclr1) self.geometry("1350x700+0+0") self.resizable(False, False) # ========================================================variables============================================================ # self.rno = StringVar() self.std = StringVar() self.medium = StringVar() self.medium.set("Select Medium") self.stream = StringVar() self.stream.set("Select Stream") self.caste = StringVar() self.category = StringVar() self.category.set("Select Category") self.bloodg = StringVar() self.bloodg.set("Select Blood Group") self.dob = StringVar() # self.div = StringVar() self.fname = StringVar() self.mname = StringVar() self.lname = StringVar() self.address = StringVar() self.phnos = StringVar() self.phnop = StringVar() self.email = StringVar() self.poadd = StringVar() self.pophno = StringVar() self.fee = StringVar() self.ayear = IntVar() ##===================================================frame 1==================================================== imagel = Image.open("left-arrow.png") imagel = imagel.resize((60, 15)) imgl = ImageTk.PhotoImage(imagel) self.lf1 = LabelFrame(self, text="NAME", bd=2, bg="black", fg="white", font=(self.f1, 20), relief=GROOVE) self.lf1.place(x=0, y=0, height=150, width=1350) bb = Button(self.lf1, image=imgl, bd=5, font=(self.f1, 20), command=self.backf) bb.place(x=10, y=10) ##=============================================frame 2========================================================== self.lf2 = LabelFrame(self, text="Student Registration", bd=2, bg="black", fg="white", font=(self.f1, 20), relief=GROOVE) self.lf2.place(x=0, y=150, height=550, width=1350) # ===========================================================Entry Fields====================================== """text = Label(self.lf2,text="GR no.") text.place(x=900, y=150, height=25)""" """self.grno = self.getGrno() if (len(self.grno) == 0): self.grno = 1 else: self.grno = self.getGrno()[0][0] + 1 self.grnotext = Label(self.lf2,text=self.grno) self.grnotext.place(x=400, y=5, height=25)""" """text = Label(self.lf2,text="Roll no.") text.place(x=5, y=5, height=25) self.rnoentry = Entry(self.lf2 textvariable=self.rno) self.rnoentry.place(x=100, y=5, height=25, width=150)""" text = Label(self.lf2, text="Select Medium : ") text.place(x=500, y=130, height=25) self.mediumchoosen = Combobox(self.lf2, state="readonly", textvariable=self.medium) self.mediumchoosen.place(x=640, y=130, height=25, width=200) self.mediumchoosen['values'] = ["Guj", "Eng"] self.mediumchoosen.bind("<<ComboboxSelected>>", self.streamselect) # self.cb2() text = Label(self.lf2, text="Select Stream : ") text.place(x=500, y=170, height=25) self.streamchoosen = Combobox(self.lf2, state="disable", textvariable=self.stream) self.streamchoosen.place(x=640, y=170, height=25, width=200) self.streamchoosen['values'] = ["Sci", "Com"] text = Label(self.lf2, text="Date of birth : ") text.place(x=500, y=200, height=25) self.dobentry = DateEntry(self.lf2, date_pattern='dd/mm/yyyy', state="readonly") self.dobentry.place(x=640, y=200, height=25, width=150) self.today_date = self.dobentry.get_date() text = Label(self.lf2, text="Select Category : ") text.place(x=500, y=230, height=25) self.categorychoosen = Combobox(self.lf2, state="readonly", textvariable=self.category) self.categorychoosen.place(x=640, y=230, height=25, width=200) self.categorychoosen['values'] = ["ST", "SC", "OBC", "OPEN", "Other"] text = Label(self.lf2, text="Select Blood group : ") text.place(x=500, y=260, height=25) self.bloodgchoosen = Combobox(self.lf2, state="readonly", textvariable=self.bloodg) self.bloodgchoosen.place(x=640, y=260, height=25, width=200) self.bloodgchoosen['values'] = [ "A+", "B+", "A-", "B-", "AB+", "O+", "O-" ] text = Label(self.lf2, text="Caste : ") text.place(x=500, y=290, height=25) self.casteentry = Entry(self.lf2, textvariable=self.caste) self.casteentry.place(x=640, y=290, height=25, width=150) text = Label(self.lf2, text="Academic year") text.place(x=500, y=320, height=25) self.ayearentry = Checkbutton(self.lf2, text="Admission in current year", variable=self.ayear, onvalue=1, offvalue=0, height=5, width=20) self.ayearentry.place(x=640, y=320, height=25, width=160) text = Label(self.lf2, text="Std.") text.place(x=10, y=10, height=25) self.stdentry = Entry(self.lf2, textvariable=self.std) self.stdentry.place(x=150, y=10, height=25, width=150) self.stdentry.focus_set() text = Label(self.lf2, text="First name") text.place(x=10, y=50, height=25) self.fnameentry = Entry(self.lf2, textvariable=self.fname) self.fnameentry.place(x=150, y=50, height=25, width=150) text = Label(self.lf2, text="Middle name") text.place(x=10, y=90, height=25) self.mnameentry = Entry(self.lf2, textvariable=self.mname) self.mnameentry.place(x=150, y=90, height=25, width=150) text = Label(self.lf2, text="Last name") text.place(x=10, y=130, height=25) self.lnameentry = Entry(self.lf2, textvariable=self.lname) self.lnameentry.place(x=150, y=130, height=25, width=150) text = Label(self.lf2, text="Address") text.place(x=10, y=170, height=25) self.addressentry = Text(self.lf2, width=20, height=5, padx=2, pady=2, wrap=WORD) self.addressentry.place(x=150, y=170, height=75, width=150) text = Label(self.lf2, text="Student ph.") text.place(x=10, y=260, height=25) self.phnosentry = Entry(self.lf2, textvariable=self.phnos) self.phnosentry.place(x=150, y=260, height=25, width=150) text = Label(self.lf2, text="Parent ph.") text.place(x=10, y=300, height=25) self.phnopentry = Entry(self.lf2, textvariable=self.phnop) self.phnopentry.place(x=150, y=300, height=25, width=150) text = Label(self.lf2, text="Email id") text.place(x=10, y=340, height=25) self.emailentry = Entry(self.lf2, textvariable=self.email) self.emailentry.place(x=150, y=340, height=25, width=150) text = Label(self.lf2, text="Parent office add.") text.place(x=10, y=380, height=25) self.poaddentry = Text(self.lf2, width=20, height=5, padx=2, pady=2, wrap=WORD) self.poaddentry.place(x=150, y=380, height=75, width=150) text = Label(self.lf2, text="Parent office ph.") text.place(x=500, y=10, height=25) self.pophnoentry = Entry(self.lf2, textvariable=self.pophno) self.pophnoentry.place(x=640, y=10, height=25, width=150) text = Label(self.lf2, text="Fees") text.place(x=500, y=50, height=25) self.feesentry = Entry(self.lf2, textvariable=self.fee) self.feesentry.place(x=640, y=50, height=25, width=150) # =====================================================Button=============================================================== btn = Button(self.lf2, text='Insert', bd='5', command=self.submitvalue) btn.place(x=550, y=450, height=25, width=150) # ==================================================================================================================== self.protocol("WM_DELETE_WINDOW", self.c_w) self.mainloop()
csv_ops.export_csv(headers_hed, head_data_pre, head_csv_pre) csv_ops.export_csv(headers_asm, assm_data, assm_csv) csv_ops.export_csv(headers_hed, head_data_post, head_csv_post) # run DMT to import the changes into Epicor dmt.dmt_import(dmt_head, head_csv_pre) # need to update job header first dmt.dmt_import(dmt_assm, assm_csv) dmt.dmt_import(dmt_head, head_csv_post) if __name__ == '__main__': # create the UI element that displays the date picker root = tkinter.Tk() root.withdraw() s = ttk.Style(root) s.theme_use('clam') top = tkinter.Toplevel(root) ttk.Label(top, text='Pick base date').pack(padx=10, pady=10) cal = DateEntry(top, width=12, background='darkblue', foreground='white', borderwidth=2) cal.pack(padx=10, pady=10) ttk.Button(top, text='OK', command=root.quit).pack(padx=10, pady=10) root.mainloop() base_date = cal.get_date() correct_wp_dates(base_date)
def generar_individual_window(): #open new window window = Toplevel(frame) #center window root.eval(f'tk::PlaceWindow {str(window)} center') window.title("Generar Constancia Individual") window.resizable(False, False) window.config(bg="#100f31") #Add grid spacers spacer_1 = Label(window, text=" ", bg="#100f31", fg="white", font=("Arial", 12)).grid(row=0, column=0) spacer_2 = Label(window, text=" ", bg="#100f31", fg="white", font=("Arial", 12)).grid(row=11, column=2) spacer_3 = Label(window, text=" ", bg="#100f31", fg="white", font=("Arial", 12)).grid(row=9, column=1) spacer_4 = Label(window, text=" ", bg="#100f31", fg="white", font=("Arial", 12)).grid(row=13, column=1) #Add name input field Label(window, text="Nombre del Alumno:", bg="#100f31", fg="white", font=("Arial", 12)).grid(row=1, column=1) nombre_alumno = StringVar() Entry(window, textvariable=nombre_alumno, width=30).grid(row=2, column=1) #Add email input field Label(window, text="Correo Electronico:", bg="#100f31", fg="white", font=("Arial", 12)).grid(row=3, column=1) email_alumno = StringVar() Entry(window, textvariable=email_alumno, width=30).grid(row=4, column=1) #Add RFC input field Label(window, text="RFC del Alumno:", bg="#100f31", fg="white", font=("Arial", 12)).grid(row=5, column=1) rfc_alumno = StringVar() Entry(window, textvariable=rfc_alumno, width=30).grid(row=6, column=1) #Get current date current_date = datetime.now() #Add date input field Label(window, text="Fecha de la Constancia:", bg="#100f31", fg="white", font=("Arial", 12)).grid(row=7, column=1) date_entry = DateEntry(window, width=30, background='darkblue', foreground='white', borderwidth=2, year=current_date.year, month=current_date.month, day=current_date.day) date_entry.grid(row=8, column=1) #Read course database and add course options courses = [] for course in COURSE_DB: courses.append(course['course']) courses.sort() courses.insert(0, "Selecciona un curso") course_var = StringVar() course_var.set(courses[0]) Label(window, text="Curso:", bg="#100f31", fg="white", font=("Arial", 12)).grid(row=9, column=1) course_menu = ttk.Combobox(window, textvariable=course_var, values=courses, width=30) course_menu.grid(row=10, column=1) #Add generate button generate_button = Button( window, text="Generar Constancia", command=lambda: generar_individual(window, nombre_alumno.get( ), email_alumno.get(), rfc_alumno.get(), course_var.get(), date_entry.get_date()), bg="#100f31", fg="white", font=("Arial", 12)) generate_button.grid(row=12, column=1)
class UpdateStudent(Toplevel): def backf(self, event=""): self.destroy() self.root.deiconify() def c_w(self, event=""): m = messagebox.askyesno("School Software", "Are you Want to Close Application?", parent=self.root) if m > 0: query4 = "update staff set currentuser = 0 where currentuser = 1;" self.conn.execute(query4) self.conn.commit() self.main_root.destroy() else: return def des(self, event=""): self.firstnamelabel.destroy() self.firstnameentry.destroy() self.middlenamelabel.destroy() self.middlenameentry.destroy() self.lastnamelabel.destroy() self.lastnameentry.destroy() self.addresslabel.destroy() self.addressentry.destroy() self.studentphnolabel.destroy() self.studentphnoentry.destroy() self.parentphnoentry.destroy() self.parentphnolabel.destroy() self.emailentry.destroy() self.emaillabel.destroy() self.parentofficeaddentry.destroy() self.parentofficeaddlabel.destroy() self.parentofficephnoentry.destroy() self.parentofficephnolabel.destroy() self.casteentry.destroy() self.castelabel.destroy() self.selectcategorylabel.destroy() self.selectcategoryentry.destroy() self.bloodgrouplabel.destroy() self.bloodgroupentry.destroy() self.dateofbirthentry.destroy() self.dateofbirthlabel.destroy() self.rollnolabel.destroy() self.rollnoentry.destroy() self.stdentry.set("Select Standard") self.detailcounter = 0 def validNumber(self, s): Pattern = re.compile("(0/91)?[6-9][0-9]{9}") return Pattern.match(s) def rollno(self, event=""): if self.rollcounter == 0: self.rollnolabel = Label(self.lf2, text="Roll Number", bd=2, bg=self.bgclr1, fg="black", font=(self.f1, 15), relief=GROOVE) self.rollnolabel.place(x=600, y=20, height=30) query1 = """ select rollno, fname, mname, lname from master where standard = ?""" a = self.conn.execute(query1, (self.stdentry.get(), )).fetchall() self.rno = [] for i in a: self.rno.append(i) self.rno.sort() self.rollno_var = StringVar() self.rollnoentry = ttk.Combobox(self.lf2, state="readonly", textvariable=self.rollno_var, font=(self.f1, 10)) self.rollnoentry.place(x=900, y=20, height=30) self.rollnoentry['values'] = self.rno self.rollnoentry.bind("<<ComboboxSelected>>", self.details) self.rollnoentry.set("Select") self.rollcounter = 1 else: self.rollnolabel.destroy() self.rollnoentry.destroy() self.rollcounter = 0 self.rollno() def details(self, event=""): if self.detailcounter == 0: rno = self.rollnoentry.get().split(" ") query = """ select * from master where standard = ? and rollno = ? """ self.data = self.conn.execute( query, (self.stdentry.get(), rno[0])).fetchone() self.firstnamelabel = Label(self.lf2, text="First Name", bd=2, bg=self.bgclr1, fg="black", font=(self.f1, 15), relief=GROOVE) self.firstnamelabel.place(x=50, y=80) self.firstname_var = StringVar() self.firstnameentry = Entry(self.lf2, textvariable=self.firstname_var, font=(self.f1, 15)) self.firstnameentry.place(x=300, y=80, height=30, width=200) self.firstname_var.set(self.data[4]) self.middlenamelabel = Label(self.lf2, text="Middle Name", bd=2, bg=self.bgclr1, fg="black", font=(self.f1, 15), relief=GROOVE) self.middlenamelabel.place(x=50, y=130) self.middlename_var = StringVar() self.middlenameentry = Entry(self.lf2, textvariable=self.middlename_var, font=(self.f1, 15)) self.middlenameentry.place(x=300, y=130, height=30, width=200) self.middlename_var.set(self.data[5]) self.lastnamelabel = Label(self.lf2, text="Lastname", bd=2, bg=self.bgclr1, fg="black", font=(self.f1, 15), relief=GROOVE) self.lastnamelabel.place(x=50, y=180) self.lastname_var = StringVar() self.lastnameentry = Entry(self.lf2, textvariable=self.lastname_var, font=(self.f1, 15)) self.lastnameentry.place(x=300, y=180, height=30, width=200) self.lastname_var.set(self.data[6]) self.addresslabel = Label(self.lf2, text="Address", bd=2, bg=self.bgclr1, fg="black", font=(self.f1, 15), relief=GROOVE) self.addresslabel.place(x=50, y=230) self.address_var = StringVar() self.addressentry = Text(self.lf2, font=(self.f1, 10)) self.addressentry.place(x=300, y=230, width=200, height=60) self.addressentry.insert(INSERT, self.data[7]) self.studentphnolabel = Label(self.lf2, text="Student Phone No.", bd=2, bg=self.bgclr1, fg="black", font=(self.f1, 15), relief=GROOVE) self.studentphnolabel.place(x=50, y=320) self.studentphno_var = StringVar() self.studentphnoentry = Entry(self.lf2, textvariable=self.studentphno_var, font=(self.f1, 15)) self.studentphnoentry.place(x=300, y=320, height=30, width=200) self.studentphno_var.set(self.data[8]) self.parentphnolabel = Label(self.lf2, text="Parent Phone No.", bd=2, bg=self.bgclr1, fg="black", font=(self.f1, 15), relief=GROOVE) self.parentphnolabel.place(x=50, y=370) self.parentphno_var = StringVar() self.parentphnoentry = Entry(self.lf2, textvariable=self.parentphno_var, font=(self.f1, 15)) self.parentphnoentry.place(x=300, y=370, height=30, width=200) self.parentphno_var.set(self.data[9]) self.emaillabel = Label(self.lf2, text="E-mail Id", bd=2, bg=self.bgclr1, fg="black", font=(self.f1, 15), relief=GROOVE) self.emaillabel.place(x=50, y=420) self.email_var = StringVar() self.emailentry = Entry(self.lf2, textvariable=self.email_var, font=(self.f1, 15)) self.emailentry.place(x=300, y=420, height=30, width=200) self.email_var.set(self.data[10]) self.parentofficeaddlabel = Label(self.lf2, text="Parent Office Add.", bd=2, bg=self.bgclr1, fg="black", font=(self.f1, 15), relief=GROOVE) self.parentofficeaddlabel.place(x=600, y=80) self.parentofficeadd_var = StringVar() self.parentofficeaddentry = Text(self.lf2, font=(self.f1, 10)) self.parentofficeaddentry.place(x=900, y=80, height=60, width=200) self.parentofficeaddentry.insert(INSERT, self.data[11]) self.parentofficephnolabel = Label(self.lf2, text="Parent Office Phone No.", bd=2, bg=self.bgclr1, fg="black", font=(self.f1, 15), relief=GROOVE) self.parentofficephnolabel.place(x=600, y=170) self.parentofficephno_var = StringVar() self.parentofficephnoentry = Entry( self.lf2, textvariable=self.parentofficephno_var, font=(self.f1, 15)) self.parentofficephnoentry.place(x=900, y=170, height=30, width=200) self.parentofficephno_var.set(self.data[12]) self.dateofbirthlabel = Label(self.lf2, text="Date Of Birth", bd=2, bg=self.bgclr1, fg="black", font=(self.f1, 15), relief=GROOVE) self.dateofbirthlabel.place(x=600, y=220) self.dateofbirth_var = StringVar() self.dateofbirthentry = DateEntry(self.lf2, width=12, background='darkblue', font=(self.f1, 15), date_pattern='dd/mm/yyyy', foreground='white', borderwidth=2, state="readonly") self.dateofbirthentry.place(x=900, y=220, width=200, height=30) date_time_str = self.data[16] date_time_obj = datetime.strptime(date_time_str, '%Y-%m-%d') self.dateofbirthentry.set_date(date_time_obj.date()) self.selectcategorylabel = Label(self.lf2, text="Select Category", bd=2, bg=self.bgclr1, fg="black", font=(self.f1, 15), relief=GROOVE) self.selectcategorylabel.place(x=600, y=270) self.selectcategory_var = StringVar() self.selectcategoryentry = Combobox( self.lf2, state="readonly", font=(self.f1, 15), textvariable=self.selectcategory_var) self.selectcategoryentry.place(x=900, y=270, height=30, width=200) self.selectcategoryentry['values'] = [ "ST", "SC", "OBC", "OPEN", "Other" ] self.selectcategory_var.set(self.data[17]) self.bloodgrouplabel = Label(self.lf2, text="Blood Group", bd=2, bg=self.bgclr1, fg="black", font=(self.f1, 15), relief=GROOVE) self.bloodgrouplabel.place(x=600, y=320) self.bloodgroup_var = StringVar() self.bloodgroupentry = Combobox(self.lf2, state="readonly", font=(self.f1, 15), textvariable=self.bloodgroup_var) self.bloodgroupentry.place(x=900, y=320, height=30, width=200) self.bloodgroupentry['values'] = [ "A+", "B+", "A-", "B-", "AB+", "O+", "O-" ] self.bloodgroup_var.set(self.data[18]) self.castelabel = Label(self.lf2, text="Caste", bd=2, bg=self.bgclr1, fg="black", font=(self.f1, 15), relief=GROOVE) self.castelabel.place(x=600, y=370) self.caste_var = StringVar() self.casteentry = Entry(self.lf2, textvariable=self.caste_var, font=(self.f1, 15)) self.casteentry.place(x=900, y=370, height=30, width=200) self.caste_var.set(self.data[19]) self.detailcounter = 1 else: self.des() self.details() def update(self): try: if self.firstnameentry.get() == "": raise ValueError except: m = messagebox.showerror("School Software", "Please enter First Name", parent=self) self.firstnameentry.focus_set() return try: if self.middlenameentry.get() == "": raise ValueError except: m = messagebox.showerror("School Software", "Please enter middle Name", parent=self) self.middlenameentry.focus_set() return try: if self.lastnameentry.get() == "": raise ValueError except: m = messagebox.showerror("School Software", "Please enter Last Name", parent=self) self.lastnameentry.focus_set() return try: if self.addressentry.get(1.0, END) == "": raise ValueError except: m = messagebox.showerror("School Software", "Please enter Address", parent=self) self.addressentry.focus_set() return try: if self.studentphnoentry.get() == "": raise ValueError except: m = messagebox.showerror("School Software", "Please enter Student Phone Number", parent=self) self.studentphnoentry.focus_set() return try: if self.parentphnoentry.get() == "": raise ValueError except: m = messagebox.showerror("School Software", "Please enter Parent Phone Number", parent=self) self.parentphnoentry.focus_set() return try: if self.emailentry.get() == "": raise ValueError except: m = messagebox.showerror("School Software", "Please enter E-mail ID", parent=self) self.emailentry.focus_set() return try: if self.parentofficeaddentry.get(1.0, END) == "": raise ValueError except: m = messagebox.showerror("School Software", "Please enter Parent Office Address", parent=self) self.parentofficeaddentry.focus_set() return try: if self.parentofficephnoentry.get() == "": raise ValueError except: m = messagebox.showerror("School Software", "Please enter Parent Office Phone Number", parent=self) self.parentofficephnoentry.focus_set() return try: if self.selectcategoryentry.get() == "Select Category": raise ValueError except: m = messagebox.showerror("School Software", "Please Select Category", parent=self) return try: if self.bloodgroupentry.get() == "Select Blood Group": raise ValueError except: m = messagebox.showerror("School Software", "Please Select Blood Group", parent=self) return try: if self.casteentry.get() == "": raise ValueError except: m = messagebox.showerror("School Software", "Please enter caste", parent=self) self.casteentry.focus_set() return try: if not self.firstnameentry.get().isalpha(): raise ValueError except: m = messagebox.showerror("School Software", "Please enter valid first name ", parent=self) self.firstnameentry.focus_set() return try: if not self.middlenameentry.get().isalpha(): raise ValueError except: m = messagebox.showerror("School Software", "Please enter valid middle name ", parent=self) self.middlenameentry.focus_set() return try: if not self.lastnameentry.get().isalpha(): raise ValueError except: m = messagebox.showerror("School Software", "Please enter valid last name", parent=self) self.lastnameentry.focus_set() return try: if not (self.validNumber(self.studentphnoentry.get()) and len(self.studentphnoentry.get()) == 10): raise ValueError except: m = messagebox.showerror("School Software", "Please enter valid Student phone number", parent=self) self.studentphnoentry.focus_set() return try: if not (self.validNumber(self.parentphnoentry.get()) and len(self.parentphnoentry.get()) == 10): raise ValueError except: m = messagebox.showerror("School Software", "Please enter valid Parent phone number", parent=self) self.parentphnoentry.focus_Set() return try: valid = validate_email(self.emailentry.get()) if not valid: raise ValueError except: m = messagebox.showerror("School Software", "Please enter valid E-mail address", parent=self) self.emailentry.focus_set() return try: if not (self.validNumber(self.parentofficephnoentry.get()) and len(self.parentofficephnoentry.get()) == 10): raise ValueError except: m = messagebox.showerror( "School Software", "Please enter valid Parent office phone number", parent=self) self.parentofficephnoentry.focus_set() return try: if not self.casteentry.get().isalpha(): raise ValueError except: m = messagebox.showerror("School Software", "Please enter valid caste", parent=self) self.casteentry.focus_set() return try: if (self.dateofbirthentry.get_date() >= date.today()): raise ValueError except: messagebox.showerror("School Software", "Invalid date of birth!!") return m = messagebox.askokcancel("School Software", " Are want to update data", parent=self) if m: query = """UPDATE master SET fname = ?, mname = ?, lname = ?, address = ?, student_phno = ?, parents_phno = ?, email = ?, parent_office_address = ?, parents_office_phno = ?, date_of_birth = ?, category = ?, blood_group = ?, cast = ? WHERE grno = ?""" self.conn.execute( query, (self.firstnameentry.get(), self.middlenameentry.get(), self.lastnameentry.get(), self.addressentry.get(1.0, END), self.studentphnoentry.get(), self.parentphnoentry.get(), self.emailentry.get(), self.parentofficeaddentry.get( 1.0, END), self.parentofficephnoentry.get(), self.dateofbirthentry.get_date(), self.selectcategoryentry.get(), self.bloodgroupentry.get(), self.casteentry.get(), self.data[0])) self.conn.commit() m = messagebox.showinfo("School Software", "Student data update succesfully", parent=self) self.des() else: self.des() def __init__(self, root, main_root): try: self.conn = sqlite3.connect('sinfo.db') except: m = messagebox.showerror("School Software", "Couldn't Connect With Database !", parent=self) self.main_root = main_root self.root = root Toplevel.__init__(self) self.lift() self.focus_force() self.grab_set() self.grab_release() self.bgclr1 = "#0080c0" self.bgclr2 = "#e7d95a" self.f1 = "Arial Bold" self.f2 = "times new roman" self.title("UPDATE STUDENT") self.config(background=self.bgclr1) self.geometry("1350x700+0+0") self.resizable(False, False) self.rollcounter = 0 self.detailcounter = 0 ##======================================================frame 1========================================================= imagel = Image.open("left-arrow.png") imagel = imagel.resize((60, 15)) imgl = ImageTk.PhotoImage(imagel) self.lf1 = LabelFrame(self, text="NAME", bd=2, bg=self.bgclr1, fg="black", font=(self.f1, 20), relief=GROOVE) self.lf1.place(x=0, y=0, height=150, width=1350) bb = Button(self.lf1, image=imgl, bg=self.bgclr2, bd=5, font=(self.f1, 20), command=self.backf) bb.place(x=10, y=10) ##=============================================frame 2================================================================== self.lf2 = LabelFrame(self, text="UPDATE STUDENT", bd=2, bg=self.bgclr1, fg="black", font=(self.f1, 20), relief=GROOVE) self.lf2.place(x=0, y=150, height=550, width=1350) self.stdlabel = Label(self.lf2, text="Standard", bd=2, bg=self.bgclr1, fg="black", font=(self.f1, 15), relief=GROOVE) self.stdlabel.place(x=50, y=20, height=30) query = """select standard from master """ a = self.conn.execute(query).fetchall() b = set(a) self.cals = [] for i in b: self.cals.append(str(i[0])) self.cals.sort() self.std_var = StringVar() self.stdentry = ttk.Combobox(self.lf2, state="readonly", textvariable=self.std_var, font=(self.f1, 10)) self.stdentry.place(x=300, y=20, height=30, width=200) self.stdentry['values'] = self.cals self.stdentry.bind("<<ComboboxSelected>>", self.rollno) self.std_var.set("Select Standard") self.submitbutton = Button(self.lf2, text="UPDATE", bg=self.bgclr2, font=(self.f2, 15), bd=5, command=self.update) self.submitbutton.place(x=1200, y=200, width=100, height=30) self.protocol("WM_DELETE_WINDOW", self.c_w) self.mainloop()
class Toplevel1: def __init__(self, top=None, root_parent=None, var=None): '''This class configures and populates the toplevel window. top is the toplevel containing window.''' _bgcolor = '#d9d9d9' # X11 color: 'gray85' _fgcolor = '#000000' # X11 color: 'black' _compcolor = '#d9d9d9' # X11 color: 'gray85' _ana1color = '#d9d9d9' # X11 color: 'gray85' _ana2color = '#ececec' # Closest X11 color: 'gray92' top.geometry("600x450+348+350") top.minsize(1, 1) top.maxsize(2545, 994) top.resizable(0, 0) top.title("Inquiry") top.configure(cursor="arrow") top.configure(highlightcolor="black") root.protocol("WM_DELETE_WINDOW", self.disable_event) self.var = var self.Labelframe_Inquiry = tk.LabelFrame(top) self.Labelframe_Inquiry.place(relx=0.025, rely=0.016, relheight=0.944, relwidth=0.95) self.Labelframe_Inquiry.configure(relief='groove') self.Labelframe_Inquiry.configure(text='''Inquiry''') self.root_parent = root_parent self.hidden_parent_window() self.Button_InuiryProceed = tk.Button( self.Labelframe_Inquiry, command=lambda: self.proceed_inquiry()) self.Button_InuiryProceed.place(relx=0.754, rely=0.753, height=31, width=73, bordermode='ignore') self.Button_InuiryProceed.configure(text='''Inquiry''') self.Button_InquiryCancel = tk.Button( self.Labelframe_Inquiry, command=lambda: self.client_exit()) self.Button_InquiryCancel.place(relx=0.526, rely=0.753, height=31, width=72, bordermode='ignore') self.Button_InquiryCancel.configure(text='''Back''') self.LabelName = tk.Label(self.Labelframe_Inquiry) self.LabelName.place(relx=0.017, rely=0.138, height=21, width=69) self.LabelName.configure(activebackground="#f9f9f9") self.LabelName.configure(text='''Name:''') self.LabelPhone = tk.Label(self.Labelframe_Inquiry) self.LabelPhone.place(relx=0.409, rely=0.138, height=21, width=69) self.LabelPhone.configure(activebackground="#f9f9f9") self.LabelPhone.configure(text='''Phone:''') self.LabelNote = tk.Label(self.Labelframe_Inquiry) self.LabelNote.place(relx=0.034, rely=0.23, height=21, width=59) self.LabelNote.configure(activebackground="#f9f9f9") self.LabelNote.configure(text='''Note:''') self.LabelGender = tk.Label(self.Labelframe_Inquiry) self.LabelGender.place(relx=0.017, rely=0.308, height=31, width=69) self.LabelGender.configure(activebackground="#f9f9f9") self.LabelGender.configure(text='''Gender:''') self.LabelDate = tk.Label(self.Labelframe_Inquiry) self.LabelDate.place(relx=0.403, rely=0.308, height=31, width=69) self.LabelDate.configure(activebackground="#f9f9f9") self.LabelDate.configure(text='''Date:''') self.EntryName = tk.Entry(self.Labelframe_Inquiry) self.EntryName.place(relx=0.12, rely=0.138, height=23, relwidth=0.284) self.EntryName.configure(background="white") self.EntryName.configure(cursor="arrow") self.EntryName.configure(font="TkFixedFont") self.EntryPhone = tk.Entry(self.Labelframe_Inquiry) self.EntryPhone.place(relx=0.53, rely=0.138, height=23, relwidth=0.284) self.EntryPhone.configure(background="white") self.EntryPhone.configure(cursor="arrow") self.EntryPhone.configure(font="TkFixedFont") self.EntryPhone.configure(selectbackground="#c4c4c4") self.EntryNote = tk.Entry(self.Labelframe_Inquiry) self.EntryNote.place(relx=0.121, rely=0.228, height=23, relwidth=0.694) self.EntryNote.configure(background="white") self.EntryNote.configure(cursor="arrow") self.EntryNote.configure(font="TkFixedFont") self.cal = DateEntry(top, width=12, background='darkblue', foreground='white', borderwidth=2) self.cal.pack(padx=10, pady=10) self.cal.place(relx=0.512, rely=0.345, height=23, relwidth=0.284) self.var.set(0) self.RadiobuttonMale = tk.Radiobutton(self.Labelframe_Inquiry, variable=self.var, value=1) self.RadiobuttonMale.place(relx=0.118, rely=0.322, relheight=0.053, relwidth=0.116) self.RadiobuttonMale.configure(justify='left') self.RadiobuttonMale.configure(text='''Male''') self.RadiobuttonFemale = tk.Radiobutton(self.Labelframe_Inquiry, variable=self.var, value=2) self.RadiobuttonFemale.place(relx=0.224, rely=0.32, relheight=0.053, relwidth=0.149) self.RadiobuttonFemale.configure(activebackground="#f9f9f9") self.RadiobuttonFemale.configure(justify='left') self.RadiobuttonFemale.configure(text='''Female''') self.LabelAddress = tk.Label(self.Labelframe_Inquiry) self.LabelAddress.place(relx=0.012, rely=0.391, height=21, width=69) self.LabelAddress.configure(text='''Address:''') self.EntryAddress = tk.Entry(self.Labelframe_Inquiry) self.EntryAddress.place(relx=0.125, rely=0.386, height=23, relwidth=0.694) self.EntryAddress.configure(background="white") self.EntryAddress.configure(cursor="arrow") self.EntryAddress.configure(font="TkFixedFont") self.EntryAddress.configure(selectbackground="#c4c4c4") def client_exit(self): root.destroy() self.get_back_parent_window() def disable_event(self): pass def proceed_inquiry(self): if (InternetConnection.is_connected_to_network()): name = self.EntryName.get() phone = self.EntryPhone.get() note = self.EntryNote.get() gender_value = self.var.get() gender = "Male" if (gender_value == 2): gender = "Female" date = self.cal.get_date() address = self.EntryAddress.get() if (len(name) != 0 and len(phone) != 0 and len(note) != 0 and len(address) != 0): data = { 'Name': name, 'Phone': phone, 'Note': note, 'Gender': gender, 'Date': str(date), 'Address': address } inuiry_results = Controller.inquiry_data(data) if (inuiry_results): messagebox.showinfo( "Inquiry Results", "Requested profile exists with Name:" + data['Name'] + ", Phone:" + data['Phone'] + ", Note:" + data['Note'] + ", Gender:" + data['Gender'] + ", Date:" + str(data['Date']) + ", Address:" + data['Address']) else: messagebox.showinfo( "Inquiry Results", "Requested profile not exists for the Name:" + data['Name'] + ", Phone:" + data['Phone'] + ", Note:" + data['Note'] + ", Gender:" + data['Gender'] + ", Date:" + str(data['Date']) + ", Address:" + data['Address']) else: messagebox.showwarning("Incomplete Details", "Please fill all the required fields!") else: messagebox.showwarning("No internet connection.", "Connect to the internet to do inquiries!") def hidden_parent_window(self): self.root_parent.withdraw() def get_back_parent_window(self): self.root_parent.update() self.root_parent.deiconify()
class oneway: def __init__(self, user, window): self.search_by = StringVar() self.search_txt = StringVar() self.list2 = [{ 'name': 'Select', 'price': [] }, { 'name': 'Economy', 'price': 3000 }, { 'name': 'Premium Economy', 'price': 4000 }, { 'name': 'Business Class', 'price': 5000 }, { 'name': 'First Class', 'price': 6000 }] # Get the names of the all flights name self.names = list(map(lambda x: x.get('name'), self.list2)) print(self.names) self.window = window self.user_id = user self.item_index = [] self.user = user self.window.title('User Form') self.window.geometry('1100x650+90+40') self.frame1 = Frame(self.window, bg='#37474F') self.frame1.place(x=0, y=0, height=650, width=1100) self.frame2 = Frame(self.frame1, bg='white', bd=1, relief=RIDGE) self.frame2.place(x=390, y=130, height=360, width=630) self.label_name = Label(self.frame1, text="One Way Flight", font=('Impact', 20, 'bold'), fg="white", bg='#37474F') self.label_name.place(x=300, y=15) time1 = StringVar() time1.set(time.strftime('%H:%M:%S:%p')) self.ent_where = Label(self.frame1, font=('times new roman', 25), fg='white', bg='#37474F', textvariable=time1) self.ent_where.place(x=60, y=5) self.label_name = Label(self.frame1, text="Where From:", font=('Goudy old style', 12, 'bold'), fg='white', bg='#37474F') self.label_name.place(x=50, y=90) self.ent_where = Entry(self.frame1, font=('times new roman', 9), bg='lightgray') self.ent_where.place(x=170, y=90, width=200, height=30) self.label_name = Label(self.frame1, text="Where To:", font=('Goudy old style', 12, 'bold'), fg='white', bg='#37474F') self.label_name.place(x=50, y=140) self.ent_to = Entry(self.frame1, font=('times new roman', 9), bg='lightgray') self.ent_to.place(x=170, y=140, width=200, height=30) self.label_name = Label(self.frame1, text="Departure Date:", font=('Goudy old style', 12, 'bold'), fg='white', bg='#37474F') self.label_name.place(x=50, y=190) self.ent_dpt = DateEntry(self.frame1, width=12, background='darkblue', foreground='white', borderwidth=2) self.ent_dpt.place(x=170, y=190, width=200) ttk.Button(self.frame1, text="ok") self.combo = Label(self.frame1, text="Age Selection:", font=('Goudy old style', 12, 'bold'), fg='white', bg='#37474F').place(x=50, y=240) self.txt_combo = ttk.Combobox(self.frame1, font=('times new roman', 9), state='readonly', justify=CENTER) self.txt_combo['values'] = ('select', 'Adult', 'Children', 'Infant', 'Old age') self.txt_combo.place(x=170, y=240) self.txt_combo.current(0) self.label_name = Label(self.frame1, text="Count:", font=('Goudy old style', 12, 'bold'), fg='white', bg='#37474F') self.label_name.place(x=50, y=290) self.ent_count = Entry(self.frame1, font=('times new roman', 9), bg='lightgray') self.ent_count.place(x=170, y=290, width=200, height=30) self.classcombo = Label(self.frame1, text="Class Selection:", font=('Goudy old style', 12, 'bold'), fg='white', bg='#37474F').place(x=50, y=340) self.txt_classcombo = ttk.Combobox(self.frame1, font=('times new roman', 9), state='readonly', justify=CENTER, values=self.names) # self.txt_classcombo['values'] = ('Economy', 'Premium Economy', 'Business Class', 'First Class') self.txt_classcombo.bind('<<ComboboxSelected>>', self.fetch_data) self.txt_classcombo.place(x=170, y=340) self.txt_classcombo.current(0) self.label_price = Label(self.frame1, text="Price:", font=('Goudy old style', 12, 'bold'), fg='white', bg='#37474F') self.label_price.place(x=50, y=390) self.ent_price = Entry(self.frame1, font=('times new roman', 9), bg='lightgray') self.ent_price.place(x=170, y=390, width=200, height=30) self.ent_price.insert(0, '') self.flight = Label(self.frame1, text="Flight Selection:", font=('Goudy old style', 12, 'bold'), fg='white', bg='#37474F').place(x=50, y=440) self.txt_flight = ttk.Combobox(self.frame1, font=('times new roman', 9), state='readonly', justify=CENTER) self.txt_flight['values'] = ('select', 'Buddha Air', 'Yeti Airlines', 'Surya Airline', 'Nepal Airlines', 'Tara Airlines') self.txt_flight.place(x=170, y=440) self.txt_flight.current(0) self.item_entry = Entry(self.window, textvariable=self.search_txt) self.item_entry.place(x=400, y=90) self.txt_combo_1 = ttk.Combobox(self.frame1, textvariable=self.search_by, font=('times new roman', 9), state='readonly', justify=CENTER) self.txt_combo_1['values'] = ('flight_name', 'destination', 'class_selection') self.txt_combo_1.place(x=600, y=90) self.txt_combo_1.current(0) self.btn_add = Button(self.window, text="Search", command=self.Search_items) self.btn_add.place(x=800, y=90) self.btn_book = Button(self.frame1, text="Book Flight", relief=RAISED, bg='#001C55', font=('arial', 14, 'bold'), fg='white', command=self.book_flight) self.btn_book.place(x=100, y=550) self.btn_book = Button(self.frame1, text="Cancel Flight", relief=RAISED, bg='#00072D', font=('arial', 14, 'bold'), fg='white', command=self.delete_item) self.btn_book.place(x=540, y=550) self.btn_book = Button(self.frame1, text="Bill", relief=RAISED, bg='#00072D', font=('arial', 14, 'bold'), fg='white', command=self.generate_bill) self.btn_book.place(x=700, y=550) self.btn_book = Button(self.frame1, text="Update", relief=RAISED, bg='#00072D', font=('arial', 14, 'bold'), fg='white', command=self.update) self.btn_book.place(x=800, y=550) scroll_x = Scrollbar(self.frame2, orient=HORIZONTAL) self.bg1 = ImageTk.PhotoImage( file= 'C:\\Users\\Dell\\PycharmProjects\\untitled3\\project\\Webp.net-resizeimage (3).png' ) self.btn4 = Button(self.window, image=self.bg1, text='Logout', relief=RAISED, bg='#37474F', font=('arial', 14, 'bold'), fg='white', bd=0, command=exit) self.btn4.place(x=1000, y=7, width=90) self.item_tree = ttk.Treeview( self.frame2, selectmode='browse', columns=('ID', 'Where from', 'Where to', 'Departure Date', 'Age Selection', 'Count', 'Class Selection', 'User_id', 'Flight_Name', 'Price'), xscrollcommand=scroll_x.set) self.item_tree.pack(fill=BOTH, expand=1) #self.item_tree.place(x=390,y=120) scroll_x.pack(side=BOTTOM, fill=X) scroll_x.config(command=self.item_tree.xview) self.item_tree['show'] = 'headings' self.item_tree.column('ID', width=90, anchor='center') self.item_tree.column('Where from', width=90, anchor='center') self.item_tree.column('Where to', width=90, anchor='center') self.item_tree.column('Departure Date', width=90, anchor='center') self.item_tree.column('Age Selection', width=90, anchor='center') self.item_tree.column('Count', width=90, anchor='center') self.item_tree.column('Class Selection', width=90, anchor='center') self.item_tree.column('User_id', width=90, anchor='center') self.item_tree.column('Flight_Name', width=90, anchor='center') self.item_tree.column('Price', width=90, anchor='center') self.item_tree.heading('ID', text="ID") self.item_tree.heading('Where from', text="Where from") self.item_tree.heading('Where to', text="Where to") self.item_tree.heading('Departure Date', text="Departure Date") self.item_tree.heading('Age Selection', text="Age Selection") self.item_tree.heading('Count', text="Count") self.item_tree.heading('Class Selection', text="Class Selection") self.item_tree.heading('User_id', text="User ID") self.item_tree.heading('Flight_Name', text="Flight_Name") self.item_tree.heading('Price', text="Price") # scroll_x = Scrollbar(manage_teacher_frame2_1, orient=HORIZONTAL) # # scroll_x.pack(side=BOTTOM, fill=X) # scroll_x.config(command=self.teacher_tree.xview) # scroll_y.pack(side=RIGHT, fill=Y) # self.item_treeScrollbar=ttk.Scrollbar(self.window,orient='horizontal',command=self.item_tree.xview) # self.item_tree.configure(xscroll=self.item_treeScrollbar.set) # self.item_treeScrollbar.pack(side=BOTTOM,fill=X) self.show_in_treeview() def clear(self): self.ent_where.delete(0, END) self.ent_to.delete(0, END) self.ent_dpt.delete(0, END) self.txt_combo.set('') self.ent_count.delete(0, END) self.txt_classcombo.set('') # def logout(self): # messagebox.showinfo('Message','Do you want to log out') # import login2 # self.window.withdraw() # dd = Toplevel(self.window) # # login2.Login(dd) def update(self): selected_item = self.item_tree.selection()[0] self.item_index = self.item_tree.item(selected_item, 'text') item_data = self.item_tree.item(selected_item, 'values') if item_data[0] == '': messagebox.showerror('error', 'select a row') else: if form2.Item_dlt().update_items(item_data[0], self.ent_where.get(), self.ent_to.get(), self.ent_dpt.get_date(), self.txt_combo.get(), self.ent_count.get(), self.txt_classcombo.get(), self.txt_flight.get(), self.ent_price.get(), self.user_id): messagebox.showinfo("Item", "Booking Updated") self.show_in_treeview() else: messagebox.showerror("Error", "Booking Details cannot be added") def book_flight(self): if self.ent_where.get() == "" or self.ent_to.get( ) == "" or self.ent_dpt.get() == "" or self.txt_combo.get( ) == "" or self.ent_count.get() == "" or self.txt_classcombo.get( ) == "": messagebox.showerror('Error', 'please enter all required fields') else: try: form2.oneway_flight().oneway_reg(self.ent_where.get(), self.ent_to.get(), self.ent_dpt.get_date(), self.txt_combo.get(), self.ent_count.get(), self.txt_classcombo.get(), self.user_id, self.txt_flight.get(), self.ent_price.get()) messagebox.showinfo('success', 'Register successfull', parent=self.window) self.show_in_treeview() #self.clear() except Exception as e: messagebox.showerror('error', f'error:{str(e)}', parent=self.window) def fetch_data(self, *args): va = filter(lambda x: x.get('name') == self.txt_classcombo.get(), self.list2) self.ent_price.delete(0, END) self.ent_price.insert(0, next(va).get('price')) def select_item(self, event): selected_item = self.item_tree.selection()[0] self.item_index = self.item_tree.item(selected_item, 'text') item_data = self.item_tree.item(selected_item, 'values') self.ent_where.delete(0, END) self.ent_where.insert(0, item_data[1]) self.ent_to.delete(0, END) self.ent_to.insert(0, item_data[2]) #dpt_date_f=datetime.datetime.strptime(int(item_data[2]/3), '%Y-%m-%d').strftime('%m/%d/%y') dpt_date = datetime.datetime(int(item_data[3][0:4]), int(item_data[3][5:7]), int(item_data[3][8:10])) dpt_date_f = dpt_date.strftime('%m/%d/%y') self.ent_dpt.set_date(dpt_date_f) self.txt_combo.set(item_data[4]) self.txt_combo.current() self.ent_count.delete(0, END) self.ent_count.insert(0, item_data[5]) self.txt_classcombo.set(item_data[6]) self.txt_classcombo.current() self.txt_flight.set(item_data[8]) self.txt_flight.current() self.ent_price.delete(0, END) self.ent_price.insert(0, item_data[9]) def show_in_treeview(self): # # qry = 'select * from oneway where user_id=%s' # self.my_cursor.execute(qry,(self.user_id)) row = form2.show_flight().show_in_treeview(self.user_id) # spot_marker = 0 # while spot_marker < len(row): # for num in range(spot_marker, len(row)): # if row[num] < row[spot_marker]: # row[spot_marker], row[num] = row[num], row[spot_marker] # spot_marker += 1 # print(row) if row: self.item_tree.delete(*self.item_tree.get_children()) for i in row: #self.tree.item(idx)['text'] self.item_tree.insert("", "end", text=i[0], value=(i[0], i[1], i[2], i[3], i[4], i[5], i[6], i[7], i[8], i[9])) # self.my_connection.commit() self.item_tree.bind('<Double-1>', self.select_item) def Search_items(self): con = mysql.connector.connect(host='localhost', user='******', password='', database='register') cur = con.cursor() values = ( str(self.search_by.get()), '"{}"'.format(str(self.search_txt.get() + '%')), ) qry = ( f"SELECT ID,destination,source,dpt,combo,count_no,class_selection,user_id,flight_name,price FROM oneway WHERE user_id={self.user_id} AND {values[0]} LIKE {values[1]} " ) cur.execute(qry) rows = cur.fetchall() if len(rows) != 0: self.item_tree.delete(*self.item_tree.get_children()) for row in rows: self.item_tree.insert("", END, values=row) con.commit() def valid(self): if self.ent_where.get() == "" or self.ent_to.get( ) == "" or self.ent_dpt.get() == "" or self.txt_combo.get( ) == "" or self.ent_count.get() == "" or self.txt_classcombo.get( ) == "": messagebox.showerror('Error', 'please enter all required fields') return False else: return True def delete_item(self): selected_item = self.item_tree.selection()[0] item_data = self.item_tree.item(selected_item, 'text') index = item_data if form2.Item_dlt().delete_items(index): messagebox.showinfo('Item', 'Item Deleted') self.show_in_treeview() # selected_item = self.item_tree.selection() # self.item_tree.delete(selected_item) else: messagebox.showerror("Error", "Item cannot be deleted", parent=self.window) def generate_bill(self): all_orders = self.item_tree.get_children() bill_list = [] total = 0 # tbl=self.order_tree.item(all_orders[0],'values')[0] # name=self.order_tree.item(all_orders[1],'values')[1] for i in all_orders: order = self.item_tree.item(i, 'values') amt = float(order[5]) * float(order[9]) bill_list.append((order[2], order[3], order[4], order[5], order[6], order[8], order[9], amt)) total += amt BillView(bill_list, total, self.user)
class mainWindow: def __init__(self, window): self.window = window self.labelFrame = tk.Frame(window, width=330, height=50) self.labelFrame.pack_propagate(0) self.header = tk.Label(self.labelFrame, text='CDAC1', fg='#777777', font=("Impact", 26), anchor=tk.NW) self.header.pack() self.labelFrame.pack(side=tk.TOP, fill=tk.X) # mainFrame divided in 2 parts for video capture and graph self.mainFrame = tk.Frame(window, height=500, width=self.window.winfo_width()) self.mainFrame.pack_propagate(0) # self.mainFrame.bind("<Configure>", self.configure) self.imageNb = ttk.Notebook(self.mainFrame, width=600, height=500) #tab1 for cam1 self.VideoFrame1 = tk.Frame(self.imageNb, width=600, height=500) # self.imageFrame.pack_propagate(0) self.imageNb.add(self.VideoFrame1, text="Cam1") #tab2 for cam2 self.VideoFrame2 = tk.Frame(self.imageNb, width=600, height=500) self.imageNb.add(self.VideoFrame2, text="Cam2") #tab2 for cam2 self.VideoFrame3 = tk.Frame(self.imageNb, width=600, height=500) self.imageNb.add(self.VideoFrame3, text="Cam3") #tab2 for cam2 self.VideoFrame4 = tk.Frame(self.imageNb, width=600, height=500) self.imageNb.add(self.VideoFrame4, text="Cam4") #4 canvases for 4 tabs ,each canvas is placed inside the respective frame self.Canvas1 = tk.Canvas(self.VideoFrame1, width=600, height=500) self.Canvas2 = tk.Canvas(self.VideoFrame2, width=600, height=500) self.Canvas3 = tk.Canvas(self.VideoFrame3, width=600, height=500) self.Canvas4 = tk.Canvas(self.VideoFrame4, width=600, height=500) #pack the canvas inside the frame self.Canvas1.pack(fill="both", expand=1) self.Canvas2.pack(fill="both", expand=1) self.Canvas3.pack(fill="both", expand=1) self.Canvas4.pack(fill="both", expand=1) # self.imageNb.pack(expand=1, fill='y') self.imageNb.grid(row=0, column=0) self.imageNb.bind("<<NotebookTabChanged>>", self.tabchanged) self.mainFrame.pack(fill=tk.BOTH, side=tk.TOP) #Graph part # Frame2 shows graph and is divided in two tabs self.Frame2 = ttk.Notebook(self.mainFrame) self.graphFrame2 = ttk.Frame(self.Frame2) self.Frame2.add(self.graphFrame2, text="Statistics") self.graphFrame1 = ttk.Frame(self.Frame2) self.Frame2.add(self.graphFrame1, text="Custom input") self.InputFrame1 = ttk.Frame(self.graphFrame1, width=300, height=100) self.InputFrame1.pack(side=tk.TOP) self.inputDate1 = DateEntry(self.InputFrame1, width=12, background='darkblue', foreground='white', borderwidth=2) self.inputDate1.grid(row=0, column=1, padx=2) self.inputDate1.focus_set() self.label1 = ttk.Label(self.InputFrame1, text="Enter date1") self.label1.grid(row=0, column=0) self.inputDate2 = DateEntry(self.InputFrame1, width=12, background='darkblue', foreground='white', borderwidth=2) self.inputDate2.grid(row=1, column=1, padx=2) self.inputDate2.focus_set() self.label2 = tk.Label(self.InputFrame1, text="Enter date2") self.label2.grid(row=1, column=0) self.button1 = tk.Button(self.InputFrame1, text="Show Graph") self.button1.grid(row=3, column=1, padx=30, pady=10) self.v = tk.IntVar() self.v.set(0) # initializing the choice, i.e. Python options = ["Line Graph", "Bar Graph"] for val, option in enumerate(options): tk.Radiobutton(self.InputFrame1, text=option, padx=20, variable=self.v, value=val).grid(row=2, column=val, padx=30) self.fig = plt.figure(1, figsize=(10, 8), dpi=55) self.canvas = FigureCanvasTkAgg(self.fig, master=self.graphFrame1) self.InputFrame2 = ttk.Frame(self.graphFrame2, width=300, height=100) self.InputFrame2.pack(side=tk.TOP) self.inputDate3 = DateEntry(self.InputFrame2, width=12, background='darkblue', foreground='white', borderwidth=2) self.inputDate3.grid(row=0, column=1, padx=2) self.label3 = ttk.Label(self.InputFrame2, text="Enter date") self.label3.grid(row=0, column=0) self.button2 = tk.Button(self.InputFrame2, text="Show Graph") self.button2.grid(row=4, column=1, padx=30, pady=10) self.v1 = tk.IntVar() self.v1.set(0) options1 = ["Line Graph", "Bar Graph"] for val, option in enumerate(options1): tk.Radiobutton(self.InputFrame2, text=option, padx=20, variable=self.v1, value=val).grid(row=2, column=val, padx=30) self.v2 = tk.IntVar() self.v2.set(0) options2 = ["Daily", "Weekly", "Monthly"] for val, option in enumerate(options2): tk.Radiobutton(self.InputFrame2, text=option, padx=20, variable=self.v2, value=val).grid(row=3, column=val, padx=10) self.fig1 = plt.figure(2, figsize=(10, 8), dpi=55) self.canvas5 = FigureCanvasTkAgg(self.fig1, master=self.graphFrame2) #uncomment below code for ip cameras # make four video captures by getting urls from database # linkarray = database.getVideoLinks() # print(linkarray) # self.link_arr = linkarray self.cap0 = cv2.VideoCapture(0) self.cap1 = cv2.VideoCapture(0) self.cap2 = cv2.VideoCapture(0) self.cap3 = cv2.VideoCapture(0) # 4 connectors for 4 different databases self.d1 = database.db("cam1") self.d2 = database.db("cam2") self.d3 = database.db("cam3") self.d4 = database.db("cam4") # Progress Bar and refresh button for showing disk space self.progressLabel = tk.Label(window, text="Used Space") self.progressLabel.pack() self.freeSpaceBar = Progressbar(window, orient=tk.HORIZONTAL, length=100, mode='determinate') self.freeSpaceBar.pack() self.refreshButton = tk.Button(window, text="Refresh") self.refreshButton.pack() self.refreshButton.bind("<Button-1>", self.findSpace) self.afterId = 0 # self.showLiveAll() def findSpace(self, event): total, used, free = shutil.disk_usage("/") self.freeSpaceBar['value'] = (used / total) * 100 # Function is used to display the default data for the current date def func(self, obj): self.Frame2.grid(row=0, column=1) self.fig.clf() plt.figure(1) y = obj.currentdata() if self.v.get() == 0: plt.plot(np.array(y)[:, 1], np.array(y)[:, 0], color='blue') else: plt.bar(np.array(y)[:, 1], np.array(y)[:, 0], color='blue', width=.5) plt.xticks(rotation=45) plt.title("Hourly Count", fontsize=10) plt.ylabel("No of people", fontsize=10) plt.xlabel("Hour", fontsize=10) self.canvas.get_tk_widget().pack(expand=True, fill=tk.BOTH, side=tk.TOP) # self.canvas.get_tk_widget().grid(row=0, column=0) self.canvas.draw() self.fig1.clf() plt.figure(2) if self.v1.get() == 0: plt.plot(np.array(y)[:, 1], np.array(y)[:, 0], color='blue') else: plt.bar(np.array(y)[:, 1], np.array(y)[:, 0], color='blue', width=.5) plt.xticks(rotation=45) plt.title("Hourly Count", fontsize=10) plt.ylabel("No of people", fontsize=10) plt.xlabel("Hour", fontsize=10) self.canvas5.get_tk_widget().pack(expand=True, fill=tk.BOTH, side=tk.TOP) self.canvas5.draw() # Used to display video capture for camera1 def Enlarge1(self): try: _, frame = self.cap0.read() # frame = cv2.flip(frame, 1) frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) self.photo = ImageTk.PhotoImage( image=Image.fromarray(frame).resize((600, 500))) self.Canvas1.create_image(0, 0, image=self.photo, anchor=tk.NW) self.Canvas1.create_line(0, 300, 700, 300, fill="green") self.Canvas1.create_text(500, 400, text="Apoorv", fill="red") self.afterId = self.imageNb.after(15, self.Enlarge1) except: # self.cap0 = cv2.VideoCapture(self.link_arr[0]) self.cap0 = cv2.VideoCapture(0) self.afterId = self.imageNb.after( 15, self.Enlarge1 ) #collects the id thats required to stop the execution of this function #function is stopped and started in self.tabchanged () # Used to display video capture for camera2 def Enlarge2(self): try: _, frame = self.cap1.read() # frame = cv2.flip(frame, 1) frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) self.photo = ImageTk.PhotoImage( image=Image.fromarray(frame).resize((600, 500))) self.Canvas2.create_image(0, 0, image=self.photo, anchor=tk.NW) self.Canvas2.create_line(0, 300, 700, 300, fill="green") self.Canvas2.create_text(500, 400, text="Apoorv", fill="red") self.afterId = self.imageNb.after(15, self.Enlarge2) except: # self.cap1 = cv2.VideoCapture(self.link_arr[1]) self.cap1 = cv2.VideoCapture(0) self.afterId = self.imageNb.after(15, self.Enlarge2) # Used to display video capture for camera3 def Enlarge3(self): try: _, frame = self.cap2.read() # frame = cv2.flip(frame, 1) frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) self.photo = ImageTk.PhotoImage( image=Image.fromarray(frame).resize((600, 500))) self.Canvas3.create_image(0, 0, image=self.photo, anchor=tk.NW) self.Canvas3.create_line(0, 300, 700, 300, fill="green") self.Canvas3.create_text(500, 400, text="Apoorv", fill="red") self.afterId = self.imageNb.after(15, self.Enlarge3) except: # self.cap2 = cv2.VideoCapture(self.link_arr[2]) self.cap2 = cv2.VideoCapture(0) self.afterId = self.imageNb.after(15, self.Enlarge3) # Used to display video capture for camera4 def Enlarge4(self): try: _, frame = self.cap3.read() # frame = cv2.flip(frame, 1) frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) self.photo = ImageTk.PhotoImage( image=Image.fromarray(frame).resize((600, 500))) self.Canvas4.create_image(0, 0, image=self.photo, anchor=tk.NW) self.Canvas4.create_line(0, 300, 700, 300, fill="green") self.Canvas4.create_text(500, 400, text="Apoorv", fill="red") self.afterId = self.imageNb.after(15, self.Enlarge4) except: # self.cap3 = cv2.VideoCapture(self.link_arr[2]) self.cap3 = cv2.VideoCapture(0) self.afterId = self.imageNb.after(15, self.Enlarge4) # Used to display video capture for all cameras # def get_multiple_stream(cap): # print("here") # return cap.read() def tabchanged(self, event): if event.widget.index("current") == 0: try: self.imageNb.after_cancel( self.afterId ) #stops the previously running enlarge function on the notebook print("cam1") self.func(self.d1) self.button1.bind( "<Button-1>", lambda event, ob1=self.d1: self.plot(event, ob1)) self.button2.bind( "<Button-1>", lambda event, ob1=self.d1: self.plot1(event, ob1)) self.Enlarge1() except: self.func(self.d1) self.button1.bind( "<Button-1>", lambda event, ob1=self.d1: self.plot(event, ob1)) self.button2.bind( "<Button-1>", lambda event, ob1=self.d1: self.plot1(event, ob1)) print("cam1") self.Enlarge1() elif event.widget.index("current") == 1: try: self.imageNb.after_cancel(self.afterId) print("cam2") #to show graphs in Frame2 self.func(self.d2) self.button1.bind( "<Button-1>", lambda event, obj=self.d2: self.plot(event, obj)) self.button2.bind( "<Button-1>", lambda event, obj=self.d2: self.plot1(event, obj)) #to show video self.Enlarge2() except: self.func(self.d2) self.button1.bind( "<Button-1>", lambda event, obj=self.d2: self.plot(event, obj)) self.button2.bind( "<Button-1>", lambda event, obj=self.d2: self.plot1(event, obj)) print("cam2") self.Enlarge2() elif event.widget.index("current") == 2: try: self.func(self.d3) self.button1.bind( "<Button-1>", lambda event, obj=self.d3: self.plot(event, obj)) self.button2.bind( "<Button-1>", lambda event, obj=self.d3: self.plot1(event, obj)) self.imageNb.after_cancel(self.afterId) print("cam3") self.Enlarge3() except: self.func(self.d3) self.button1.bind( "<Button-1>", lambda event, obj=self.d3: self.plot(event, obj)) self.button2.bind( "<Button-1>", lambda event, obj=self.d3: self.plot1(event, obj)) print("cam3") self.Enlarge3() else: try: self.func(self.d4) self.button1.bind( "<Button-1>", lambda event, obj=self.d4: self.plot(event, obj)) self.button2.bind( "<Button-1>", lambda event, obj=self.d4: self.plot1(event, obj)) self.imageNb.after_cancel(self.afterId) print("cam1") self.Enlarge4() except: self.func(self.d4) self.button1.bind( "<Button-1>", lambda event, obj=self.d4: self.plot(event, obj)) self.button2.bind( "<Button-1>", lambda event, obj=self.d4: self.plot1(event, obj)) print("cam4") self.Enlarge4() # Used to disappear video capture if width decreases below a threshold # Function used to plot graph for custom inputs def plot(self, event, obj): plt.figure(1) self.fig.clf() inputDateStr1 = str(self.inputDate1.get_date()) inputDateStr2 = str(self.inputDate2.get_date()) inputDateStr1 = inputDateStr1 + ' 00:00:00' inputDateStr2 = inputDateStr2 + ' 00:00:00' date1 = datetime.strptime(inputDateStr1, "%Y-%m-%d %H:%M:%S") date2 = datetime.strptime(inputDateStr2, "%Y-%m-%d %H:%M:%S") delta = date2 - date1 interval1 = timedelta(days=1) interval2 = timedelta(days=365 / 12) if delta < interval1: inputDateStr1 = "'" + inputDateStr1 + "'" inputDateStr2 = "'" + inputDateStr2 + "'" y = obj.hourlyCount(inputDateStr1, inputDateStr2) if self.v.get() == 0: plt.plot(np.array(y)[:, 1], np.array(y)[:, 0], color='blue') else: plt.bar(np.array(y)[:, 1], np.array(y)[:, 0], color='blue', width=.5) plt.xticks(rotation=45) plt.title("Daily Count", fontsize=10) plt.ylabel("No of people", fontsize=10) plt.xlabel("Hours", fontsize=10) self.canvas.draw() elif delta < interval2: inputDateStr1 = "'" + inputDateStr1 + "'" inputDateStr2 = "'" + inputDateStr2 + "'" y = obj.weeklyCount(inputDateStr1, inputDateStr2) if self.v.get() == 0: plt.plot(np.array(y)[:, 1], np.array(y)[:, 0], color='blue') else: plt.bar(np.array(y)[:, 1], np.array(y)[:, 0], color='blue', width=.5) plt.xticks(rotation=45) plt.title("Daily Count", fontsize=10) plt.ylabel("No of people", fontsize=10) plt.xlabel("Date", fontsize=10) self.canvas.draw() else: inputDateStr1 = "'" + inputDateStr1 + "'" inputDateStr2 = "'" + inputDateStr2 + "'" y = obj.monthlyCount(inputDateStr1, inputDateStr2) if self.v.get() == 0: plt.plot(np.array(y)[:, 1], np.array(y)[:, 0], color='blue') else: plt.bar(np.array(y)[:, 1], np.array(y)[:, 0], color='blue', width=.5) plt.xticks(rotation=45) plt.title("Daily Count", fontsize=10) plt.ylabel("No of people", fontsize=10) plt.xlabel("Month", fontsize=10) self.canvas.draw() def plot1(self, event, obj): plt.figure(2) self.fig1.clf() inputDateStr1 = str(self.inputDate3.get_date()) inputDateStr1 = inputDateStr1 + ' 00:00:00' if self.v2.get() == 0: inputDateStr1 = "'" + inputDateStr1 + "'" y = obj.hourlyCount(inputDateStr1, inputDateStr1) if self.v1.get() == 0: plt.plot(np.array(y)[:, 1], np.array(y)[:, 0], color='blue') else: plt.bar(np.array(y)[:, 1], np.array(y)[:, 0], color='blue', width=.5) plt.xticks(rotation=45) plt.title("Daily Count", fontsize=10) plt.ylabel("No of people", fontsize=10) plt.xlabel("Hours", fontsize=10) self.canvas5.draw() elif self.v2.get() == 1: inputDateStr1 = "'" + inputDateStr1 + "'" y = obj.weekdata(inputDateStr1) if self.v1.get() == 0: plt.plot(np.array(y)[:, 1], np.array(y)[:, 0], color='blue') else: plt.bar(np.array(y)[:, 1], np.array(y)[:, 0], color='blue', width=.5) plt.xticks(rotation=45) plt.title("Daily Count", fontsize=10) plt.ylabel("No of people", fontsize=10) plt.xlabel("Date", fontsize=10) self.canvas5.draw() else: inputDateStr1 = "'" + inputDateStr1 + "'" y = obj.monthdata(inputDateStr1) if self.v1.get() == 0: plt.plot(np.array(y)[:, 1], np.array(y)[:, 0], color='blue') else: plt.bar(np.array(y)[:, 1], np.array(y)[:, 0], color='blue', width=.5) plt.xticks(rotation=45) plt.title("Daily Count", fontsize=10) plt.ylabel("No of people", fontsize=10) plt.xlabel("Month", fontsize=10) self.canvas5.draw()
class ReportMenu(Frame): def __init__(self, reportMenu, main): """ Initialise the Frame. """ self.master = reportMenu self.mainW = main def create_widgets(self): self.text = Label(self.master, text="ตั้งแต่ วันที่", anchor='w', justify='left', height=1, font=1) self.text.place(relx=0.3, rely=0.3, anchor='center') self.text1 = Label(self.master, text="ถึง วันที่", anchor='w', justify='left', height=1, font=1) self.text1.place(relx=0.3, rely=0.5, anchor='center') self.text2 = Entry(self.master, width=25) self.datestar = DateEntry(self.master, width=25, bg="darkblue", fg="white", year=2021) self.datestar.place(relx=0.6, rely=0.3, anchor='center') self.dateend = DateEntry(self.master, width=25, bg="darkblue", fg="white", year=2021) self.dateend.place(relx=0.6, rely=0.5, anchor='center') self.button_confirm = Button(self.master, text="ยืนยัน", width=10, height=1, command=self.exportFile) self.button_confirm.place(relx=0.3, rely=0.8, anchor='center') self.button_back = Button(self.master, text="ย้อนกลับ", width=10, height=1, command=self.master.destroy) self.button_back.place(relx=0.6, rely=0.8, anchor='center') def exportFile(self): #print(str(self.datestar.get_date().year)) path = "C:\Program Files\\BillRamen\\" DayStart = str(self.datestar.get_date().year) + str( self.datestar.get_date().month) + str(self.datestar.get_date().day) DayEnd = str(self.dateend.get_date().year) + str( self.dateend.get_date().month) + str(self.dateend.get_date().day) f = open(path + DayStart + " - " + DayEnd + " Report.txt", "w", encoding="utf-8") f.write("---------------------------\n") f.write("รายงานประจำวัน\n") f.write(" ร้าน ราแมะราแมะ\n") f.write("วันเริ่มต้น:\t" + str(self.datestar.get_date()) + "\n") f.write("วันที่สิ้นสุด:\t" + str(self.dateend.get_date()) + "\n") f.write("---------------------------\n") #f.write("รายการ จำนวน ราคา\n") yS = int(self.datestar.get_date().year) mS = int(self.datestar.get_date().month) dS = int(self.datestar.get_date().day) yE = int(self.dateend.get_date().year) mE = int(self.dateend.get_date().month) dE = int(self.dateend.get_date().day) date_obj = datetime(int(yS), int(mS), int(dS)) s = open(path + "Report\\" + str(yS) + str(mS) + str(dS) + " Report.txt", "r", encoding="utf-8") f.write(s.read()) f.write("\n") s.close() dS += 1 while date_obj != datetime(int(yE), int(mE), int(dE)): try: date_obj = datetime(int(yS), int(mS), int(dS)) #print(path + str(yS) + str(mS) + str(dS) + " Report.txt") s = open(path + "Report\\" + str(yS) + str(mS) + str(dS) + " Report.txt", "r", encoding="utf-8") f.write(s.read()) f.write("\n") s.close() dS += 1 except: dS = 1 mS += 1 if (mS > 12): mS = 1 yS += 1 f.close() os.startfile(path + DayStart + " - " + DayEnd + " Report.txt")
class change_table(tk.Frame): """Class for reminders creation and modification.""" def __init__(self, master=None, true_master=None, new_num=-1, **kw): """Initialize the window.""" super().__init__(master=true_master, **kw) self.master = master self.true_master = true_master self.num = new_num self.create_widg() def hour_change(self, movement): """Change hour field by these rules.""" day_delta = datetime.timedelta(days=1) where_to = int(movement) if (self.hour.get() != ''): num = int(self.hour.get()) if (where_to == -1): if (num < 23): self.hour.set(num + 1) elif (num == 23): self.hour.set(0) self.cal.set_date(self.cal.get_date() + day_delta) elif (where_to == 1): if (num > 0): self.hour.set(num - 1) elif (num == 0): self.cal.set_date(self.cal.get_date() - day_delta) self.hour.set(23) else: self.hour.set(0) def minute_change(self, movement): """Change minutes field by these rules.""" where_to = int(movement) if (self.minute.get() != ''): num = int(self.minute.get()) if (where_to == -1): if (num < 59): self.minute.set(num + 1) elif (num == 59): self.minute.set(0) self.hour_change(-1) elif (where_to == 1): if (num > 0): self.minute.set(num - 1) elif (num == 0): self.minute.set(59) self.hour_change(1) else: self.minute.set(0) def on_closing(self): """Do some actions if window is closing.""" if self.changed(): if tk.messagebox.askyesno(_("Quit"), _("Do you want to quit?\n" "To save the changes," "you have to press OK")): self.true_master.destroy() else: self.true_master.destroy() def changed(self): """Define if the window content changed.""" new_time = datetime.time(int(self.hour.get()), int(self.minute.get())) new_date = self.cal.get_date() in_date = datetime.datetime(new_date.year, new_date.month, new_date.day, new_time.hour, new_time.minute, new_time.second) return (((self.cur_description) != ( self.ent.get())) and ( self.ent.get() != '')) or ( ' '.join(self.cur_date_time) != str(in_date))\ and (in_date) def create_widg(self): """Creation of window widgets.""" self.tim_lab = tk.Label(self, text=_("Date:")) self.tim_lab.grid(row=0, column=0, sticky="NEWS", columnspan=4, padx=4) self.cal = DateEntry(self, width=10, background='darkblue', foreground='white', borderwidth=2) self.cal.grid(column=3, row=0, sticky="NEWS", columnspan=10, ipady=4, pady=10) self.hour = tk.StringVar() self.minute = tk.StringVar() hours = self.register(self.master.hours) minutes = self.register(self.master.minutes) self.tim_lab = tk.Label(self, text=_("Time:")) self.tim_lab.grid(row=2, column=0, sticky="NEWS", columnspan=3, padx=4) self.tim_h = tk.Entry(self, validate='key', textvariable=self.hour, validatecommand=(hours, '%P'), width=2, justify='center') self.tim_h.grid(row=2, column=3, sticky="E", ipady=2, pady=10) self.hour_scroll = tk.Scrollbar(self, command=self.hour_change) self.hour_scroll.grid(row=2, column=4, sticky="E", ipady=0, pady=10) self.two_dots = tk.Label(self, text=":") self.two_dots.grid(row=2, column=5, sticky="E", ipady=2, pady=10) self.tim_m = tk.Entry(self, validate='key', textvariable=self.minute, validatecommand=(minutes, '%P'), width=2, justify='center') self.tim_m.grid(row=2, column=6, sticky="E", ipady=2, pady=10) self.minute_scroll = tk.Scrollbar(self, command=self.minute_change) self.minute_scroll.grid(row=2, column=7, sticky="E", ipady=0, pady=10) self.ent_lab = tk.Label(self, text=_("Description:")) self.ent_lab.grid(row=3, column=0, columnspan=3, sticky="NEWS", padx=4) self.ent = tk.Entry(self, width=10, justify='center') self.ent.grid(row=3, column=3, columnspan=10, sticky="NEWS", ipady=5, pady=10) self.imp = tk.IntVar() self.imp_che = tk.Checkbutton(self, text=_("Important reminder"), variable=self.imp, onvalue=1, offvalue=0) self.imp_che.grid(row=4, column=0, columnspan=8, sticky="NEWS", padx=2) if (self.num != -1): self.cur_date_time = self.master.mas[4 * self.num + 1].split(' ') self.cur_date = self.cur_date_time[0] self.cur_time = self.cur_date_time[1] cur_hour_min = self.cur_time.split(':') cur_hour = cur_hour_min[0] cur_min = cur_hour_min[1] self.cur_date = self.cur_date.split('-') self.cal.set_date(datetime.date(int(self.cur_date[0]), int(self.cur_date[1]), int(self.cur_date[2]))) self.hour.set(cur_hour) self.minute.set(cur_min) self.cur_description = self.master.mas[4 * self.num + 2] self.ent.insert(0, self.cur_description) if (4 * self.num + 1 in self.master.imp_list): self.imp.set(1) self.old_imp = self.imp.get() self.B = tk.Button(self, text="OK") self.B.grid(row=5, column=0, columnspan=8, sticky="NEWS", padx=2, pady=2) if (self.num != -1): self.B.configure(command=self.ed_sel) else: self.B.configure(command=self.add_sel) def check_correct(self): """Check if the content of window is correct.""" correct = True if not (self.hour.get()) or not (self.minute.get()): tk.messagebox.showerror(_("Time Error"), _("Input hours and minutes!")) correct = False else: self.cur_time = datetime.time(int(self.hour.get()), int(self.minute.get())) if (self.ent.get() == ''): tk.messagebox.showerror(_("Description Error"), _("Input the description!")) correct = False else: self.cur_rem = self.ent.get() self.cur_date = self.cal.get_date() if (correct): self.in_date = datetime.datetime(self.cur_date.year, self.cur_date.month, self.cur_date.day, self.cur_time.hour, self.cur_time.minute, self.cur_time.second) if (datetime.datetime.now() > self.in_date): tkinter.messagebox.showerror(_("Wrong data"), _("Time travel, huh?\n" "Why do you need a reminder" "to a previous events?\n" "Change the date!")) correct = False return correct def add_sel(self): """Add Reminder to the list.""" if (self.check_correct()): if (self.master.Rlist.get( tk.END) == _("There's no reminders yet!")): self.master.Rlist.delete(tk.END) date_inp = 0 else: date_inp = self.master.date_in(self.in_date) self.add_el(date_inp) self.master.list.set(self.master.mas) self.master.color_change(date_inp, 4) self.master.outdated_events() if (self.imp.get()): self.master.imp_list.append(date_inp + 1) self.master.Rlist.itemconfig(date_inp + 1, foreground="red") self.master.im_count.set(len(self.master.imp_list)) self.master.new_num() self.master.ev_count.set(len(self.master.mas) // 4) self.true_master.destroy() def ed_sel(self): """Edit the Reminder from the list.""" if (self.check_correct()): self.master.mas[4 * self.num + 1] = str(self.in_date) self.master.mas[4 * self.num + 2] = self.cur_rem self.master.list.set(self.master.mas) if (self.imp.get() != self.old_imp): if (self.old_imp == 0): self.master.imp_list.append(4 * self.num + 1) else: self.master.imp_list.remove(4 * self.num + 1) self.master.set_imp() self.master.new_num() self.edit_list() self.true_master.destroy() def edit_list(self): """Modify list of all reminders, including important ones.""" old_date = self.master.mas.index(str(self.in_date)) if (old_date) in self.master.imp_list: self.master.imp_list.remove(old_date) del self.master.mas[old_date - 1:old_date + 3] self.master.list.set(self.master.mas) date_put = self.master.date_in(self.in_date) self.add_el(date_put) self.master.list.set(self.master.mas) forw = 2 * (date_put + 1 < old_date) - 1 for i in range(len(self.master.imp_list)): if (min(old_date, date_put + 1) <= self.master. imp_list[i] <= max(old_date, date_put + 1)): self.master.imp_list[i] += forw * 4 if (self.imp.get()): self.master.imp_list.append(date_put + 1) self.master.set_imp() def add_el(self, date_num): """Insert Reminder information into list.""" self.master.mas.insert(date_num, "") self.master.mas.insert(date_num + 1, "{a} {b}". format(a=self.cur_date, b=self.cur_time)) self.master.mas.insert(date_num + 2, self.cur_rem) self.master.mas.insert(date_num + 3, "")
class SetNewReport(ttk.Frame): geo = '600x800' def __init__(self, parent, controller): """ parent = Frame container, controller = class SeReporter() """ super().__init__(parent) self.controller = controller self.parent = parent gl.next_step = 'empty' self.url_fields = [] self.titel_var = tk.StringVar() self.choice_var = tk.StringVar() self.protocol_var = tk.StringVar() self.val_strt_hr = tk.StringVar() self.val_strt_min = tk.StringVar() self.val_end_hr = tk.StringVar() self.val_end_min = tk.StringVar() # periode definitions self.period_start = '' self.period_end = '' self.period_unit = '' self.start_it = datetime.now() self.stop_it = func.add_one_month(datetime.now()) # accept value self.p_start = '' self.p_stop = '' self.p_mode = '' self.p_unit = '' # defenitions background Frame self.grid_rowconfigure(1, weight=1) self.grid_rowconfigure(1, weight=1) self.grid_columnconfigure(0, weight=1) self.configure(style='Panel.TFrame') # definitions inside_frame, an internal 2 column frame self.inside_frame = ttk.Frame(self, width=600, style='Panel.TFrame') self.inside_frame.grid(padx=30, pady=30) # row 0 of inside_frame: page_label page_label = ttk.Label( self.inside_frame, textvariable=self.titel_var, text=' Rapport ....', style='PanelLabel.TLabel', width=40, # Width in chars anchor=tk.CENTER) page_label.grid(row=0, column=0, pady=(0, 5)) # row 1 of inside_frame: info_frame, info_frame_label = tk.Label(self.inside_frame, text=' Aanwijzingen ', font=cnf.fh12, fg='black', bg='#ffefd8') self.info_frame = ttk.LabelFrame(self.inside_frame, text='', style='Panel.TFrame', labelwidget=info_frame_label, relief=tk.GROOVE) self.info_choice = ttk.Label(self.info_frame, textvariable=self.choice_var, text='choice', style='StatusText.TLabel', width=40) self.info_choice.grid(row=0, column=0, columnspan=2, padx=5, pady=(5, 5)) self.info_protocol = ttk.Label(self.info_frame, textvariable=self.protocol_var, text='protocol', style='StatusText.TLabel', width=40) self.info_protocol.grid(row=1, column=0, columnspan=2, padx=5, pady=(5, 5)) self.infotext = tk.Text(self.info_frame, bg='#fffae3', wrap=tk.WORD, height=3, width=40, font=cnf.fh12, bd=2, padx=5, pady=5) self.infotext.grid(row=2, column=0, columnspan=2, padx=10, pady=10, ipadx=10, ipady=10) self.infotext.insert(tk.END, 'Info text') self.info_frame.grid(row=1, column=0, pady=(10, 0), padx=(0, 0)) # Settings frame contains all settings grouped by row settings_frame_label = tk.Label(self.inside_frame, text=' Instellingen ', font=cnf.fa12, fg='black', bg='#ffefd8') self.fr_settings = ttk.LabelFrame(self.inside_frame, text='--', labelwidget=settings_frame_label, style='Panel.TFrame', relief=tk.GROOVE) self.fr_settings.grid(row=2, padx=20, pady=10) # self.fr_settings.grid_propagate(0) # row 1 = Date frames # left = start date fr_strt_date_label = tk.Label(self.fr_settings, text=' Startdatum ', font=cnf.fa12, fg='black', bg='#ffefd8') self.fr_strt_date = ttk.LabelFrame(self.fr_settings, text=' Begin ', width=175, height=80, labelwidget=fr_strt_date_label, style='Panel.TFrame', relief=tk.GROOVE) self.fr_strt_date.grid(row=0, column=0, sticky='W', pady=(5, 10), padx=(10, 10)) self.fr_strt_date.grid_propagate(0) self.start_date = DateEntry( self.fr_strt_date, width=12, date_pattern='yyy-mm-dd', font=cnf.fa12, # year=self.strt_year, month=self.strt_month, day=self.strt_day, background='#0000ff', foreground='white') self.start_date.grid(row=0, column=0, padx=20, pady=10) self.start_date.set_date(self.start_it) # std_width = self.fr_strt_date.winfo_width() # right = stop date fr_stop_date_label = tk.Label(self.fr_settings, text=' Stopdatum ', font=cnf.fa12, fg='black', bg='#ffefd8') self.fr_stop_date = ttk.LabelFrame(self.fr_settings, text=' ', width=175, height=80, labelwidget=fr_stop_date_label, style='Panel.TFrame', relief=tk.GROOVE) self.stop_date = DateEntry( self.fr_stop_date, width=12, date_pattern='yyy-mm-dd', font=cnf.fh12, # year=self.stop_year, month=self.stop_month, day=self.stop_day, background='blue', foreground='white') self.stop_date.grid(row=0, column=1, padx=20, pady=10) self.stop_date.set_date(self.stop_it) self.fr_stop_date.grid(row=1, column=1, sticky='E', pady=(5, 10), padx=(10, 10)) self.fr_stop_date.grid_propagate(0) # row 2 = Time frames # r2 - left = start time fr_strt_time_label = tk.Label(self.fr_settings, text=' Starttijd ', font=cnf.fa12, fg='black', bg='#ffefd8') self.fr_strt_time = ttk.LabelFrame(self.fr_settings, text=' Begin ', width=175, height=80, labelwidget=fr_strt_time_label, style='Panel.TFrame', relief=tk.GROOVE) self.fr_strt_time.grid(row=1, column=0, sticky='W', pady=(5, 10), padx=(10, 0)) self.fr_strt_time.grid_propagate(0) self.start_time_hr = ttk.Combobox(self.fr_strt_time, textvariable=self.val_strt_hr, values=gl.hrlist, font=cnf.fa12, width=2) self.start_time_hr.grid(row=0, column=0, padx=(20, 0), pady=(10, 20)) self.start_time_hr.current(2) dd1 = tk.Label(self.fr_strt_time, text=' : ', font=cnf.fh14, fg='black', bg='#ffefd8') dd1.grid(row=0, column=1, pady=(10, 20)) self.start_time_min = ttk.Combobox(self.fr_strt_time, textvariable=self.val_strt_min, values=gl.mnlist, font=cnf.fa12, width=2) self.start_time_min.grid(row=0, column=2, padx=(0, 20), pady=(10, 20)) self.start_time_min.current(0) # r2 - right = stop time fr_stop_time_label = tk.Label(self.fr_settings, text=' Stoptijd ', font=cnf.fa12, fg='black', bg='#ffefd8') self.fr_stop_time = ttk.LabelFrame(self.fr_settings, text=' Eind ', width=175, height=80, labelwidget=fr_stop_time_label, style='Panel.TFrame', relief=tk.GROOVE) self.stop_time_hr = ttk.Combobox(self.fr_stop_time, textvariable=self.val_end_hr, values=gl.hrlist, font=cnf.fa12, width=2) self.stop_time_hr.grid(row=0, column=0, padx=(20, 0), pady=(10, 20)) self.stop_time_hr.current(16) dd2 = tk.Label(self.fr_stop_time, text=' : ', font=cnf.fh14, fg='black', bg='#ffefd8') dd2.grid(row=0, column=1, pady=(10, 20)) self.stop_time_min = ttk.Combobox(self.fr_stop_time, textvariable=self.val_end_min, values=gl.mnlist, font=cnf.fa12, width=2) self.stop_time_min.grid(row=0, column=2, padx=(0, 20), pady=(10, 20)) self.stop_time_min.current(0) self.fr_stop_time.grid(row=1, column=1, sticky='E', pady=(5, 10), padx=(10, 10)) self.fr_stop_time.grid_propagate(0) # r3 - right = Unit frame fr_unit_label = tk.Label(self.fr_settings, text=' Interval ', font=cnf.fa12, fg='black', bg='#ffefd8') self.fr_unit = ttk.LabelFrame(self.fr_settings, text=' Begin ', width=175, height=100, labelwidget=fr_unit_label, style='Panel.TFrame', relief=tk.GROOVE) self.unit_var = tk.StringVar() self.unit_var.set(gl.list_of_units_nl[0]) self.unit = ttk.OptionMenu(self.fr_unit, self.unit_var, *gl.list_of_units_nl, command=lambda x: self.set_time_unit(x) ) # in original self was forwarded also self.unit_var.set(gl.list_of_units_nl[0]) self.unit['menu'].configure(font=cnf.fa12) self.unit.configure(style='ChoiceButton.TButton') self.unit.grid(row=0, column=0, pady=(10, 10), padx=(20, 10)) # , padx=20, pady=10, sticky='E' self.fr_unit.grid(row=2, column=1, pady=(10, 10), padx=(10, 10)) self.fr_unit.grid_propagate(0) self.acceptbutton = tk.Button(self.inside_frame, text='Verder', background='black', foreground='white', width=20, height=2, font=cnf.fa12, command=lambda: self.accept()) self.acceptbutton.grid(row=6, column=0, sticky='E', padx=0, pady=20) backbutton = tk.Button(self.inside_frame, text='Terug', background='black', foreground='white', width=20, height=2, font=cnf.fa12, command=lambda: self.go_back()) backbutton.grid(row=6, column=0, sticky='W', padx=0, pady=20) @staticmethod def set_time_unit(val): # For future improvements only print(f'returned val: {val}') pass def go(self): """ User has chosen for a new report of a particular type Hide or show widgets dependent on api.name and get the right start values (from history database or defaults) into the widgets. :return: """ # api.name = self.parent.report_type self.titel_var.set( f' Rapportperiode samenstellen en rapport opvragen ') self.choice_var.set(f' Raportkeuze = "{cnf.all_titles.get(api.name)}"') self.protocol_var.set(f' Protocolnaam = "{api.name}"') # Get values to complete the arg list api_args = cnf.all_args[api.name][ 1:] # args needed for the choosen api, skip translated title api.num_args = len(api_args) selogger.info( f'Gekozen titel: {cnf.all_titles[api.name]}, ' f'de api naam is {api.name}, aantal args = {api.num_args}') self.infotext.delete('1.0', tk.END) self.infotext.insert(tk.END, cnf.api_config[api.name]['info']) print( f'{__name__}-{lineno()}: cnf.all_args[my.name] = {cnf.all_args[api.name]}' ) print(f'{__name__}-{lineno()}: api.num_args = {api.num_args}') # print(cnf.api_config[api.name]['info']) if api.num_args == 0: # Requests without period definitions self.fr_unit.grid_remove() self.fr_strt_date.grid_remove() self.fr_stop_date.grid_remove() self.fr_strt_time.grid_remove() self.fr_stop_time.grid_remove() self.fr_settings.grid_remove() else: # Requests with date and/or date-time definitions self.fr_settings.grid(row=2, padx=20, pady=10) api.url_args.clear() # in case user chooses new report type # Possible arguments are: startDate + endDate OR startTime + endTime AND OPTIONAL timeUnit for next_arg in api_args: if next_arg == 'startDate': # Set both date entries visible self.fr_strt_date.grid(row=0, column=0, sticky='W', pady=(10, 10), padx=(10, 10)) self.fr_stop_date.grid(row=0, column=1, sticky='E', pady=(10, 10), padx=(10, 10)) api.url_args['startDate'] = '' api.url_args['endDate'] = '' elif next_arg == 'startTime': # Set both date + time entries visible self.fr_strt_date.grid(row=0, column=0, sticky='W', pady=(10, 10), padx=(10, 10)) self.fr_stop_date.grid(row=0, column=1, sticky='E', pady=(10, 10), padx=(10, 10)) self.fr_strt_time.grid(row=1, column=0, sticky='W', pady=(10, 10), padx=(10, 0)) self.fr_stop_time.grid(row=1, column=1, sticky='E', pady=(10, 10), padx=(10, 10)) api.url_args['startTime'] = '' api.url_args['endTime'] = '' elif next_arg in 'timeUnit': # Set interval choice visible self.fr_unit.grid(row=2, column=1, pady=(10, 10), padx=(10, 10)) api.url_args['timeUnit'] = '' # Fill widgets with last saved values arg_db_values = func.get_api_values(api.name) # database action if 'startDate' in arg_db_values: if len(arg_db_values['startDate']): self.start_date.set_date(arg_db_values['startDate']) if 'endDate' in arg_db_values: if len(arg_db_values['endDate']): self.stop_date.set_date(arg_db_values['endDate']) if 'timeUnit' in api_args: p_unit = arg_db_values['timeUnit'] self.url_fields.append('timeUnit') else: p_unit = '' self.fr_unit.grid_forget() if 'startDate' in api_args: self.p_start = arg_db_values['startDate'] self.p_mode = 'date' self.url_fields.append('startDate') self.fr_strt_time.grid_forget() self.fr_stop_time.grid_forget() elif 'startTime' in api_args: self.p_start = arg_db_values['startTime'] self.p_mode = 'time' self.url_fields.append('startTime') if 'endDate' in api_args: self.p_stop = arg_db_values['endDate'] self.url_fields.append('endDate') elif 'endTime' in api_args: self.p_stop = arg_db_values['endTime'] self.url_fields.append('endTime') # self.p_start = '2020-01-01 12:00:00' # api compatible yyyy-mm-dd (and if time defined) hh:mm:ss # self.p_end = '2020-01-01 12:00:00' # api compatible yyyy-mm-dd (and if time defined) hh:mm:ss if p_unit != '': self.unit_var.set('Dag') if len(self.p_unit) > 1: self.unit_var.set(self.p_unit) print(lineno(), f'self.url_fields = {self.url_fields}') base_width = self.info_frame.winfo_width() self.fr_settings.configure(width=base_width) print(f"Var's in {__name__}: {dir()}") def go_back(self): self.controller.lastframe() def accept(self): # User pushed ready button if api.num_args == 0: self.controller.show_frame('GetNewReport') return # entered values must be api formatted and checked self.period_start = str(self.start_date.get_date()) if self.p_mode != 'date': self.period_start += ' ' self.period_start += str(self.val_strt_hr.get()) self.period_start += ':' self.period_start += str(self.val_strt_min.get()) self.period_start += ':00' self.period_end = str(self.stop_date.get_date()) if self.p_mode != 'date': self.period_end += ' ' self.period_end += str(self.val_end_hr.get()) self.period_end += ':' self.period_end += str(self.val_strt_min.get()) self.period_end += ':00' self.period_unit = self.unit_var.get() if len(self.period_unit): print(f'self.period_unit = {self.period_unit}') idx = gl.list_of_units_nl.index(self.period_unit) self.period_unit = gl.list_of_units_en[idx] print( lineno(), f'self.period_start = {self.period_start}, ' f'self.period_end = {self.period_end}, \nself.period_unit = {self.period_unit}' ) if not self.check_request(api.name, str(self.period_start), str(self.period_end), self.period_unit): TopMessage( cnf.wfquit, 'Foutje', 'De ingevoerde waarden in dit verzoek zijn niet toegestaan') return else: dp = dict() dp.clear() dp['title'] = 'Vraagje ..' dp['message'] = 'De ingevoerde waarden zijn toegestaan dus ...' dp['deny'] = 'Terug' dp['accept'] = 'OK, Doorgaan' self.call_dialog(**dp) if gl.next_step == 'no action': return if api.num_args > 0: # Ask for saving (modified) parameters dp.clear() dp['title'] = 'Nog een vraagje ..' dp['message'] = 'Instellingen eerst opslaan (in database) als nieuwe basiswaarde?' dp['deny'] = 'Terug' dp['accept'] = 'Opslaan graag' self.call_dialog(**dp) if gl.next_step == 'no action': return # Save new values in database print(f'{__name__}-{lineno()}: api.url_args = {api.url_args}') query = 'UPDATE settings SET ' for name in api.url_args: val = '' if name == 'timeUnit': val = self.period_unit if val in gl.list_of_units_en: val = gl.list_of_units_nl[ gl.list_of_units_en.index(val)] elif name in ('startTime', 'startDate'): val = self.period_start elif name in ('endTime', 'endDate'): val = self.period_end query += f'{name} = "{val}", ' query = query[0:-2] # remove last comma-space query += f' WHERE name = "{api.name}"' print(lineno(), f'query = {query}') rows = func.actdb.exec_update(query) if rows > 0: selogger.info('Laatste instellingen opgeslagen.') # self.controller.set_trigger('newReport') self.controller.show_frame('GetNewReport') # ========================================================================================= @staticmethod def check_request(api_choice, strt_moment, end_moment, unit): """ Validate user choices of 'energy', 'timeFrameEnergy','power','powerDetails','energyDetails' """ ret_val = False # Checking settings per api d = dict() d['strt'] = strt_moment d['end'] = end_moment if api_choice == 'energy': # Periodeopbrengst in detail if unit in 'DAY': # Max 1 year d['delta'] = 'year' res = func.check_periode_limit(None, **d) if res == 1: msg = 'De gekozen periode is te lang voor de waarden per: dag' TopMessage(cnf.wfquit, 'Foutje', msg) ret_val = False elif res == -1: msg = 'De start- en einddatums zijn omgedraaid' TopMessage(cnf.wfquit, 'Foutje', msg) ret_val = False else: ret_val = True elif unit in ('QUARTER_OF_AN_HOUR', 'HOUR'): # Max 1 month d['delta'] = 'month' res = func.check_periode_limit(None, **d) if res == 1: msg = 'De gekozen periode is te lang bij waarden per: uur of kwartier' TopMessage(cnf.wfquit, 'Foutje', msg) ret_val = False elif res == -1: msg = 'De start- en einddatums zijn omgedraaid' TopMessage(cnf.wfquit, 'Foutje', msg) ret_val = False else: ret_val = True else: ret_val = True elif api_choice == 'timeFrameEnergy': # Periodeopbrengst samenvatting # Total over given period, no limits if strt_moment == end_moment: msg = 'Dezelfde dag en zonder tijden is niet logisch, ' \ 'probeer dan liever \n"Periodeopbrengst in detail"\n' \ 'want daar kun je ook de tijd aangeven' TopMessage(cnf.wfquit, 'Foutje', msg) ret_val = False else: d['delta'] = '' res = func.check_periode_limit(None, **d) if res == -1: msg = 'Stopdatum dient ná Startdatum te liggen' TopMessage(cnf.wfquit, 'Foutje', msg) ret_val = False else: ret_val = True elif api_choice == 'power': # Periodeopbrengst per kwartier # Max 1 month!! d['delta'] = 'month' res = func.check_periode_limit(None, **d) if res == 1: msg = 'Dit rapport levert kwartierwaarden en mag daarom niet langer zijn dan één maand\n' \ 'Tip: let op de tijden!' TopMessage(cnf.wfquit, 'Foutje', msg) ret_val = False elif res == -1: msg = 'Stopdatum (plus tijd) dient ná Startdatum (plus tijd) te liggen' TopMessage(cnf.wfquit, 'Foutje', msg) ret_val = False else: ret_val = True elif api_choice in ( 'overview', # Overzicht 'details', # Installatie details 'dataPeriod', # start- and enddate of installation 'inventory', # List of technical installation details 'envBenefits'): # Environment benefits like CO2 ret_val = True else: pass return ret_val def call_report(self): api_conn = CallApi content = api_conn.get_report(api.name, api.url_args) if len(content): pass def set_text(self, txt): pass def call_dialog(self, *args, **kwargs): d = DialogBox(self, *args, **kwargs) d.grab_set() self.wait_window(d) d.grab_release() # print(f'BACK after wait with gl.next_step = {gl.next_step}') return
class addtrademark: def __init__(self, my_frame): mywindow = Toplevel(my_frame) mywindow.wm_title("TRADEMARK FORM") mywindow.wm_minsize(800, 600) a1 = Label(mywindow, text="APPLICATION NO.") a1.place(x=20, y=20) self.a11 = Entry(mywindow) self.a11.place(x=150, y=20) v1 = Label(mywindow, text="APPLICATION DATE") v1.place(x=20, y=60) self.cal = DateEntry(mywindow, width=12, background='darkblue', foreground='white', borderwidth=2, year=2010, date_pattern='dd-mm-yyyy') self.cal.place(x=150, y=60) b1 = Label(mywindow, text="NAME OF PARTY") b1.place(x=20, y=100) self.b11 = Entry(mywindow, width=40) self.b11.place(x=150, y=100) c1 = Label(mywindow, text="TRADEMARK NAME") c1.place(x=20, y=140) self.c11 = Entry(mywindow, width=40) self.c11.place(x=150, y=140) x1 = Label(mywindow, text="USER DETAILS") x1.place(x=20, y=180) self.x11 = Entry(mywindow, width=40) self.x11.place(x=150, y=180) self.Class = StringVar() classbox = ttk.Combobox(mywindow, textvariable=self.Class, state='readonly') self.fetch_data() classbox.config(values=self.coursesname) classbox.set("Choose Class") classbox.place(x=150, y=220) self.Status = StringVar() statusbox = ttk.Combobox(mywindow, textvariable=self.Status, state='readonly') self.fetch_data2() statusbox.config(values=self.statusname) statusbox.set("Choose Status") statusbox.place(x=150, y=260) f1 = Label(mywindow, text="CONTACT NUMBER") f1.place(x=20, y=300) self.f11 = Entry(mywindow) self.f11.place(x=150, y=300) g1 = Label(mywindow, text="EMAIL") g1.place(x=20, y=340) self.g11 = Entry(mywindow, width=30) self.g11.place(x=150, y=340) h1 = Label(mywindow, text="TMJ DATE") h1.place(x=20, y=380) self.h11 = Entry(mywindow, width=30) self.h11.place(x=150, y=380) i1 = Label(mywindow, text="RENEWAL DATE") i1.place(x=20, y=420) self.cal2 = DateEntry(mywindow, width=12, background='darkblue', foreground='white', borderwidth=2, year=2020, date_pattern='dd-mm-yyyy') self.cal2.place(x=150, y=420) e1 = Label(mywindow, text="ADDRESS") e1.place(x=20, y=460) self.e11 = Text(mywindow, height=3, width=40) self.e11.place(x=150, y=460) savebtn = Button(mywindow, text="Save", command=self.saveinfo, padx=20, bg="yellow") savebtn.place(x=180, y=540) mywindow.mainloop() def saveinfo(self): # datetime_str = self.cal.get() # datetime_str1 = str(self.cal.get_date()) # datetime_object1=datetime.datetime.strptime(datetime_str1, '%Y-%m-%d').strftime('%d/%m/%Y') # datetime_str2 = str(self.cal2.get_date()) # datetime_object2=datetime.datetime.strptime(datetime_str2, '%Y-%m-%d').strftime('%d/%m/%Y') try: mydatabaseobj = pymysql.connect(host="localhost", user="******", password="", db="officedb") try: with mydatabaseobj.cursor() as myconn: myconn.execute( "insert into mytable(Application,ApplicationDate,Name,Trademark,Class,Status,Contact,Email,TMJ,Renewal,Address,userdetail) " "values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)", (self.a11.get(), self.cal.get_date(), self.b11.get(), self.c11.get(), self.Class.get(), self.Status.get(), self.f11.get(), self.g11.get(), self.h11.get(), self.cal2.get_date(), self.e11.get( '1.0', END), self.x11.get())) mydatabaseobj.commit() messagebox.showinfo("Success", "Record Saved Successfully") except Exception as ex: messagebox.showerror("Error Occured", "Error in insert query due to " + str(ex)) finally: mydatabaseobj.close() except Exception as ex: messagebox.showerror("Error Occured", "Error creating database due to " + str(ex)) def fetch_data(self): try: mydb = pymysql.connect(host='localhost', db='Officedb', user="******", password="") with mydb.cursor() as dc: dc.execute("select * from classes") result = dc.fetchall() self.coursesname = [] if (len(result) == 0): messagebox.showerror("error", "no class ") for row in result: # s=self.coursesname.append(row[0]) #or s = str(row[0]) self.coursesname.append(s) dc.close() except Exception as e: messagebox.showerror("error", "error : " + str(e)) def fetch_data2(self): try: mydb = pymysql.connect(host='localhost', db='Officedb', user="******", password="") with mydb.cursor() as dc: dc.execute("select * from status") result = dc.fetchall() self.statusname = [] if (len(result) == 0): messagebox.showerror("error", "no Status ") for row in result: # s=self.coursesname.append(row[0]) #or s = str(row[0]) self.statusname.append(s) dc.close() except Exception as e: messagebox.showerror("error", "error : " + str(e))
class TimePicker(tk.Toplevel): def __init__(self, parent, **kw): chosen_stall = kw["chosen_stall"] kw.pop("chosen_stall") tk.Toplevel.__init__(self, parent, **kw) # Main Title main_title_label = tk.Label(self, text = "Select Timing", font = constants.MEDIUM_FONT) main_title_label.place(relx = 0.25, rely = 0.0625, relheight = 0.125, relwidth = 0.5) # Spinbox Frame spinbox_frame = tk.Frame(self) spinbox_frame.place(relx = 0.125, rely = 0.25, relheight = 0.25, relwidth = 0.75) # Spinboxes hour = tk.IntVar(value = datetime.now().time().hour) self.hour_spinbox = tk.Spinbox(spinbox_frame, from_ = 00, to = 23, increment = 1, textvariable = hour, format = "%02.0f", state = "readonly") self.hour_spinbox.place(relx = 0, rely = 0.25, relheight = 1, relwidth = 0.3) minute = tk.IntVar(value = (((datetime.now().time().minute // 10) * 10))) self.minute_spinbox = tk.Spinbox(spinbox_frame, from_ = 00, to = 50, increment = 10, textvariable = minute, format = "%02.0f", state = "readonly") self.minute_spinbox.place(relx = 0.3, rely = 0.25, relheight = 1, relwidth = 0.3) self.date_entry = DateEntry(spinbox_frame, state = "normal", firstweekday = "monday", mindate = datetime.today().date(), showweeknumbers = False, showothermonthdays = False, locale = "en_SG", date_pattern = "dd-mm-yyyy") self.date_entry.place(relx = 0.6, rely = 0.25, relheight = 1, relwidth = 0.4) # Buttons Frame buttons_frame = tk.Frame(self) buttons_frame.place(relx = 0.125, rely = 0.625, relheight = 0.25, relwidth = 0.75) # Current Time Button current_time_button = tk.Button(buttons_frame, text = "Now", command = lambda: self.current_time_button_pressed()) current_time_button.place(relx = 0.125, rely = 0.125, relheight = 0.25, relwidth = 0.75) # Submit button submit_button = tk.Button(buttons_frame, text = "Submit", command = lambda: self.submit_button_pressed(self.hour_spinbox.get(), self.minute_spinbox.get(), self.date_entry.get_date(), parent, chosen_stall)) submit_button.place(relx = 0.125, rely = 0.5, relheight = 0.25, relwidth = 0.75) # Takes entered Time from Spinboxes and updates the Menu List def submit_button_pressed(self, hour_time, minute_time, on_day, parent, chosen_stall): hour_time = int(hour_time) minute_time = int(minute_time) time = str(hour_time).format("%02.0f") + ":" + str(minute_time).format("%02.0f") parent.list_reload_data(chosen_stall, time, on_day.weekday()) self.destroy() # Resets Hour and Minute in Spinbox to Current Time def current_time_button_pressed(self): hour = tk.IntVar(value = datetime.now().time().hour) minute = tk.IntVar(value = (((datetime.now().time().minute // 10) * 10))) self.hour_spinbox["textvariable"] = hour self.minute_spinbox["textvariable"] = minute self.date_entry.set_date(datetime.now().date())
class bookroom: def __init__(self, frame): self.myframe = Toplevel(frame) self.myframe.wm_title(" Booking Room ") self.myframe.geometry("700x250") t1 = Label(self.myframe, text="Customer Id ") t2 = Label(self.myframe, text="Customer Name ") t3 = Label(self.myframe, text="Room Type ") t4 = Label(self.myframe, text="Room No. ") t5 = Label(self.myframe, text="Check In ") t6 = Label(self.myframe, text="Check Out ") t7 = Label(self.myframe, text="Advance Payment ") self.e1 = Entry(self.myframe) self.e2 = Entry(self.myframe) self.e3 = Entry(self.myframe) self.myroomtype = StringVar() self.c1 = Combobox(self.myframe, textvariable=self.myroomtype) self.c1.config(values=('Single', 'Double', 'Triple', 'Quad', 'Queen', 'King', 'Twin', 'Double-Double', 'Studio')) self.myroomno = StringVar() self.c2 = Combobox(self.myframe, textvariable=self.myroomno) self.check_in = DateEntry(self.myframe, width=12, background='darkblue', foreground='white', borderwidth=2) self.check_out = DateEntry(self.myframe, width=12, background='darkblue', foreground='white', borderwidth=2) self.b1 = Button(self.myframe, text="Book Room", bg="red", fg="white") t1.place(x=50, y=50) t2.place(x=380, y=50) t3.place(x=50, y=80) t4.place(x=380, y=80) t5.place(x=50, y=110) t6.place(x=380, y=110) t7.place(x=50, y=140) self.e1.place(x=200, y=50) self.e2.place(x=480, y=50) self.c1.place(x=200, y=80) self.c2.place(x=480, y=80) self.check_in.place(x=200, y=110) self.check_out.place(x=480, y=110) self.e3.place(x=200, y=140) self.b1.place(x=200, y=190) self.e1.bind("<FocusIn>", lambda e: self.getnormal()) self.e1.bind("<FocusOut>", lambda e: self.get_cus_info()) self.c1.bind("<<ComboboxSelected>>", lambda e: self.get_roomno()) self.b1.bind("<Button-1>", lambda e: self.booking_room()) def getnormal(self): self.e2.config(state="normal") def get_roomno(self): myno = [] try: mydb = pymysql.connect(host='localhost', user='******', password='', db='hotelmanagementdb') with mydb.cursor() as mycon: mycon.execute( "select room_no from room where status=%s and room_type=%s", ("Available", self.myroomtype.get())) myresult = mycon.fetchall() mydb.commit() if len(myresult) > 0: for i in range(len(myresult)): myno.append(str(myresult[i][0])) self.c2.config(values=myno) except Exception as e: messagebox.showerror("Database Error", "Error Occured Due to " + str(e)) def get_cus_info(self): try: self.e2.delete(0, END) mydb = pymysql.connect(host='localhost', user='******', password='', db='hotelmanagementdb') with mydb.cursor() as mycon: mycon.execute( "select customer_name from customer where customer_id=%s", (self.e1.get())) myresult = mycon.fetchone() mydb.commit() if len(myresult) > 0: self.e2.insert(0, str(myresult[0])) self.e2.config(state="readonly") except Exception as e: messagebox.showerror("Database Error", "Error Occured Due to " + str(e)) def booking_room(self): try: mydb = pymysql.connect(host='localhost', user='******', password='', db='hotelmanagementdb') with mydb.cursor() as myconn: # customer_id,checkin,checkout,adv_amt,status # room_no,customer_id,customer_name,check_in,check_out,advance_payment myconn.execute( "update room set status=%s where room_no =%s and room_type=%s", ("Book", self.myroomno.get(), self.myroomtype.get())) try: myconn.execute( "insert into room_history values(%s,%s,%s,%s,%s,%s,%s)", (self.myroomno.get(), self.myroomtype.get(), self.e1.get(), self.e2.get(), self.check_in.get_date(), self.check_out.get_date(), self.e3.get())) except Exception as ex: messagebox.showerror( "Database Error", "Error Occured in Room History Table due to \n" + str(ex)) mydb.commit() messagebox.showinfo( "Room Booked", " Room No. " + self.myroomno.get() + " Booked To " + self.e2.get() + "\n from : " + str(self.check_in.get_date()) + " to : " + str(self.check_out.get_date())) except Exception as e: messagebox.showerror("Database Error", "Error Occured Due to " + str(e))
class InvoicesInterface: db_name = "invoices_database.db" db_services = 'database.db' db_invoices_search = "invoices_search.db" db_invoices_in_dollars = "invoices_dollars.db" listCombo = [] def __init__(self, window): """Con sqlite""" self.windowInvoices = window self.windowInvoices.title("Invoices Window") # Creating a Frame Container frame = LabelFrame(self.windowInvoices, text="Create an invoice") frame.grid(row=0, column=0, columnspan=3, pady=20) # Name imput Label(frame, text="Name: ").grid(row=1, column=0) self.name = Entry(frame) self.name.focus() self.name.grid(row=1, column=1) # Address Input Label(frame, text="Address: ").grid(row=2, column=0) self.address = Entry(frame) self.address.grid(row=2, column=1) # ID input Label(frame, text="ID: ").grid(row=3, column=0) self.ID_ = Entry(frame) self.ID_.grid(row=3, column=1) # Email input Label(frame, text="Email: ").grid(row=4, column=0) self.email = Entry(frame) self.email.grid(row=4, column=1) # Date input Label(frame, text="Date: ").grid(row=5, column=0) self.date = DateEntry(frame, width=12, background='darkblue', foreground='white', borderwidth=2, date_pattern='YYYY-MM-DD') self.date.grid(row=5, column=1) # Service input # ***** Change to a combobox **** Label(frame, text="Service").grid(row=6, column=0) # n = StringVar() # self.service = ttk.Combobox(frame) # self.service["values"] = self.get_services() # self.service.set(self.get_services()[0]) # self.service.grid(row=6, column=1) Button(frame, text="Select services", command=self.services_window).grid(row=6, column=1) Label(frame, text="TAX").grid(row=7, column=0) self.discount = Entry(frame) self.discount.grid(row=7, column=1) # Button create invoice Button(frame, text="Create Invoice", command=self.add_invoice).grid(row=8, columnspan=2, sticky=W + E) Button(frame, text="See invoices in dollars", command=self.invoices_dollars_window).grid(row=9, columnspan=2, sticky=W + E) # Output messages self.message = Label(frame, text="", fg='red') self.message.grid(row=10, column=0, columnspan=2, sticky=W + E) self.tree = ttk.Treeview(self.windowInvoices, height=10, columns=("#0", "#1", "#2", "#3", "#4", "#5", "#6", "#7", "#8", "#9")) self.tree.grid(row=11, column=0, columnspan=3) self.tree.heading("#0", text="Name", anchor=CENTER) self.tree.heading("#1", text="ID", anchor=CENTER) self.tree.heading("#2", text="Email", anchor=CENTER) self.tree.heading("#3", text="Date", anchor=CENTER) self.tree.heading("#4", text="Due Date", anchor=CENTER) self.tree.heading("#5", text="Service", anchor=CENTER) self.tree.heading("#6", text="Price (₡)", anchor=CENTER) self.tree.heading("#7", text="Discount", anchor=CENTER) # Buttons Button(self.windowInvoices, text="DELETE", command=self.delete_invoice).grid(row=12, column=0, sticky=W + E) Button(self.windowInvoices, text="Search invoices by date", command=self.search_invoices_interface).grid(row=12, column=1, sticky=W + E) # Filling rows of table self.get_invoices() def search_invoices_interface(self): self.windowSearchByDate = Toplevel() self.windowSearchByDate.title("Search Invoices By Date") # Creating a frame container frame = LabelFrame(self.windowSearchByDate, text="Search Invoices By Date") frame.grid(row=0, column=0, columnspan=3, pady=20) Label(frame, text="Select initial date").grid(row=1, column=0) self.initialDate = DateEntry(frame, width=12, background='darkblue', foreground='white', borderwidth=2, date_pattern='YYYY-MM-DD') self.initialDate.grid(row=1, column=1) Label(frame, text="Select final date").grid(row=2, column=0) self.finalDate = DateEntry(frame, width=12, background='darkblue', foreground='white', borderwidth=2, date_pattern='YYYY-MM-DD') self.finalDate.grid(row=2, column=1) # Button create invoice Button(frame, text="See Invoices", command=self.get_invoices_search).grid(row=3, columnspan=2, sticky=W + E) # Output messages self.message_search_invoices = Label(frame, text="", fg='red') self.message_search_invoices.grid(row=4, column=0, columnspan=2, sticky=W + E) self.searchtree = ttk.Treeview(self.windowSearchByDate, height=10, columns=("#0", "#1", "#2", "#3", "#4", "#5")) self.searchtree.grid(row=7, column=0, columnspan=3) self.searchtree.heading("#0", text="Invoice Number", anchor=CENTER) self.searchtree.heading("#1", text="Name", anchor=CENTER) self.searchtree.heading("#2", text="Price (₡)", anchor=CENTER) self.searchtree.heading("#3", text="Due Date", anchor=CENTER) self.searchtree.heading("#4", text="Total", anchor=CENTER) Button(self.windowSearchByDate, text="Show Invoice as a PDF file", command=self.get_data_to_show_pdf).grid(row=8, column=0, sticky=W + E) Button(self.windowSearchByDate, text="Send Invoice to Email", command=self.search_for_email).grid(row=8, column=1, sticky=W + E) def services_window(self): self.services_wind = Toplevel() self.services_wind.title("Select one or more services") self.services_wind.minsize(width=100, height=100) # Creating a Frame Container frame = LabelFrame(self.services_wind, text="Select services") frame.grid(row=0, column=0, columnspan=3, pady=20) self.serviceCombo = ttk.Combobox(frame) self.serviceCombo["values"] = self.get_services() self.serviceCombo.set(self.get_services()[0]) self.serviceCombo.grid(row=6, column=1) # Output messages self.message_combobox_list = Label(frame, text="", fg='red') self.message_combobox_list.grid(row=7, column=0, columnspan=2, sticky=W + E) Button(frame, text="Add service", command=self.get_services_list).grid(row=8, column=1, sticky=W + E) def invoices_dollars_window(self): self.dollars_window = Toplevel() self.dollars_window.title("Invoices in dollars") # Creating a Frame Container frame = LabelFrame(self.dollars_window, text="Invoices in dollars") frame.grid(row=0, column=0, columnspan=3, pady=20) Button(frame, text="See all invoices", command=self.get_invoices_in_dollars).grid(row=1, column=1) self.message_convert_dollars = Label(frame, text="", fg='red') self.message_convert_dollars.grid(row=10, column=0, columnspan=2, sticky=W + E) self.tree_dollars = ttk.Treeview(self.dollars_window, height=10, columns=("#0", "#1", "#2", "#3", "#4")) self.tree_dollars.grid(row=11, column=0, columnspan=3) self.tree_dollars.heading("#0", text="Name", anchor=CENTER) self.tree_dollars.heading("#1", text="Service", anchor=CENTER) self.tree_dollars.heading("#2", text="Price ($)", anchor=CENTER) self.tree_dollars.heading("#3", text="Total", anchor=CENTER) self.tree_dollars.heading("#4", text="Due Date", anchor=CENTER) Button(self.dollars_window, text="Convert ALL invoices to dollars", command=self.convert_all_invoices_to_dollars).grid(row=12, column=0, sticky=W + E) Button(self.dollars_window, text="Convert selected invoice to dollars", command=self.convert_single_invoice_to_dollars).grid(row=12, column=1, sticky=W + E) def get_services_list(self): comboboxContent = self.serviceCombo.get() servicesString = "" priceString = "" service = comboboxContent.replace(" - ₡", "") for i in service: if i.isalpha(): servicesString += i else: priceString += i self.listCombo.append((servicesString, priceString)) self.message_combobox_list['text'] = servicesString + " has been added" self.message_combobox_list['fg'] = "blue" print(self.listCombo) return self.listCombo def dates_validation(self): return self.initialDate.get() != "" and self.finalDate.get() != "" def run_query_search_invoices(self, query, parameters=()): with sqlite3.connect(self.db_invoices_search) as conn: cursor = conn.cursor() result = cursor.execute(query, parameters) conn.commit() return result def run_query_invoices_dollars(self, query, parameters=()): with sqlite3.connect(self.db_invoices_in_dollars) as conn: cursor = conn.cursor() result = cursor.execute(query, parameters) conn.commit() return result def run_query(self, query, parameters=()): with sqlite3.connect(self.db_name) as conn: cursor = conn.cursor() result = cursor.execute(query, parameters) conn.commit() return result def run_query_to_delete_invoices(self, query, parameters=()): with sqlite3.connect(self.db_name) as conn: cursor = conn.cursor() result = cursor.execute(query, parameters) conn.commit() return result def run_query_services(self, query, parameters=()): with sqlite3.connect(self.db_services) as conn: cursor = conn.cursor() result = cursor.execute(query, parameters) conn.commit() return result def get_services(self): list = [] # getting data query = 'SELECT * FROM product ORDER BY name DESC' db_rows = self.run_query_services(query) # filling data for row in db_rows: # print(row) itemNum, service, price = row list += [service + " - " + "₡" + str(price)] return list def get_invoices(self): # cleaning table everytime it runs records = self.tree.get_children() for element in records: self.tree.delete(element) # quering data query = 'SELECT * FROM invoices ORDER BY name DESC' db_rows = self.run_query(query) # filling data for row in db_rows: # print(row) # print(row[2:5]) self.tree.insert("", 0, text=row[1], values=row[2:]) def get_invoices_in_dollars(self): # cleaning table each time it runs records = self.tree_dollars.get_children() for element in records: self.tree_dollars.delete(element) # quering data query = "SELECT * FROM invoices_dollars ORDER BY name DESC" db_rows = self.run_query_invoices_dollars(query) # filling rows of treeview for row in db_rows: self.tree_dollars.insert("", 0, text=row[1], values=row[2:6]) def get_invoices_search(self): initialDate = self.initialDate.get_date() finalDate = self.finalDate.get_date() if self.dates_validation(): # cleaning table records = self.searchtree.get_children() for element in records: self.searchtree.delete(element) # Getting data from database query = 'SELECT * FROM invoices_search ORDER BY name DESC' db_rows = self.run_query_search_invoices(query) # filling data for row in db_rows: # print(row) # format_str = '%d/%m/%Y' # The format format_str = "%Y-%m-%d" datetime_obj = datetime.strptime(row[6], format_str) print(datetime_obj) if datetime.date( datetime_obj) >= initialDate and datetime.date( datetime_obj) <= finalDate: self.message_search_invoices['text'] = "" self.searchtree.insert("", 1, text=row[1], values=row[2:6]) else: self.message_search_invoices[ 'text'] = "Can't show information, please check the date entries" def validation(self): return len(self.name.get()) != 0 and len(self.date.get()) != 0 and len( self.address.get()) != 0 and len(self.ID_.get()) != 0 and len( self.email.get()) != 0 # len(self.get_services_list) != 0 def add_invoice(self): if self.validation(): query = "INSERT INTO invoices VALUES(NULL,?,?,?,?,?,?,?,?,?)" query_dollars_database = "INSERT INTO invoices_dollars VALUES(NULL,?,?,?,?,?,?,?,?,?,?)" # service_text = self.service.get() # service_textCopy = service_text.replace(" - ₡","") # print(service_text) stringOfServices = "" stringOfPrices = "" stringPricesInDollars = "" totalDollars = 0 for i in self.listCombo: print(i) service2, price2 = i stringOfServices += service2 + "," stringOfPrices += price2 + "," stringOfServices = stringOfServices[:-1] stringOfPrices = stringOfPrices[:-1] print("String of Services " + stringOfServices) print("String of Prices " + stringOfPrices) stringOfPricesCopy = stringOfPrices listToDollars = stringOfPricesCopy.split(",") print(listToDollars) for i in listToDollars: newExchangeRate = GetBankInformation() newCurrency = newExchangeRate.ColonToDollar(i) totalDollars += float(newCurrency) stringPricesInDollars += str(newCurrency) + "," stringPricesInDollars = stringPricesInDollars[:-1] print("Dollars: " + stringPricesInDollars) print("Total In Dollars " + str(totalDollars)) # parameters = (self.name.get(),self.date.get(),self.date.get_date()+timedelta(days=3),self.email.get(),self.address.get(),service,float(price),self.discount.get(),self.ID_.get()) parameters = (self.name.get(), self.ID_.get(), self.email.get(), self.date.get(), self.date.get_date() + timedelta(days=3), stringOfServices, stringOfPrices, self.discount.get(), self.address.get()) parameters_dollars = (self.name.get(), stringOfServices, stringPricesInDollars, str(totalDollars), self.date.get_date() + timedelta(days=3), self.email.get(), self.ID_.get(), self.date.get(), self.discount.get(), self.address.get()) self.run_query(query, parameters) self.run_query_invoices_dollars(query_dollars_database, parameters_dollars) nameForSearch = self.name.get() nameForInvoice = self.name.get() self.message['text'] = "{}'s invoice added succesfully".format( self.name.get()) self.message['fg'] = "green" self.name.delete(0, END) self.address.delete(0, END) self.ID_.delete(0, END) self.email.delete(0, END) # self.service.delete(0,END) self.discount.delete(0, END) else: self.message['text'] = "All spaces must be filled" self.message['fg'] = "red" self.get_invoices() self.get_data_for_search_database(nameForSearch) self.get_single_data(nameForInvoice) def delete_invoice(self): self.message['text'] = "" try: # self.tree.item(self.tree.selection())['text'][0] self.tree.item(self.tree.selection())['text'][0] # print(self.tree.item(self.tree.selection())['text'][0]) # print(self.tree.item(self.tree.selection())['text']) # print(self.tree.item(self.tree.selection())['values'][4]) except IndexError as e: self.message['text'] = "Please select a record" return self.message['text'] = "" name = self.tree.item(self.tree.selection())['text'] query = 'DELETE FROM invoices WHERE name = ?' query2 = 'DELETE FROM invoices_search WHERE name = ?' query3 = 'DELETE FROM invoices_dollars WHERE name = ?' self.get_info_to_delete_pdf(name) self.run_query_search_invoices(query2, (name, )) self.run_query_invoices_dollars(query3, (name, )) self.run_query(query, (name, )) self.message['text'] = "Invoice deleted successfully" self.message['fg'] = "blue" self.get_invoices() def convert_single_invoice_to_dollars(self): try: self.tree_dollars.item(self.tree_dollars.selection())['text'][0] except IndexError as e: self.message_convert_dollars['text'] = "Please Select a Record" return self.message_convert_dollars['text'] = "" name = self.tree_dollars.item(self.tree_dollars.selection())['text'] file_to_search = name + ".pdf" self.delete_PDF(file_to_search) self.get_single_invoice_in_dollars(name) self.message_convert_dollars[ 'text'] = name + "'s invoice has changed the currency to dollars ($)" def get_single_invoice_in_dollars(self, name): # getting data query = 'SELECT * FROM invoices_dollars ORDER BY name DESC' db_rows = self.run_query_invoices_dollars(query) # filling data for row in db_rows: print(row) if row[1] == name: invoiceNumber, invoiceToName, invoiceService, servicePrice, total, invoiceExpiringDate, invoiceEmail, invoiceID, invoiceDate, serviceDiscount, invoiceAddress = row self.generateInvoice(invoiceNumber, invoiceToName, invoiceID, invoiceEmail, invoiceDate, invoiceExpiringDate, invoiceService, servicePrice, serviceDiscount, invoiceAddress) def get_info_to_delete_pdf(self, invoiceNameToDelete): # getting data query = 'SELECT * FROM invoices ORDER BY name DESC' db_rows = self.run_query(query) # filling data for row in db_rows: # print(row) if row[1] == invoiceNameToDelete: print("Printing...") print(row[1]) print(row) PDF_file_name = row[1] + " - " + str(row[0]) + ".pdf" print(PDF_file_name) self.delete_PDF(PDF_file_name) def delete_PDF(self, pdf_file): for subdir, dirs, files in os.walk( r'C:\Users\Michael\Desktop\PROYECTO 3 - Company System With Face Recognition To Log - 1S - 2020\PROYECTO-3-Company-System-With-Face-Recognition-To-Log---1S---2020\invoices' ): for filename in files: filepath = subdir + os.sep + filename if filename == pdf_file: if filename: os.remove(filepath) # os.startfile(r"C:\Users\Michael\Desktop\PROYECTO 3 - Company System With Face Recognition To Log - 1S - 2020\PROYECTO-3-Company-System-With-Face-Recognition-To-Log---1S---2020\invoices\CRISTOPHER - 63.pdf") print("PDF DELETED") else: messagebox.showerror("Error", "Can't delete PDF file") def delete_all_invoices(self): for subdir, dirs, files in os.walk( r'C:\Users\Michael\Desktop\PROYECTO 3 - Company System With Face Recognition To Log - 1S - 2020\PROYECTO-3-Company-System-With-Face-Recognition-To-Log---1S---2020\invoices' ): for filename in files: filepath = subdir + os.sep + filename if filename.endswith(".pdf"): if filename: os.remove(filepath) print("PDF deleted ___deleting all invoices___") else: messagebox.showerror("Error", "Can't delete PDF file") def convert_all_invoices_to_dollars(self): self.delete_all_invoices() self.generate_all_invoices_in_dollars() self.message_convert_dollars[ 'text'] = "ALL invoices have changed the currency to dollars ($)" def generate_all_invoices_in_dollars(self): listData = [] # getting data query = 'SELECT * FROM invoices_dollars ORDER BY name DESC' db_rows = self.run_query_invoices_dollars(query) # filling data for row in db_rows: print(row) listData.append(row) print(listData) # row_data #= row invoiceNumber, invoiceToName, invoiceService, servicePrice, total, invoiceExpiringDate, invoiceEmail, invoiceID, invoiceDate, serviceDiscount, invoiceAddress = row # self.generateInvoice(invoiceNumber,invoiceToName, invoiceID,invoiceEmail,invoiceDate,invoiceExpiringDate, invoiceService, servicePrice, serviceDiscount, invoiceAddress) # print("Generating pdf") # row_data = () for data in listData: invoiceNumber, invoiceToName, invoiceService, servicePrice, total, invoiceExpiringDate, invoiceEmail, invoiceID, invoiceDate, serviceDiscount, invoiceAddress = data newDoc = Invoice(invoiceNumber, invoiceToName, invoiceID, invoiceEmail, invoiceDate, invoiceExpiringDate, invoiceService, servicePrice, serviceDiscount, invoiceAddress) newDoc.generateInvoice() self.move_pdfs() def move_pdfs(self): for subdir, dirs, files in os.walk( r'C:\Users\Michael\Desktop\PROYECTO 3 - Company System With Face Recognition To Log - 1S - 2020\PROYECTO-3-Company-System-With-Face-Recognition-To-Log---1S---2020' ): for filename in files: filepath = subdir + os.sep + filename if filepath.endswith(".pdf"): print(filename) destination = "invoices" shutil.move(filepath, destination) print("Invoices moved") def get_single_data(self, invoiceName): # getting data query = 'SELECT * FROM invoices ORDER BY name DESC' db_rows = self.run_query(query) # filling data for row in db_rows: print(row[1]) if row[1] == invoiceName: print(row) invoiceNumber, invoiceToName, invoiceID, invoiceEmail, invoiceDate, invoiceExpiringDate, invoiceService, servicePrice, serviceDiscount, invoiceAddress = row self.generateInvoice(invoiceNumber, invoiceToName, invoiceID, invoiceEmail, invoiceDate, invoiceExpiringDate, invoiceService, servicePrice, serviceDiscount, invoiceAddress) def generateInvoice(self, invoiceNumber, invoiceToName, invoiceID, invoiceEmail, invoiceDate, invoiceExpiringDate, invoiceService, servicePrice, serviceDiscount, invoiceAddress): newInvoice = Invoice(invoiceNumber, invoiceToName, invoiceID, invoiceEmail, invoiceDate, invoiceExpiringDate, invoiceService, servicePrice, serviceDiscount, invoiceAddress) newInvoice.generateInvoice() newInvoice.moveInvoices() def get_data_for_search_database(self, invoiceName): # getting data query = 'SELECT * FROM invoices ORDER BY name DESC' db_rows = self.run_query(query) # filling data for row in db_rows: print(row[1]) if row[1] == invoiceName: print(row) invoiceNumber, invoiceToName, invoiceID, invoiceEmail, invoiceDate, invoiceExpiringDate, invoiceService, servicePrice, serviceDiscount, invoiceAddress = row query2 = "INSERT INTO invoices_search VALUES(NULL,?,?,?,?,?,?,?)" parametersForSearchDatabase = (invoiceNumber, invoiceToName, servicePrice, invoiceExpiringDate, servicePrice, invoiceDate, invoiceEmail) self.run_query_search_invoices(query2, parametersForSearchDatabase) print("done") def get_data_to_show_pdf(self): self.message_search_invoices['text'] = "" try: self.searchtree.item(self.searchtree.selection())['text'][1] except IndexError as e: self.message_search_invoices['text'] = "Please select a record" return self.message_search_invoices['text'] = "" name = self.searchtree.item(self.searchtree.selection())['values'][0] numberOfInvoice = self.searchtree.item( self.searchtree.selection())['text'] print(name, numberOfInvoice) pdf_file = name + ".pdf" self.open_pdf_file(pdf_file) def open_pdf_file(self, pdf_file): for subdir, dirs, files in os.walk( r'C:\Users\Michael\Desktop\PROYECTO 3 - Company System With Face Recognition To Log - 1S - 2020\PROYECTO-3-Company-System-With-Face-Recognition-To-Log---1S---2020\invoices' ): for filename in files: filepath = subdir + os.sep + filename if filename == pdf_file: if filename: os.startfile(filepath) print("PDF OPENING...") else: messagebox.showerror("Error", "Can't open PDF file") def search_for_email(self): self.message_search_invoices['text'] = "" try: self.searchtree.item(self.searchtree.selection())['text'][1] except IndexError as e: self.message_search_invoices['text'] = "Please select a record" return self.message_search_invoices['text'] = "" name = self.searchtree.item(self.searchtree.selection())['values'][0] numberOfInvoice = self.searchtree.item( self.searchtree.selection())['text'] print(self.searchtree.item(self.searchtree.selection())) print(name, numberOfInvoice) # pdf_file = name + " - " + str(numberOfInvoice) + ".pdf" self.get_pdf_to_email(name) def get_pdf_to_email(self, name): # Getting data from database query = 'SELECT * FROM invoices_search ORDER BY name DESC' db_rows = self.run_query_search_invoices(query) # filling data for row in db_rows: if row[2] == name: print(row) email = row[7] date = row[6] pdf_file = str(row[2]) + ".pdf" print(email) print(date) print(pdf_file) newEmail = SendEmail(email, "invoices/" + pdf_file, date) newEmail.send_email() messagebox.showinfo("Email Sent", "Your email has been sent to: " + email) def get_prices(self): # getting data query = 'SELECT * FROM invoices_search ORDER BY name DESC' db_rows = self.run_query_search_invoices(query) # filling data for row in db_rows: print(row[5]) newPrice = GetBankInformation() newPrice.ColonToDollar(float(row[5])) print(row)