Изменён пользовательский интерфейс main_menu.py, game_ui.py. Настроен вызов функций для запуска игрового процесса: после нажатия кнопки 'играть' открывается выбор собаки, а затем выбор уровня. Обновлена структура базы данных. Удалены не нужные файлы для проекта.

This commit is contained in:
Xatiko 2024-11-26 23:02:04 +03:00
parent 989a9056e7
commit c08cf51998
46 changed files with 804 additions and 111 deletions

View file

@ -1,78 +1,167 @@
import tkinter as tk
from config import (
BACKGROUND_COLOR_USER,
TOP_PANEL_COLOR_USER,
BUTTON_COLOR_PROFILE_USER,
BUTTON_COLOR_PLAY_USER,
BUTTON_COLOR_EXIT_USER,
BUTTON_TEXT_COLOR_USER,
FONT_USER,
BIG_FONT_USER,
BUTTON_RADIUS_USER,
EXIT_BUTTON_SIZE_USER,
)
from tkinter import Canvas
from PIL import Image, ImageTk
import math
from config import EXIT_BUTTON_WIDTH, EXIT_BUTTON_HEIGHT, BUTTON_COLOR_EXIT
from src.ui.user_ui.game_ui import GameUI
from src.ui.user_ui.profile_ui import profile_ui
from src.ui.user_ui.shop_ui import shop_ui
from src.ui.user_ui.knowledge_ui import knowledge_ui
from src.utils import clear_frame
# Пути к изображениям собак
DOG_IMAGES = [
"F:/Projects/Dog_Academy/assets/dogs/Chihuahua.png",
"F:/Projects/Dog_Academy/assets/dogs/Corgi.png",
"F:/Projects/Dog_Academy/assets/dogs/Golden_Retriever.png",
"F:/Projects/Dog_Academy/assets/dogs/Husky.png",
"F:/Projects/Dog_Academy/assets/dogs/Pomeranian.png",
"F:/Projects/Dog_Academy/assets/dogs/Pug.png",
"F:/Projects/Dog_Academy/assets/dogs/Yorkshire_Terrier.png"
]
# Настройки
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, auth_ui):
def __init__(self, root, user_id=None):
self.root = root
self.auth_ui = auth_ui
self.root.configure(bg=BACKGROUND_COLOR_USER)
self.root.geometry("1920x1080") # Разрешение окна
self.user_id = user_id
self.root.configure(bg=BACKGROUND_COLOR)
self.root.geometry("1920x1080")
self.root.title("Собачья академия")
print("Главное меню активно") # Лог при открытии меню
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=TOP_PANEL_COLOR_USER, height=100)
top_panel = tk.Frame(self.root, bg="#333333", height=100)
top_panel.pack(fill=tk.X, side=tk.TOP)
# Кнопки на верхней панели
for text, command in [("Профиль", self.show_profile), ("Магазин", self.show_shop), ("База знаний", self.show_knowledge)]:
button = tk.Button(
top_panel,
text=text,
bg=BUTTON_COLOR_PROFILE_USER,
fg=BUTTON_TEXT_COLOR_USER,
font=FONT_USER,
relief=tk.FLAT,
padx=20,
pady=10,
command=command,
)
button.pack(side=tk.LEFT, padx=20)
# Кнопка "Играть" в центре
play_button = tk.Button(
self.root,
text="Играть",
bg=BUTTON_COLOR_PLAY_USER,
fg=BUTTON_TEXT_COLOR_USER,
font=BIG_FONT_USER,
profile_button = tk.Button(
top_panel,
text="Профиль",
bg="#555555",
fg="white",
font=FONT,
relief=tk.FLAT,
height=2,
width=10,
command=self.play_game,
padx=20,
pady=10,
command=self.show_profile
)
play_button.place(relx=0.5, rely=0.5, anchor=tk.CENTER)
profile_button.pack(side=tk.LEFT, padx=20)
# Кнопка "Выход" в правом нижнем углу
exit_button = tk.Button(
self.root,
text="Выход",
bg=BUTTON_COLOR_EXIT_USER,
fg=BUTTON_TEXT_COLOR_USER,
font=FONT_USER,
width=EXIT_BUTTON_SIZE_USER[0] // 10,
height=EXIT_BUTTON_SIZE_USER[1] // 10,
command=self.exit_app,
shop_button = tk.Button(
top_panel,
text="Магазин",
bg="#555555",
fg="white",
font=FONT,
relief=tk.FLAT,
padx=20,
pady=10,
command=self.show_shop
)
exit_button.place(relx=1.0, rely=1.0, x=-20, y=-20, anchor=tk.SE)
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,
command=self.show_knowledge
)
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())
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):
"""Показать экран профиля пользователя."""
self.clear_frame()
profile_ui(self.root, self.user_id) # Передаем user_id в profile_ui
def show_shop(self):
"""Показать экран магазина."""
self.clear_frame()
shop_ui(self.root)
def show_knowledge(self):
"""Показать базу знаний."""
self.clear_frame()
knowledge_ui(self.root)
def clear_frame(self):
"""Очистить текущий экран."""
for widget in self.root.winfo_children():
widget.destroy()
def play_game(self):
"""Заглушка для игры."""
"""Переход к игровому интерфейсу."""
clear_frame(self.root) # Очищаем главное меню
GameUI(self.root, self.user_id) # Открываем игровой интерфейс
print("Запуск игры...")
def exit_app(self):
@ -80,14 +169,9 @@ class UserApp:
print("Приложение закрыто")
self.root.quit()
def show_profile(self):
"""Заглушка для профиля."""
print("Переход в профиль...")
# Запуск главного окна
if __name__ == "__main__":
root = tk.Tk()
app = UserApp(root, user_id=123) # Передаем user_id (это может быть получено после авторизации)
root.mainloop()
def show_shop(self):
"""Заглушка для магазина."""
print("Переход в магазин...")
def show_knowledge(self):
"""Заглушка для базы знаний."""
print("Переход в базу знаний...")