Загрузка данных
import tkinter as tk
from tkinter import ttk
from database import Database
class ProductsView:
def __init__(self, parent, user):
self.parent = parent
self.user = user
self.db = Database()
# Главный фрейм страницы
self.window = tk.Frame(parent, bg="#FFFFFF")
self.window.pack(fill=tk.BOTH, expand=True)
tk.Label(self.window, text="Каталог товаров", font=("Arial", 14, "bold"), bg="#FFFFFF").pack(pady=10)
# Контейнер для прокрутки
container = tk.Frame(self.window, bg="#FFFFFF")
container.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)
# Холст (Canvas) позволяет прокручивать содержимое внутри него
self.canvas = tk.Canvas(container, bg="#FFFFFF", highlightthickness=0)
scrollbar = ttk.Scrollbar(container, orient=tk.VERTICAL, command=self.canvas.yview)
# Внутренний фрейм, куда будут складываться карточки
self.scrollable_frame = tk.Frame(self.canvas, bg="#FFFFFF")
self.scrollable_frame.bind(
"<Configure>",
lambda e: self.canvas.configure(scrollregion=self.canvas.bbox("all"))
)
self.canvas_frame_id = self.canvas.create_window((0, 0), window=self.scrollable_frame, anchor="nw")
# Растягиваем карточки по ширине экрана
self.canvas.bind('<Configure>', lambda event: self.canvas.itemconfigure(self.canvas_frame_id, width=event.width))
self.canvas.configure(yscrollcommand=scrollbar.set)
self.canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
# Привязка колесика мыши для удобного скроллинга
self.canvas.bind_all("<MouseWheel>", lambda event: self.canvas.yview_scroll(int(-1 * (event.delta / 120)), "units"))
self.load_products_cards()
def load_products_cards(self):
# Очищаем старые данные
for widget in self.scrollable_frame.winfo_children():
widget.destroy()
products = self.db.get_all_products()
for p in products:
try: discount = float(p.discount.replace('%', '').strip())
except: discount = 0.0
try: qty = float(p.quantity.strip())
except: qty = 0.0
# Практика 5: Установка цветов фона и текста
if qty == 0:
bg_color = "#ADD8E6" # Голубой
fg_color = "black"
elif discount > 10:
bg_color = "#2E8B57" # Зеленый
fg_color = "white" # Белый текст для читаемости на темном фоне
else:
bg_color = "#FFFFFF" # Белый
fg_color = "black"
# Внешняя рамка карточки (Solid border)
card_frame = tk.Frame(self.scrollable_frame, bg=bg_color, bd=2, relief=tk.SOLID)
card_frame.pack(fill=tk.X, padx=10, pady=5, ipady=5)
# --- ЛЕВАЯ ЧАСТЬ: Фото ---
img_container = tk.Frame(card_frame, width=120, height=120, bg="#FFFFFF", bd=1, relief=tk.SOLID)
img_container.pack(side=tk.LEFT, padx=15, pady=10)
img_container.pack_propagate(False)
img_file = p.photo if p.photo else "picture.png"
try:
img = tk.PhotoImage(file=img_file).subsample(2, 2)
img_lbl = tk.Label(img_container, image=img, bg="#FFFFFF")
img_lbl.image = img
img_lbl.pack(fill=tk.BOTH, expand=True)
except Exception:
tk.Label(img_container, text="picture.png", font=("Arial", 9), bg="#FFFFFF", fg="black").pack(fill=tk.BOTH, expand=True)
# --- ЦЕНТРАЛЬНАЯ ЧАСТЬ: Информация строго по Практике 4 ---
info_frame = tk.Frame(card_frame, bg=bg_color)
info_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=15, pady=10)
tk.Label(info_frame, text=f"{p.category} | {p.name}", font=("Arial", 12, "bold"), bg=bg_color, fg=fg_color).pack(anchor=tk.W)
tk.Label(info_frame, text=f"Описание товара: {p.description}", font=("Arial", 9), bg=bg_color, fg=fg_color, wraplength=450, justify=tk.LEFT).pack(anchor=tk.W, pady=2)
tk.Label(info_frame, text=f"Производитель: {p.manufacturer}", font=("Arial", 9), bg=bg_color, fg=fg_color).pack(anchor=tk.W)
tk.Label(info_frame, text=f"Поставщик: {p.supplier}", font=("Arial", 9), bg=bg_color, fg=fg_color).pack(anchor=tk.W)
# Строка с ценой
price_frame = tk.Frame(info_frame, bg=bg_color)
price_frame.pack(anchor=tk.W, pady=2)
tk.Label(price_frame, text="Цена: ", font=("Arial", 9), bg=bg_color, fg=fg_color).pack(side=tk.LEFT)
if discount > 0:
try:
old_price = float(p.price)
new_price = old_price * (1 - discount / 100)
tk.Label(price_frame, text=f"{old_price} руб.", fg="red", font=("Arial", 10, "overstrike"), bg=bg_color).pack(side=tk.LEFT, padx=(0, 7))
tk.Label(price_frame, text=f"{new_price:.2f} руб.", fg=fg_color, font=("Arial", 10, "bold"), bg=bg_color).pack(side=tk.LEFT)
except Exception:
tk.Label(price_frame, text=f"{p.price} руб.", font=("Arial", 10, "bold"), bg=bg_color, fg=fg_color).pack(side=tk.LEFT)
else:
tk.Label(price_frame, text=f"{p.price} руб.", font=("Arial", 10, "bold"), bg=bg_color, fg=fg_color).pack(side=tk.LEFT)
tk.Label(info_frame, text=f"Единица измерения: {p.unit}", font=("Arial", 9), bg=bg_color, fg=fg_color).pack(anchor=tk.W)
tk.Label(info_frame, text=f"Количество на складе: {p.quantity}", font=("Arial", 9), bg=bg_color, fg=fg_color).pack(anchor=tk.W)
# --- ПРАВАЯ ЧАСТЬ: Скидка ---
discount_frame = tk.Frame(card_frame, width=100, bg=bg_color)
discount_frame.pack(side=tk.RIGHT, padx=25, pady=10)
tk.Label(discount_frame, text="Действующая\nскидка", font=("Arial", 9), bg=bg_color, fg=fg_color).pack()
disc_fg = "red" if bg_color == "#FFFFFF" else ("#FFCCCC" if bg_color == "#2E8B57" else "red")
tk.Label(discount_frame, text=f"{p.discount}%", font=("Arial", 14, "bold"), fg=disc_fg, bg=bg_color).pack(pady=5)