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