182 lines
6.8 KiB
Python
182 lines
6.8 KiB
Python
import logging
|
||
import tkinter as tk
|
||
from functools import partial
|
||
from tkinter import messagebox, Canvas
|
||
from PIL import Image, ImageTk
|
||
import math
|
||
|
||
from config import BUTTON_COLOR_EXIT, CHIHUAHUA, CORGI, RETRIEVER, HUSKY, POMERANIAN, PUG, YORKSHIRE
|
||
from src.ui.user_ui.game_ui import GameUI
|
||
from src.ui.user_ui.knowledge_ui import knowledge_ui
|
||
from src.ui.user_ui.profile_ui import profile_ui
|
||
|
||
# Пути к изображениям собак
|
||
DOG_IMAGES = [
|
||
CHIHUAHUA,
|
||
CORGI,
|
||
RETRIEVER,
|
||
HUSKY,
|
||
POMERANIAN,
|
||
PUG,
|
||
YORKSHIRE
|
||
]
|
||
|
||
# Настройки
|
||
BACKGROUND_COLOR = "#E5E5E5" # Цвет фона
|
||
BUTTON_COLOR_PLAY = "#4CAF50" # Цвет кнопки играть
|
||
BUTTON_TEXT_COLOR = "white" # Цвет текста на кнопке
|
||
FONT = ("Arial", 12)
|
||
BIG_FONT = ("Arial", 24)
|
||
PLAY_BUTTON_RADIUS = 100 # Радиус кнопки "Играть"
|
||
|
||
|
||
class UserApp:
|
||
def __init__(self, root, user_id):
|
||
"""Инициализация пользовательского интерфейса."""
|
||
self.root = root
|
||
self.user_id = user_id
|
||
self.root.configure(bg="#E5E5E5")
|
||
self.root.geometry("1920x1080")
|
||
self.root.title("Собачья академия")
|
||
self.show_user_dashboard()
|
||
|
||
def show_user_dashboard(self):
|
||
"""Показать интерфейс пользователя."""
|
||
center_x, center_y = 960, 540 # Центр экрана
|
||
radius = 300 # Радиус круга для размещения собак
|
||
num_dogs = len(DOG_IMAGES)
|
||
|
||
# Верхняя панель
|
||
top_panel = tk.Frame(self.root, bg="#333333", height=100)
|
||
top_panel.pack(fill=tk.X, side=tk.TOP)
|
||
|
||
# Кнопки на верхней панели
|
||
profile_button = tk.Button(
|
||
top_panel,
|
||
text="Профиль",
|
||
bg="#555555",
|
||
fg="white",
|
||
font=FONT,
|
||
relief=tk.FLAT,
|
||
padx=20,
|
||
pady=10,
|
||
command=self.show_profile
|
||
)
|
||
profile_button.pack(side=tk.LEFT, padx=20)
|
||
|
||
shop_button = tk.Button(
|
||
top_panel,
|
||
text="Магазин",
|
||
bg="#555555",
|
||
fg="white",
|
||
font=FONT,
|
||
relief=tk.FLAT,
|
||
padx=20,
|
||
pady=10,
|
||
state=tk.DISABLED # Делаем кнопку некликабельной
|
||
)
|
||
shop_button.pack(side=tk.LEFT, padx=20)
|
||
|
||
knowledge_button = tk.Button(
|
||
top_panel,
|
||
text="База знаний",
|
||
bg="#555555",
|
||
fg="white",
|
||
font=FONT,
|
||
relief=tk.FLAT,
|
||
padx=20,
|
||
pady=10,
|
||
state=tk.NORMAL, # Делаем кнопку активной
|
||
command=lambda: knowledge_ui(self.root, self) # Подключаем knowledge_ui
|
||
)
|
||
knowledge_button.pack(side=tk.LEFT, padx=20)
|
||
|
||
# Размещение собак по кругу
|
||
self.place_dog_images(center_x, center_y, radius, num_dogs)
|
||
|
||
# Кнопка "Играть" (увеличенная)
|
||
play_button_canvas = tk.Canvas(
|
||
self.root,
|
||
width=PLAY_BUTTON_RADIUS * 2,
|
||
height=PLAY_BUTTON_RADIUS * 2,
|
||
bg=BACKGROUND_COLOR,
|
||
highlightthickness=0,
|
||
)
|
||
play_button_canvas.place(relx=0.5, rely=0.5, anchor=tk.CENTER)
|
||
|
||
play_button_canvas.create_oval(
|
||
0, 0, PLAY_BUTTON_RADIUS * 2, PLAY_BUTTON_RADIUS * 2,
|
||
fill=BUTTON_COLOR_PLAY,
|
||
outline=BUTTON_COLOR_PLAY,
|
||
)
|
||
play_button_canvas.create_text(
|
||
PLAY_BUTTON_RADIUS,
|
||
PLAY_BUTTON_RADIUS,
|
||
text="Играть",
|
||
fill=BUTTON_TEXT_COLOR,
|
||
font=BIG_FONT,
|
||
)
|
||
play_button_canvas.tag_bind("all", "<Button-1>", lambda e: self.play_game())
|
||
|
||
# Кнопка выхода
|
||
exit_button = tk.Button(
|
||
self.root,
|
||
text="Выйти",
|
||
bg=BUTTON_COLOR_EXIT,
|
||
fg="white",
|
||
font=FONT,
|
||
command=self.exit_app
|
||
)
|
||
exit_button.place(relx=0.9, rely=0.95, anchor=tk.CENTER)
|
||
|
||
def place_dog_images(self, center_x, center_y, radius, num_dogs):
|
||
"""Размещает изображения собак по кругу."""
|
||
angle_step = 2 * math.pi / num_dogs # Шаг угла для размещения собак
|
||
for i in range(num_dogs):
|
||
angle = i * angle_step
|
||
x = center_x + radius * math.cos(angle)
|
||
y = center_y + radius * math.sin(angle)
|
||
|
||
# Загрузка изображения собаки
|
||
image_path = DOG_IMAGES[i]
|
||
try:
|
||
dog_image = Image.open(image_path)
|
||
dog_image = dog_image.resize((100, 100), Image.Resampling.LANCZOS)
|
||
dog_photo = ImageTk.PhotoImage(dog_image)
|
||
|
||
# Создание метки с изображением
|
||
dog_label = tk.Label(self.root, image=dog_photo, bg=BACKGROUND_COLOR)
|
||
dog_label.image = dog_photo # Сохраняем ссылку на изображение
|
||
dog_label.place(x=x - 50, y=y - 50) # Центрируем метку относительно позиции
|
||
except Exception as e:
|
||
print(f"Ошибка загрузки изображения {image_path}: {e}")
|
||
|
||
def show_profile(self):
|
||
"""Показать экран профиля пользователя."""
|
||
try:
|
||
self.clear_frame()
|
||
profile_ui(self.root, self.user_id, self)
|
||
except Exception as e:
|
||
logging.error(f"Ошибка при отображении профиля: {e}")
|
||
messagebox.showerror("Ошибка", "Не удалось открыть профиль.")
|
||
|
||
def clear_frame(self):
|
||
"""Очистить текущий экран."""
|
||
for widget in self.root.winfo_children():
|
||
widget.destroy()
|
||
|
||
def play_game(self):
|
||
"""Запуск игры и передача колбэка для возврата в меню."""
|
||
# Передаем метод через partial для корректной передачи self
|
||
return_to_main_menu = partial(self.return_to_main_menu)
|
||
GameUI(self.root, self.user_id, return_to_main_menu)
|
||
|
||
def return_to_main_menu(self):
|
||
"""Возврат в главное меню."""
|
||
self.clear_frame() # Очищаем экран перед переходом
|
||
self.show_user_dashboard() # Показываем главное меню
|
||
|
||
def exit_app(self):
|
||
"""Подтверждение выхода из приложения."""
|
||
if messagebox.askyesno("Выход", "Вы уверены, что хотите выйти?"):
|
||
self.root.quit()
|