Загрузка данных
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()