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


import tkinter as tk
from tkinter import ttk, messagebox

from data import USERS, PRODUCTS, User

COLOR_BIG_DISCOUNT = "#FFDEAD"
COLOR_OUT_OF_STOCK = "#ADD8E6"


class LoginWindow(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Авторизация")
        self.geometry("340x320")
        self.resizable(False, False)
        self.user = None

        frame = tk.Frame(self, padx=30, pady=30)
        frame.pack(expand=True)

        tk.Label(frame, text="Вход в систему", font=("Arial", 16, "bold")).pack(pady=(0, 15))
        tk.Label(frame, text="Логин").pack(anchor="w")
        self.login_entry = tk.Entry(frame, width=30)
        self.login_entry.pack(pady=(3, 10))
        tk.Label(frame, text="Пароль").pack(anchor="w")
        self.password_entry = tk.Entry(frame, width=30, show="*")
        self.password_entry.pack(pady=(3, 15))

        tk.Button(frame, text="Войти", command=self.login).pack(fill="x")
        tk.Button(frame, text="Войти как гость", command=self.login_as_guest).pack(fill="x", pady=(8, 0))
        self.bind("<Return>", lambda event: self.login())

    def login(self):
        login = self.login_entry.get().strip()
        password = self.password_entry.get()
        for user in USERS:
            if user.login == login and user.password == password:
                self.user = user
                self.destroy()
                return
        messagebox.showerror("Ошибка входа", "Неверный логин или пароль")

    def login_as_guest(self):
        self.user = User("", "", "Гость", "Гость")
        self.destroy()


def get_background(product):
    if product.quantity == 0:
        return COLOR_OUT_OF_STOCK
    if product.discount > 17:
        return COLOR_BIG_DISCOUNT
    return "white"


class ProductsWindow(tk.Tk):
    def __init__(self, user):
        super().__init__()
        self.title("Список товаров")
        self.geometry("800x600")
        self.logged_out = False

        header = tk.Frame(self, padx=10, pady=10)
        header.pack(fill="x")
        tk.Label(header, text="Товары", font=("Arial", 16, "bold")).pack(side="left")
        tk.Button(header, text="Выход", command=self.logout).pack(side="right")
        tk.Label(header, text=user.full_name).pack(side="right", padx=10)

        self.create_scroll_area()
        self.show_products()

    def create_scroll_area(self):
        canvas = tk.Canvas(self, highlightthickness=0)
        scrollbar = ttk.Scrollbar(self, orient="vertical", command=canvas.yview)
        self.list_frame = tk.Frame(canvas)
        window_id = canvas.create_window((0, 0), window=self.list_frame, anchor="nw")

        self.list_frame.bind("<Configure>", lambda event: canvas.configure(scrollregion=canvas.bbox("all")))
        canvas.bind("<Configure>", lambda event: canvas.itemconfig(window_id, width=event.width))
        canvas.bind_all("<MouseWheel>", lambda event: canvas.yview_scroll(int(-event.delta / 120), "units"))
        canvas.configure(yscrollcommand=scrollbar.set)

        scrollbar.pack(side="right", fill="y")
        canvas.pack(side="left", fill="both", expand=True)

    def show_products(self):
        for product in PRODUCTS:
            background = get_background(product)
            card = tk.Frame(self.list_frame, bg=background, highlightbackground="black",
                            highlightthickness=1, padx=8, pady=8)
            card.pack(fill="x", padx=10, pady=3)

            info = tk.Frame(card, bg=background)
            info.pack(side="left", fill="both", expand=True)
            lines = [
                (f"{product.category} | {product.name}", ("Arial", 11, "bold")),
                (f"Описание: {product.description}", ("Arial", 10)),
                (f"Производитель: {product.manufacturer}", ("Arial", 10)),
                (f"Поставщик: {product.supplier}", ("Arial", 10)),
                (f"Цена: {product.price:.2f}", ("Arial", 10)),
                (f"Единица измерения: {product.unit}", ("Arial", 10)),
                (f"Количество на складе: {product.quantity}", ("Arial", 10)),
            ]
            for text, font in lines:
                tk.Label(info, text=text, font=font, bg=background, anchor="w",
                         justify="left", wraplength=550).pack(fill="x")

            discount_box = tk.Frame(card, bg=background, highlightbackground="black", highlightthickness=1)
            discount_box.pack(side="right", fill="y")
            tk.Label(discount_box, text=f"{product.discount}%", font=("Arial", 18, "bold"),
                     bg=background).pack(expand=True, padx=20)

    def logout(self):
        self.logged_out = True
        self.destroy()


def main():
    while True:
        login_window = LoginWindow()
        login_window.mainloop()
        if login_window.user is None:
            break

        products_window = ProductsWindow(login_window.user)
        products_window.mainloop()
        if not products_window.logged_out:
            break


if __name__ == "__main__":
    main()