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)
Esempio n. 2
0
 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)
Esempio n. 4
0
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()
Esempio n. 6
0
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)
Esempio n. 9
0
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)
            '''
Esempio n. 10
0
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
        
Esempio n. 11
0
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
Esempio n. 12
0
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')
Esempio n. 13
0
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")
Esempio n. 15
0
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
Esempio n. 16
0
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()
Esempio n. 18
0
    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)
Esempio n. 19
0
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)
Esempio n. 20
0
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()
Esempio n. 21
0
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()
Esempio n. 22
0
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)
Esempio n. 23
0
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()
Esempio n. 24
0
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")
Esempio n. 25
0
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, "")
Esempio n. 26
0
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))
Esempio n. 30
0
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)