Загрузка данных


import tkinter as tk
from tkinter import ttk, messagebox
import pymysql

# --- Настройки подключения к Open Server (MySQL) ---
DB_CONFIG = {
    "host": "localhost",
    "port": 3306,
    "user": "root",
    "password": "",          # в Open Server у root пароль обычно пустой
    "database": "autoservice",
    "charset": "utf8mb4",
}


def connect():
    return pymysql.connect(**DB_CONFIG)


def get_client(login, password):
    con = connect()
    try:
        with con.cursor() as cur:
            cur.execute(
                "SELECT client_id, name FROM Clients WHERE login=%s AND password=%s",
                (login, password)
            )
            return cur.fetchone()
    finally:
        con.close()


def get_orders(client_id):
    con = connect()
    try:
        with con.cursor() as cur:
            cur.execute("""
                SELECT o.order_no, w.name, o.order_date,
                       IFNULL(o.done_date, '—') AS done,
                       o.qty, w.price * o.qty
                FROM Orders o
                JOIN Works w ON w.work_code = o.work_code
                WHERE o.client_id = %s
                ORDER BY o.order_no
            """, (client_id,))
            return cur.fetchall()
    finally:
        con.close()


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Автосервис «Мастер» — кабинет клиента")
        self.geometry("700x400")
        self.show_login()

    def clear(self):
        for w in self.winfo_children():
            w.destroy()

    def show_login(self):
        self.clear()
        f = ttk.Frame(self, padding=30)
        f.pack(expand=True)
        ttk.Label(f, text="Вход для клиента", font=("Arial", 14)).grid(
            row=0, column=0, columnspan=2, pady=10)
        ttk.Label(f, text="Логин:").grid(row=1, column=0, sticky="e", pady=5)
        ttk.Label(f, text="Пароль:").grid(row=2, column=0, sticky="e", pady=5)
        self.e_login = ttk.Entry(f)
        self.e_pass = ttk.Entry(f, show="*")
        self.e_login.grid(row=1, column=1, pady=5)
        self.e_pass.grid(row=2, column=1, pady=5)
        ttk.Button(f, text="Войти", command=self.login).grid(
            row=3, column=0, columnspan=2, pady=15)
        ttk.Label(f, text="demo: sidorov / 1234", foreground="gray").grid(
            row=4, column=0, columnspan=2)

    def login(self):
        try:
            c = get_client(self.e_login.get().strip(), self.e_pass.get().strip())
        except pymysql.MySQLError as e:
            messagebox.showerror("Ошибка БД",
                                 f"Нет подключения к MySQL.\nЗапущен ли Open Server?\n\n{e}")
            return
        if c:
            self.show_orders(c[0], c[1])
        else:
            messagebox.showerror("Ошибка", "Неверный логин или пароль")

    def show_orders(self, client_id, name):
        self.clear()
        top = ttk.Frame(self, padding=10)
        top.pack(fill="x")
        ttk.Label(top, text=f"Клиент: {name}", font=("Arial", 12)).pack(side="left")
        ttk.Button(top, text="Выйти", command=self.show_login).pack(side="right")

        cols = ("no", "work", "order_date", "done", "qty", "sum")
        heads = ("№", "Вид работы", "Дата заказа", "Дата выполнения", "Кол-во", "Сумма, руб.")
        tree = ttk.Treeview(self, columns=cols, show="headings")
        for c, h in zip(cols, heads):
            tree.heading(c, text=h)
            tree.column(c, width=110, anchor="center")
        tree.column("work", width=180, anchor="w")
        for r in get_orders(client_id):
            tree.insert("", "end", values=r)
        tree.pack(fill="both", expand=True, padx=10, pady=10)


if __name__ == "__main__":
    App().mainloop()