From dc442d53e39c50c3075896812d200946fb7e3280 Mon Sep 17 00:00:00 2001 From: Xatiko <107261855+Anymorexxx@users.noreply.github.com> Date: Fri, 6 Dec 2024 23:42:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20?= =?UTF-8?q?=D1=81=20=D0=B1=D0=B0=D0=B7=D0=BE=D0=B9=20=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D0=B2=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80?= =?UTF-8?q?=D1=84=D0=B5=D0=B9=D1=81=D0=B5=20=D0=B0=D0=B4=D0=BC=D0=B8=D0=BD?= =?UTF-8?q?=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=B0,=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=81=D0=BC=D0=BE=D1=82=D1=80=20=D1=82=D0=B0=D0=B1=D0=BB?= =?UTF-8?q?=D0=B8=D1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/DogAcademy.db | Bin 36864 -> 36864 bytes database/db_events.py | 128 +++- database/db_session.py | 8 +- database/models.py | 4 +- logs/logfile.log | 939 +++++++++++++++++++++++++++ logs_export.csv | 4 - requirements | 3 - src/ui/admin_ui.py | 608 +++++++++++------ src/user_functions/game_functions.py | 43 -- src/user_functions/map_generator.py | 13 - 10 files changed, 1485 insertions(+), 265 deletions(-) delete mode 100644 logs_export.csv delete mode 100644 requirements delete mode 100644 src/user_functions/game_functions.py delete mode 100644 src/user_functions/map_generator.py diff --git a/database/DogAcademy.db b/database/DogAcademy.db index 97ef5a076919e1f3931dee3878e7d5dd19cedb41..d611985fcf271af93b5a98739cea0641b6ac2d4a 100644 GIT binary patch delta 446 zcmZozz|^pSX@WH4)rm6Bj8``%EaPXp!@&QA|ITJXfeZWwVoWRy%F;QdNjar{nc0~o zrMap3<%UMaT#PIX!or2+sX)ZVz`(%7|B`|KCI8ROf(m!}`T3cZ8Ikl%{-H0&#BQ~* zQHfnbjDsDh5eOi9;pFBZ^DP`~*FaWZ16qBGUrUCGje)_ElL2UDUS(o&MrKuFReo7% z3D_NpT#P_jQBDSsdnN^_FtPmJ*m#OXPKKYIfl*dcl7pjI5X1yp#KDTNgfH|b7bDYV zj)XaUj0}^P=BWe8vtaUTp0cS58xI2mBM=xfFmiA(iBwh^85o)98XD;u7%LcBTA3PJ znHs00D6;~Ual({M_RAM%OHpG1icQYS2N^gCOzz581+pLHs|z#n|K`6B^w)L%xBSoe zFYuq_KLqsQ3Vs_l7NBkHoM4KL15B~9gDEC9HdYp(9jvTiE(;5oVrGU&GO@5QZ2niz GBme-)x@`mi delta 357 zcmZozz|^pSX@WH4$%!(~j3+lHEaPW;#=!rD|Ji0ig&X`D3=BL>EDWNexvBZ(Ak4+c z!XPYMSe^<*Tnr2hO#B}h_&@Of1goAHz{A18EXoK{IQfUZ+{Q*5_RT@&TR7NWFz|on ze*sm*BEikX#=s!X$pBJV&dCVm2y-&z=3.7.0 diff --git a/src/ui/admin_ui.py b/src/ui/admin_ui.py index 627643b..ae3ea1b 100644 --- a/src/ui/admin_ui.py +++ b/src/ui/admin_ui.py @@ -8,7 +8,8 @@ from database.db_session import get_session from database.models import Dogs, Questions, Users from src.admin_functions import admin_logging, statistics from src.utils import clear_frame, feature_in_development_admin # Импортируем общую функцию для очистки фрейма -from database.db_events import check_user, get_all_users, get_all_questions, get_all_dogs +from database.db_events import check_user, get_all_users, get_all_questions, get_all_dogs, delete_dog, update_dog_info, \ + add_question_to_db, add_user_to_db, add_dog_to_db, delete_question, delete_user # Конфигурация цветов из config.py BACKGROUND_COLOR = "#403d49" @@ -99,19 +100,12 @@ class AdminApp: ("Просмотр таблиц", self.view_tables), ]), ("Управление игровым контентом", [ - ("Создание и настройка уровней", feature_in_development_admin), - ("Настройка параметров собаки", feature_in_development_admin), + ("Создание и настройка уровней", lambda: feature_in_development_admin(self.main_frame)), + ("Настройка параметров собаки", lambda: feature_in_development_admin(self.main_frame)), ]), ("Управление интерфейсом пользователя", [ - ("Добавление подсказок в интерфейс", feature_in_development_admin), - ]), - ("Работа с базой знаний", [ - ("Добавление информации", feature_in_development_admin), - ("Редактирование записей", feature_in_development_admin), - ("Удаление записей", feature_in_development_admin), - ("Просмотр базы знаний", feature_in_development_admin), - ("Генерация вопросов", feature_in_development_admin), - ]), + ("Добавление подсказок в интерфейс", lambda: feature_in_development_admin(self.main_frame)), + ]) ] # Определяем максимальную ширину текста для настройки ширины меню и кнопок @@ -280,231 +274,477 @@ class AdminApp: def manage_users(self): """Управление пользователями.""" clear_frame(self.main_frame) - tk.Label(self.main_frame, text="Редактирование пользователей", font=("Comic Sans MS", 16)).pack() - users = get_all_users() # Получаем пользователей + tk.Label(self.main_frame, text="Управление пользователями", font=("Comic Sans MS", 16), bg=BACKGROUND_COLOR, + fg=TEXT_COLOR).pack() + + # Кнопка добавления нового пользователя + tk.Button( + self.main_frame, + text="Добавить пользователя", + command=self.open_add_user_window, + bg=BUTTON_COLOR, + fg=TEXT_COLOR + ).pack(pady=10) + + # Кнопка обновления списка + tk.Button( + self.main_frame, + text="Обновить список", + command=self.manage_users, # Перезагрузка данных + bg=BUTTON_COLOR, + fg=TEXT_COLOR + ).pack(pady=10) + + users = get_all_users() # Получение списка пользователей + if not users: tk.Label(self.main_frame, text="Нет пользователей в базе данных.", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack() return - table = ttk.Treeview(self.main_frame, columns=("ID", "Логин", "Имя"), show="headings") + # Отображение данных в таблице + table = ttk.Treeview(self.main_frame, columns=("ID", "Логин", "Имя пользователя", "Уровень"), show="headings") table.heading("ID", text="ID") table.heading("Логин", text="Логин") - table.heading("Имя", text="Имя") - table.pack(fill="both", expand=True) + table.heading("Имя пользователя", text="Имя пользователя") + table.heading("Уровень", text="Уровень") + table.pack(fill="both", expand=True, pady=10) + # Очистка старых записей из таблицы + for row in table.get_children(): + table.delete(row) + + # Добавление данных из базы for user in users: - table.insert("", "end", values=(user.user_id, user.auth.login, user.username)) + table.insert("", "end", values=(user.user_id, user.auth.login, user.username, user.level)) + + def delete_selected(): + selected_item = table.selection() + if not selected_item: + messagebox.showwarning("Удаление", "Выберите пользователя для удаления.") + return + user_id = table.item(selected_item, "values")[0] + success, message = delete_user(user_id) + if success: + messagebox.showinfo("Успех", message) + self.manage_users() # Обновление списка + else: + messagebox.showerror("Ошибка", message) + + # Кнопка удаления + tk.Button( + self.main_frame, + text="Удалить выбранного пользователя", + command=delete_selected, + bg=BUTTON_COLOR, + fg=TEXT_COLOR + ).pack(pady=10) def manage_questions(self): """Управление вопросами.""" clear_frame(self.main_frame) - tk.Label(self.main_frame, text="Управление вопросами", font=("Comic Sans MS", 16)).pack() - questions = get_all_questions() # Получаем вопросы + tk.Label(self.main_frame, text="Управление вопросами", font=("Comic Sans MS", 16), bg=BACKGROUND_COLOR, + fg=TEXT_COLOR).pack() + + # Кнопка добавления нового вопроса + tk.Button( + self.main_frame, + text="Добавить вопрос", + command=self.open_add_question_window, + bg=BUTTON_COLOR, + fg=TEXT_COLOR + ).pack(pady=10) + + # Кнопка обновления списка + tk.Button( + self.main_frame, + text="Обновить список", + command=self.manage_questions, # Перезагрузка данных + bg=BUTTON_COLOR, + fg=TEXT_COLOR + ).pack(pady=10) + + questions = get_all_questions() # Получение списка вопросов + if not questions: tk.Label(self.main_frame, text="Нет вопросов в базе данных.", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack() return - table = ttk.Treeview(self.main_frame, columns=("ID", "Вопрос", "Ответ"), show="headings") + # Отображение данных в таблице + table = ttk.Treeview(self.main_frame, columns=("ID", "Вопрос", "Полезная информация"), show="headings") table.heading("ID", text="ID") table.heading("Вопрос", text="Вопрос") - table.heading("Ответ", text="Ответ") - table.pack(fill="both", expand=True) + table.heading("Полезная информация", text="Полезная информация") + table.pack(fill="both", expand=True, pady=10) + + # Очистка таблицы перед заполнением новыми данными + for row in table.get_children(): + table.delete(row) for question in questions: - table.insert("", "end", values=( - question.question_id, question.question_text, question.helpful_info)) # Заполняем таблицу данными + table.insert("", "end", values=(question.question_id, question.question_text, question.helpful_info)) + + def delete_selected(): + selected_item = table.selection() + if not selected_item: + messagebox.showwarning("Удаление", "Выберите вопрос для удаления.") + return + + question_id = table.item(selected_item, "values")[0] # Получение ID вопроса + success, message = delete_question(question_id) # Вызов метода для удаления вопроса + if success: + messagebox.showinfo("Успех", message) + self.manage_questions() # Обновление списка вопросов + else: + messagebox.showerror("Ошибка", message) + + # Кнопка удаления + tk.Button( + self.main_frame, + text="Удалить выбранный вопрос", + command=delete_selected, + bg=BUTTON_COLOR, + fg=TEXT_COLOR + ).pack(pady=10) def manage_dogs(self): - """Управление собаками.""" + """Управление породами собак.""" clear_frame(self.main_frame) - tk.Label(self.main_frame, text="Управление собаками", font=("Comic Sans MS", 16)).pack() - dogs = get_all_dogs() # Получаем список собак + # Заголовок + tk.Label(self.main_frame, text="Управление породами собак", font=("Comic Sans MS", 16), bg=BACKGROUND_COLOR, + fg=TEXT_COLOR).pack() + + # Функция удаления выбранной породы + def delete_selected(): + selected_item = table.selection() + if not selected_item: + messagebox.showwarning("Удаление", "Выберите породу для удаления.") + return + dog_id = table.item(selected_item, "values")[0] # ID породы + success, message = delete_dog(dog_id) + if success: + messagebox.showinfo("Успех", message) + self.manage_dogs() # Обновление списка + else: + messagebox.showerror("Ошибка", message) + + # Функция редактирования выбранной породы + def edit_selected(): + selected_item = table.selection() + if not selected_item: + messagebox.showwarning("Редактирование", "Выберите породу для редактирования.") + return + + # Получение данных выбранной породы + dog_data = table.item(selected_item, "values") + + # Пример dog_data: ('dog_id', 'breed', 'characteristics', 'behavior', 'care_info', 'admin_comments') + + if len(dog_data) < 6: + messagebox.showwarning("Ошибка", "Недостаточно данных для редактирования.") + return + + dog_id = dog_data[0] + breed = dog_data[1] + characteristics = dog_data[2] + behavior = dog_data[3] + care_info = dog_data[4] # Дополнительная информация о породе + admin_comments = dog_data[5] # Комментарии администратора + + # Вызов функции открытия окна редактирования породы, передавая все необходимые данные + self.open_edit_dog_window(dog_id, breed, characteristics, behavior, care_info, admin_comments) + + # Кнопка добавления новой породы + tk.Button( + self.main_frame, + text="Добавить породу", + command=self.open_add_dog_window, + bg=BUTTON_COLOR, + fg=TEXT_COLOR + ).pack(pady=10) + + # Кнопка обновления списка + tk.Button( + self.main_frame, + text="Обновить список", + command=self.manage_dogs, # Повторный вызов для обновления данных + bg=BUTTON_COLOR, + fg=TEXT_COLOR + ).pack(pady=10) + + # Кнопка удаления + tk.Button( + self.main_frame, + text="Удалить выбранную породу", + command=delete_selected, + bg=BUTTON_COLOR, + fg=TEXT_COLOR + ).pack(pady=10) + + # Кнопка редактирования + tk.Button( + self.main_frame, + text="Редактировать выбранную породу", + command=edit_selected, + bg=BUTTON_COLOR, + fg=TEXT_COLOR + ).pack(pady=10) + + # Получение данных из базы + dogs = get_all_dogs() + if not dogs: - tk.Label(self.main_frame, text="Нет собак в базе данных.", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack() + tk.Label(self.main_frame, text="Нет записей о породах в базе данных.", bg=BACKGROUND_COLOR, + fg=TEXT_COLOR).pack() return - table = ttk.Treeview(self.main_frame, columns=("ID", "Порода", "Характеристики"), show="headings") + # Создание таблицы + table = ttk.Treeview(self.main_frame, columns=( + "ID", "Порода", "Характеристики", "Поведение", "Информация по уходу", "Комментарии"), show="headings") table.heading("ID", text="ID") table.heading("Порода", text="Порода") table.heading("Характеристики", text="Характеристики") - table.pack(fill="both", expand=True) + table.heading("Поведение", text="Поведение") + table.heading("Информация по уходу", text="Информация по уходу") + table.heading("Комментарии", text="Комментарии") + table.pack(fill="both", expand=True, pady=10) + # Заполнение таблицы данными о породах for dog in dogs: - table.insert("", "end", values=(dog.dog_id, dog.breed, dog.characteristics)) # Заполняем таблицу данными + table.insert("", "end", values=( + dog.dog_id, dog.breed, dog.characteristics, dog.behavior, dog.care_info, dog.admin_comments)) + + def open_edit_dog_window(self, dog_id, breed, characteristics, behavior, care_info, admin_comments): + """Открыть окно редактирования данных о породе собак.""" + edit_dog_window = tk.Toplevel(self.root) + edit_dog_window.title("Редактировать данные породы") + edit_dog_window.geometry("500x400") + edit_dog_window.configure(bg=BACKGROUND_COLOR) + + fields = { + "Порода": (breed, tk.Entry(edit_dog_window, font=("Comic Sans MS", 12))), + "Характеристики": (characteristics, tk.Entry(edit_dog_window, font=("Comic Sans MS", 12))), + "Поведение": (behavior, tk.Entry(edit_dog_window, font=("Comic Sans MS", 12))), + "Уход": (care_info, tk.Entry(edit_dog_window, font=("Comic Sans MS", 12))), + "Комментарии администратора": (admin_comments, tk.Entry(edit_dog_window, font=("Comic Sans MS", 12))), + } + + for idx, (label_text, (value, entry)) in enumerate(fields.items()): + tk.Label(edit_dog_window, text=label_text, bg=BACKGROUND_COLOR, fg=TEXT_COLOR, + font=("Comic Sans MS", 12)).grid(row=idx, column=0, pady=10, padx=10) + entry.insert(0, value) + entry.grid(row=idx, column=1, pady=10, padx=10) + + def save_changes(): + updated_data = {key: entry.get() for key, (_, entry) in fields.items()} + success, message = update_dog_info(dog_id, updated_data["Порода"], updated_data["Характеристики"]) + if success: + messagebox.showinfo("Успех", message) + edit_dog_window.destroy() + self.manage_dogs() # Обновление списка пород + else: + messagebox.showerror("Ошибка", message) + + tk.Button(edit_dog_window, text="Сохранить", command=save_changes, bg=BUTTON_COLOR, fg=TEXT_COLOR).grid( + row=len(fields), column=0, pady=20) + tk.Button(edit_dog_window, text="Отмена", command=edit_dog_window.destroy, bg=BUTTON_COLOR, fg=TEXT_COLOR).grid( + row=len(fields), column=1, pady=20) def view_tables(self): - """Просмотр таблиц.""" - clear_frame(self.main_frame) # Очищаем старое содержимое - self.manage_users() # Отображаем пользователей - self.manage_questions() # Отображаем вопросы - self.manage_dogs() # Отображаем собак + """Просмотр всех таблиц.""" + clear_frame(self.main_frame) + + tk.Label(self.main_frame, text="Просмотр всех таблиц", font=("Comic Sans MS", 16), bg=BACKGROUND_COLOR, + fg=TEXT_COLOR).pack() + + # Создаём вкладки для отображения таблиц + tab_control = ttk.Notebook(self.main_frame) + + # Таблица пользователей + users_frame = ttk.Frame(tab_control) + tab_control.add(users_frame, text="Пользователи") + users_data = get_all_users() + if users_data: + self.create_table_view(users_frame, users_data, ["user_id", "login", "username", "level"]) + else: + tk.Label(users_frame, text="Нет данных о пользователях.", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack() + + # Таблица собак + dogs_frame = ttk.Frame(tab_control) + tab_control.add(dogs_frame, text="Породы собак") + dogs_data = get_all_dogs() + if dogs_data: + self.create_table_view(dogs_frame, dogs_data, ["dog_id", "breed", "characteristics", "behavior"]) + else: + tk.Label(dogs_frame, text="Нет данных о породах собак.", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack() + + # Таблица вопросов + questions_frame = ttk.Frame(tab_control) + tab_control.add(questions_frame, text="Вопросы") + questions_data = get_all_questions() + if questions_data: + self.create_table_view(questions_frame, questions_data, ["question_id", "question_text", "helpful_info"]) + else: + tk.Label(questions_frame, text="Нет данных о вопросах.", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack() + + tab_control.pack(expand=True, fill="both") + + def create_table_view(self, frame, data, columns): + """Создание и отображение таблицы на основе данных и столбцов.""" + # Создаём таблицу + table = ttk.Treeview(frame, columns=columns, show="headings") + + # Заголовки таблицы + for col in columns: + table.heading(col, text=col) + table.column(col, anchor="center") # Выравнивание заголовков по центру + + # Заполнение таблицы данными + for row in data: + if isinstance(row, dict): # Если данные представлены в виде словаря + values = [row.get(col, "") for col in columns] + elif hasattr(row, "__dict__"): # Если данные — это объект SQLAlchemy + values = [getattr(row, col, "") for col in columns] + else: + values = row if isinstance(row, (list, tuple)) else [] + + table.insert("", "end", values=values) + + # Устанавливаем таблицу в интерфейс + table.pack(fill="both", expand=True, pady=10) + + def open_add_dog_window(self): + """Открыть окно для добавления новой собаки.""" + add_dog_window = tk.Toplevel(self.root) + add_dog_window.title("Добавить новую собаку") + add_dog_window.geometry("400x300") + add_dog_window.configure(bg=BACKGROUND_COLOR) + + tk.Label(add_dog_window, text="Порода", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) + breed_entry = tk.Entry(add_dog_window, font=("Comic Sans MS", 12)) + breed_entry.pack(pady=5) + + tk.Label(add_dog_window, text="Характеристики", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) + characteristics_entry = tk.Entry(add_dog_window, font=("Comic Sans MS", 12)) + characteristics_entry.pack(pady=5) + + tk.Label(add_dog_window, text="Поведение", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) + behavior_entry = tk.Entry(add_dog_window, font=("Comic Sans MS", 12)) + behavior_entry.pack(pady=5) + + tk.Label(add_dog_window, text="Уход", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) + care_info_entry = tk.Entry(add_dog_window, font=("Comic Sans MS", 12)) + care_info_entry.pack(pady=5) + + tk.Label(add_dog_window, text="Комментарии администратора", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) + admin_comments_entry = tk.Entry(add_dog_window, font=("Comic Sans MS", 12)) + admin_comments_entry.pack(pady=5) + + def save_dog(): + dog_data = { + 'breed': breed_entry.get(), + 'characteristics': characteristics_entry.get(), + 'behavior': behavior_entry.get(), + 'care_info': care_info_entry.get(), + 'admin_comments': admin_comments_entry.get() + } + add_dog_to_db(dog_data) + add_dog_window.destroy() + + def cancel_add(): + add_dog_window.destroy() + + save_button = tk.Button(add_dog_window, text="Сохранить", command=save_dog, bg=BUTTON_COLOR, fg=TEXT_COLOR) + save_button.pack(pady=20) + + cancel_button = tk.Button(add_dog_window, text="Отменить", command=cancel_add, bg=BUTTON_COLOR, fg=TEXT_COLOR) + cancel_button.pack(pady=10) -def open_add_user_window(self): - """Открыть окно для добавления нового пользователя.""" - add_user_window = tk.Toplevel(self.root) - add_user_window.title("Добавить нового пользователя") - add_user_window.geometry("400x300") - add_user_window.configure(bg=BACKGROUND_COLOR) + def open_add_user_window(self): + """Открыть окно для добавления нового пользователя.""" + add_user_window = tk.Toplevel(self.root) + add_user_window.title("Добавить нового пользователя") + add_user_window.geometry("400x300") + add_user_window.configure(bg=BACKGROUND_COLOR) - tk.Label(add_user_window, text="Логин", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) - login_entry = tk.Entry(add_user_window, font=("Comic Sans MS", 12)) - login_entry.pack(pady=5) + tk.Label(add_user_window, text="Логин", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) + login_entry = tk.Entry(add_user_window, font=("Comic Sans MS", 12)) + login_entry.pack(pady=5) - tk.Label(add_user_window, text="Пароль", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) - password_entry = tk.Entry(add_user_window, font=("Comic Sans MS", 12), show="*") - password_entry.pack(pady=5) + tk.Label(add_user_window, text="Пароль", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) + password_entry = tk.Entry(add_user_window, font=("Comic Sans MS", 12), show="*") + password_entry.pack(pady=5) - tk.Label(add_user_window, text="Имя пользователя", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) - username_entry = tk.Entry(add_user_window, font=("Comic Sans MS", 12)) - username_entry.pack(pady=5) + tk.Label(add_user_window, text="Имя пользователя", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) + username_entry = tk.Entry(add_user_window, font=("Comic Sans MS", 12)) + username_entry.pack(pady=5) - def save_user(): - user_data = { - 'login': login_entry.get(), - 'password': password_entry.get(), - 'username': username_entry.get() - } - add_user_to_db(user_data) - add_user_window.destroy() + def save_user(): + user_data = { + 'login': login_entry.get(), + 'password': password_entry.get(), + 'username': username_entry.get(), + } + try: + add_user_to_db(user_data) + messagebox.showinfo("Успех", "Пользователь успешно добавлен.") + add_user_window.destroy() + self.manage_users() # Обновить список пользователей + except Exception as e: + messagebox.showerror("Ошибка", f"Не удалось добавить пользователя: {e}") - def cancel_add(): - add_user_window.destroy() + def cancel_add(): + add_user_window.destroy() - save_button = tk.Button(add_user_window, text="Сохранить", command=save_user, bg=BUTTON_COLOR, fg=TEXT_COLOR) - save_button.pack(pady=20) + save_button = tk.Button(add_user_window, text="Сохранить", command=save_user, bg=BUTTON_COLOR, fg=TEXT_COLOR) + save_button.pack(pady=20) - cancel_button = tk.Button(add_user_window, text="Отменить", command=cancel_add, bg=BUTTON_COLOR, fg=TEXT_COLOR) - cancel_button.pack(pady=10) + cancel_button = tk.Button(add_user_window, text="Отменить", command=cancel_add, bg=BUTTON_COLOR, fg=TEXT_COLOR) + cancel_button.pack(pady=10) -def open_add_question_window(self): - """Открыть окно для добавления нового вопроса.""" - add_question_window = tk.Toplevel(self.root) - add_question_window.title("Добавить новый вопрос") - add_question_window.geometry("400x300") - add_question_window.configure(bg=BACKGROUND_COLOR) + def open_add_question_window(self): + """Открыть окно для добавления нового вопроса.""" + add_question_window = tk.Toplevel(self.root) + add_question_window.title("Добавить новый вопрос") + add_question_window.geometry("400x300") + add_question_window.configure(bg=BACKGROUND_COLOR) - tk.Label(add_question_window, text="ID собаки", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) - dog_id_entry = tk.Entry(add_question_window, font=("Comic Sans MS", 12)) - dog_id_entry.pack(pady=5) + tk.Label(add_question_window, text="ID собаки", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) + dog_id_entry = tk.Entry(add_question_window, font=("Comic Sans MS", 12)) + dog_id_entry.pack(pady=5) - tk.Label(add_question_window, text="Вопрос", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) - question_text_entry = tk.Entry(add_question_window, font=("Comic Sans MS", 12)) - question_text_entry.pack(pady=5) + tk.Label(add_question_window, text="Вопрос", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) + question_text_entry = tk.Entry(add_question_window, font=("Comic Sans MS", 12)) + question_text_entry.pack(pady=5) - tk.Label(add_question_window, text="Изображение URL", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) - image_url_entry = tk.Entry(add_question_window, font=("Comic Sans MS", 12)) - image_url_entry.pack(pady=5) + tk.Label(add_question_window, text="Изображение URL", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) + image_url_entry = tk.Entry(add_question_window, font=("Comic Sans MS", 12)) + image_url_entry.pack(pady=5) - tk.Label(add_question_window, text="Полезная информация", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) - helpful_info_entry = tk.Entry(add_question_window, font=("Comic Sans MS", 12)) - helpful_info_entry.pack(pady=5) + tk.Label(add_question_window, text="Полезная информация", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) + helpful_info_entry = tk.Entry(add_question_window, font=("Comic Sans MS", 12)) + helpful_info_entry.pack(pady=5) - def save_question(): - question_data = { - 'dog_id': int(dog_id_entry.get()), - 'question_text': question_text_entry.get(), - 'image_url': image_url_entry.get(), - 'helpful_info': helpful_info_entry.get() - } - add_question_to_db(question_data) - add_question_window.destroy() + def save_question(): + question_data = { + 'dog_id': int(dog_id_entry.get()), + 'question_text': question_text_entry.get(), + 'image_url': image_url_entry.get(), + 'helpful_info': helpful_info_entry.get() + } + add_question_to_db(question_data) + add_question_window.destroy() - def cancel_add(): - add_question_window.destroy() + def cancel_add(): + add_question_window.destroy() - save_button = tk.Button(add_question_window, text="Сохранить", command=save_question, bg=BUTTON_COLOR, fg=TEXT_COLOR) - save_button.pack(pady=20) + save_button = tk.Button(add_question_window, text="Сохранить", command=save_question, bg=BUTTON_COLOR, fg=TEXT_COLOR) + save_button.pack(pady=20) - cancel_button = tk.Button(add_question_window, text="Отменить", command=cancel_add, bg=BUTTON_COLOR, fg=TEXT_COLOR) - cancel_button.pack(pady=10) + cancel_button = tk.Button(add_question_window, text="Отменить", command=cancel_add, bg=BUTTON_COLOR, fg=TEXT_COLOR) + cancel_button.pack(pady=10) -def open_add_dog_window(self): - """Открыть окно для добавления новой собаки.""" - add_dog_window = tk.Toplevel(self.root) - add_dog_window.title("Добавить новую собаку") - add_dog_window.geometry("400x300") - add_dog_window.configure(bg=BACKGROUND_COLOR) - - tk.Label(add_dog_window, text="Порода", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) - breed_entry = tk.Entry(add_dog_window, font=("Comic Sans MS", 12)) - breed_entry.pack(pady=5) - - tk.Label(add_dog_window, text="Характеристики", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) - characteristics_entry = tk.Entry(add_dog_window, font=("Comic Sans MS", 12)) - characteristics_entry.pack(pady=5) - - tk.Label(add_dog_window, text="Поведение", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) - behavior_entry = tk.Entry(add_dog_window, font=("Comic Sans MS", 12)) - behavior_entry.pack(pady=5) - - tk.Label(add_dog_window, text="Уход", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) - care_info_entry = tk.Entry(add_dog_window, font=("Comic Sans MS", 12)) - care_info_entry.pack(pady=5) - - tk.Label(add_dog_window, text="Комментарии администратора", bg=BACKGROUND_COLOR, fg=TEXT_COLOR).pack(pady=10) - admin_comments_entry = tk.Entry(add_dog_window, font=("Comic Sans MS", 12)) - admin_comments_entry.pack(pady=5) - - def save_dog(): - dog_data = { - 'breed': breed_entry.get(), - 'characteristics': characteristics_entry.get(), - 'behavior': behavior_entry.get(), - 'care_info': care_info_entry.get(), - 'admin_comments': admin_comments_entry.get() - } - add_dog_to_db(dog_data) - add_dog_window.destroy() - - def cancel_add(): - add_dog_window.destroy() - - save_button = tk.Button(add_dog_window, text="Сохранить", command=save_dog, bg=BUTTON_COLOR, fg=TEXT_COLOR) - save_button.pack(pady=20) - - cancel_button = tk.Button(add_dog_window, text="Отменить", command=cancel_add, bg=BUTTON_COLOR, fg=TEXT_COLOR) - cancel_button.pack(pady=10) - -def add_user_to_db(user_data): - session = get_session() - try: - new_user = Users(**user_data) - session.add(new_user) - session.commit() - print(f"Пользователь {user_data['username']} успешно добавлен.") - except SQLAlchemyError as e: - print(f"Ошибка при добавлении пользователя: {e}") - session.rollback() - finally: - session.close() - -def add_question_to_db(question_data): - session = get_session() - try: - new_question = Questions(**question_data) - session.add(new_question) - session.commit() - print(f"Вопрос успешно добавлен: {question_data['question_text']}") - except SQLAlchemyError as e: - print(f"Ошибка при добавлении вопроса: {e}") - session.rollback() - finally: - session.close() - -def add_dog_to_db(dog_data): - session = get_session() - try: - new_dog = Dogs(**dog_data) - session.add(new_dog) - session.commit() - print(f"Собака успешно добавлена: {dog_data['breed']}") - except SQLAlchemyError as e: - print(f"Ошибка при добавлении собаки: {e}") - session.rollback() - finally: - session.close() \ No newline at end of file diff --git a/src/user_functions/game_functions.py b/src/user_functions/game_functions.py deleted file mode 100644 index ad3f4cb..0000000 --- a/src/user_functions/game_functions.py +++ /dev/null @@ -1,43 +0,0 @@ -import logging -import time -import tkinter as tk -from src.utils import clear_frame -from database.db_events import save_progress - -def handle_checkpoint(obstacle, current_score, root): - """ - Обрабатывает чек-поинт (косточку). - obstacle - данные о текущем препятствии - current_score - текущий счёт - root - корневой элемент - """ - # Пример вопроса - question = "Как ухаживать за собакой?" - correct_answer = "Кормить и гулять" - - # Окно для вопроса - question_window = tk.Toplevel(root) - question_window.title("Вопрос") - - question_label = tk.Label(question_window, text=question, font=("Comic Sans MS", 14)) - question_label.pack(pady=10) - - answer_var = tk.StringVar() - answer_entry = tk.Entry(question_window, textvariable=answer_var, font=("Comic Sans MS", 14)) - answer_entry.pack(pady=10) - - def submit_answer(): - nonlocal current_score # Используем nonlocal для изменения current_score в замыканиях - answer = answer_var.get().strip().lower() - if answer == correct_answer.lower(): - current_score += 1 # За правильный ответ добавляется 1 косточка - else: - current_score -= 1 # Штраф за неправильный ответ - - question_window.destroy() - return current_score # Возвращаем обновленный счёт - - submit_button = tk.Button(question_window, text="Ответить", command=submit_answer, font=("Comic Sans MS", 14)) - submit_button.pack(pady=10) - - return current_score diff --git a/src/user_functions/map_generator.py b/src/user_functions/map_generator.py deleted file mode 100644 index a5e657c..0000000 --- a/src/user_functions/map_generator.py +++ /dev/null @@ -1,13 +0,0 @@ -import random - -def generate_map(level): - """Генерация карты уровня.""" - num_obstacles = random.randint(3, 6) - map_data = [] - for _ in range(num_obstacles): - map_data.append({ - "type": "question", - "difficulty": level, - "position": (random.randint(0, 19), random.randint(0, 10)) # Позиция на сетке - }) - return map_data