Изменения: исправлена проблема с зависанием и необходимостью принудительного завершения работы программы, некоторый функционал внесён в разработку с сообщением 'функционал недоступен', исправлена ошибка бургер-меню (теперь нажатие на определённую кнопку вызывает определённую функцию), функция feature_in_development вынесена в utils.py.
This commit is contained in:
parent
e01f43dc35
commit
9b9b459d8f
26 changed files with 1054 additions and 113 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
src/admin_functions/__pycache__/notification.cpython-313.pyc
Normal file
BIN
src/admin_functions/__pycache__/notification.cpython-313.pyc
Normal file
Binary file not shown.
Binary file not shown.
|
|
@ -52,4 +52,3 @@ def export_logs():
|
|||
writer.writerow(["Время", "Действие", "Пользователь"])
|
||||
writer.writerows(data)
|
||||
print("Логи успешно экспортированы в logs.csv")
|
||||
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ def view_knowledge_base(frame):
|
|||
|
||||
|
||||
def generate_questions(frame):
|
||||
print("Я по приколу вызвался")
|
||||
"""Генерация вопросов на основе текстов."""
|
||||
clear_frame(frame)
|
||||
tk.Label(frame, text="Генерация вопросов", font=("Comic Sans MS", 16)).pack()
|
||||
|
|
|
|||
|
|
@ -1,21 +1,17 @@
|
|||
from tkinter import messagebox
|
||||
import tkinter as tk
|
||||
from datetime import datetime
|
||||
|
||||
class Notification:
|
||||
def __init__(self, root):
|
||||
self.root = root
|
||||
def __init__(self, parent, message, timestamp):
|
||||
self.frame = tk.Frame(parent, bg="#2f2b38", pady=5)
|
||||
self.frame.pack(fill="x", pady=5)
|
||||
|
||||
def show_info(self, title, message):
|
||||
"""Отображение информационного уведомления"""
|
||||
messagebox.showinfo(title, message)
|
||||
self.message_label = tk.Label(self.frame, text=message, bg="#2f2b38", fg="#b2acc0", font=("Comic Sans MS", 12))
|
||||
self.message_label.pack(side="left", padx=10)
|
||||
|
||||
def show_warning(self, title, message):
|
||||
"""Отображение предупреждения"""
|
||||
messagebox.showwarning(title, message)
|
||||
self.timestamp_label = tk.Label(self.frame, text=self.format_timestamp(timestamp), bg="#2f2b38", fg="#b2acc0", font=("Comic Sans MS", 10))
|
||||
self.timestamp_label.pack(side="right", padx=10)
|
||||
|
||||
def show_error(self, title, message):
|
||||
"""Отображение ошибки"""
|
||||
messagebox.showerror(title, message)
|
||||
|
||||
def show_notification(self, title, message):
|
||||
"""Отображение общего уведомления"""
|
||||
self.show_info(title, message)
|
||||
def format_timestamp(self, timestamp):
|
||||
"""Форматирование метки времени."""
|
||||
return datetime.strptime(str(timestamp), "%Y-%m-%d %H:%M:%S").strftime("%d-%m-%Y %H:%M:%S")
|
||||
|
|
|
|||
22
src/main.py
22
src/main.py
|
|
@ -1,24 +1,26 @@
|
|||
from tkinter import Tk
|
||||
from tkinter import messagebox
|
||||
from src.ui.auth_ui import DogAcademyApp # Изменил на правильный путь
|
||||
from database.db_session import init_db
|
||||
from tkinter import Tk, messagebox
|
||||
from src.ui.auth_ui import DogAcademyApp # Путь к приложению
|
||||
from database.db_session import init_db, close_sessions # Функция для закрытия сессий
|
||||
|
||||
def on_close():
|
||||
"""Обработчик закрытия окна."""
|
||||
if messagebox.askokcancel("Выход", "Вы действительно хотите выйти?"):
|
||||
root.destroy()
|
||||
print("Закрытие игры...")
|
||||
close_sessions() # Закрытие всех сессий перед выходом
|
||||
root.quit() # Завершаем главный цикл приложения
|
||||
root.destroy() # Закрытие окна
|
||||
|
||||
def main():
|
||||
"""Основной запуск приложения."""
|
||||
global root
|
||||
# Инициализируем базу данных
|
||||
# Инициализация базы данных
|
||||
init_db()
|
||||
|
||||
# Запускаем графический интерфейс
|
||||
root = Tk()
|
||||
root.protocol("WM_DELETE_WINDOW", on_close)
|
||||
# Создаем экземпляр приложения
|
||||
app = DogAcademyApp(root)
|
||||
root.mainloop()
|
||||
root.protocol("WM_DELETE_WINDOW", on_close) # Перехват события закрытия окна
|
||||
root.mainloop() # Запуск основного цикла обработки событий
|
||||
|
||||
if __name__ == "__main__":
|
||||
root = Tk() # Создание корневого окна
|
||||
main()
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
|
|
@ -1,11 +1,8 @@
|
|||
import tkinter as tk
|
||||
from PIL import Image, ImageTk
|
||||
from config import SETTINGS_IMG
|
||||
from src.admin_functions import db_management, admin_logging, statistics, content, knowledge_base
|
||||
from src.utils import clear_frame # Импортируем общую функцию для очистки фрейма
|
||||
from database.db_session import get_session
|
||||
from database.models import Notifications
|
||||
from src.admin_functions.notification import Notification
|
||||
from src.admin_functions import admin_logging, statistics
|
||||
from src.utils import clear_frame, feature_in_development # Импортируем общую функцию для очистки фрейма
|
||||
|
||||
|
||||
# Конфигурация цветов из config.py
|
||||
|
|
@ -17,26 +14,12 @@ MENU_COLOR = "#2f2b38"
|
|||
MENU_OPACITY = 0.9 # Прозрачность меню
|
||||
|
||||
class AdminApp:
|
||||
def __init__(self, root, master):
|
||||
def __init__(self, root):
|
||||
self.root = root
|
||||
self.master = master
|
||||
self.root.title("Админ-Панель")
|
||||
self.root.geometry("1920x1080")
|
||||
self.root.config(bg=BACKGROUND_COLOR)
|
||||
|
||||
self.notification = Notification(self.master)
|
||||
|
||||
def edit_database(self):
|
||||
# Логика редактирования базы данных
|
||||
# Например, успешное редактирование
|
||||
self.notification.show_info("Успех", "База данных успешно обновлена!")
|
||||
|
||||
def show_error(self, message):
|
||||
self.notification.show_error("Ошибка", message)
|
||||
|
||||
def show_warning(self, message):
|
||||
self.notification.show_warning("Предупреждение", message)
|
||||
|
||||
# Верхняя панель
|
||||
self.top_bar = tk.Frame(self.root, bg=TOP_BAR_COLOR, height=60)
|
||||
self.top_bar.pack(side="top", fill="x")
|
||||
|
|
@ -72,7 +55,7 @@ class AdminApp:
|
|||
activebackground=BUTTON_COLOR,
|
||||
activeforeground=TEXT_COLOR,
|
||||
bd=0,
|
||||
command=self.toggle_menu # Проверьте, что эта команда правильно привязана
|
||||
command=self.toggle_menu
|
||||
)
|
||||
self.menu_button.pack(side="right", padx=10, pady=10)
|
||||
|
||||
|
|
@ -82,9 +65,9 @@ class AdminApp:
|
|||
|
||||
# Бургер-меню (скрытое по умолчанию)
|
||||
self.menu_frame = tk.Frame(self.root, bg=MENU_COLOR, width=300)
|
||||
self.menu_frame.place(x=1620, y=60, width=300, height=1020) # Явно задаём ширину и высоту
|
||||
self.menu_frame.lower() # Прячем меню
|
||||
self.menu_visible = False # Добавлен флаг для отслеживания состояния меню
|
||||
self.menu_frame.place(x=1620, y=60, width=300, height=1020)
|
||||
self.menu_frame.lower()
|
||||
self.menu_visible = False
|
||||
|
||||
def toggle_menu(self):
|
||||
"""Показ или скрытие меню."""
|
||||
|
|
@ -104,23 +87,23 @@ class AdminApp:
|
|||
# Список разделов и их элементов
|
||||
menu_sections = [
|
||||
("Работа с базой данных", [
|
||||
("Редактирование пользователей", db_management.edit_users),
|
||||
("Управление вопросами", db_management.manage_questions),
|
||||
("Просмотр таблиц", db_management.view_tables),
|
||||
("Редактирование пользователей", feature_in_development),
|
||||
("Управление вопросами", feature_in_development),
|
||||
("Просмотр таблиц", feature_in_development),
|
||||
]),
|
||||
("Управление игровым контентом", [
|
||||
("Создание и настройка уровней", content.manage_levels),
|
||||
("Настройка параметров собаки", content.manage_dog_params),
|
||||
("Создание и настройка уровней", feature_in_development),
|
||||
("Настройка параметров собаки", feature_in_development),
|
||||
]),
|
||||
("Управление интерфейсом пользователя", [
|
||||
("Добавление подсказок в интерфейс", self.manage_ui_tips),
|
||||
("Добавление подсказок в интерфейс", feature_in_development),
|
||||
]),
|
||||
("Работа с базой знаний", [
|
||||
("Добавление информации", knowledge_base.add_info),
|
||||
("Редактирование записей", knowledge_base.edit_records),
|
||||
("Удаление записей", knowledge_base.delete_records),
|
||||
("Просмотр базы знаний", knowledge_base.view_knowledge_base),
|
||||
("Генерация вопросов", knowledge_base.generate_questions),
|
||||
("Добавление информации", feature_in_development),
|
||||
("Редактирование записей", feature_in_development),
|
||||
("Удаление записей", feature_in_development),
|
||||
("Просмотр базы знаний", feature_in_development),
|
||||
("Генерация вопросов", feature_in_development),
|
||||
]),
|
||||
]
|
||||
|
||||
|
|
@ -143,19 +126,15 @@ class AdminApp:
|
|||
total_height = 0
|
||||
|
||||
for title, items in menu_sections:
|
||||
# Заголовок раздела
|
||||
section_label = tk.Label(
|
||||
self.menu_frame,
|
||||
text=title,
|
||||
bg=MENU_COLOR,
|
||||
fg=TEXT_COLOR,
|
||||
font=("Comic Sans MS", 14, "bold"),
|
||||
anchor="center" # Выравнивание по центру
|
||||
)
|
||||
section_label.pack(fill="x", padx=10, pady=5)
|
||||
total_height += button_height + section_spacing
|
||||
|
||||
# Кнопки раздела
|
||||
for text, command in items:
|
||||
item_button = tk.Button(
|
||||
self.menu_frame,
|
||||
|
|
@ -163,19 +142,12 @@ class AdminApp:
|
|||
bg=BUTTON_COLOR,
|
||||
fg=TEXT_COLOR,
|
||||
font=("Comic Sans MS", 12),
|
||||
width=int(menu_width / 10) - 3, # Ширина кнопок зависит от ширины меню
|
||||
height=1,
|
||||
activebackground=BUTTON_COLOR,
|
||||
activeforeground=TEXT_COLOR,
|
||||
bd=0,
|
||||
anchor="w", # Выравнивание текста по левому краю
|
||||
command=lambda: command(self.main_frame) # Вызываем функцию и передаём фрейм
|
||||
command=lambda cmd=command: cmd(self.main_frame) # Передаём фрейм
|
||||
)
|
||||
item_button.pack(fill="x", padx=20, pady=5)
|
||||
total_height += button_height + button_spacing
|
||||
|
||||
# Подстройка высоты меню
|
||||
self.menu_frame.config(height=total_height)
|
||||
|
||||
def create_menu_section(self, title, items):
|
||||
section_label = tk.Label(self.menu_frame, text=title, bg=MENU_COLOR, fg=TEXT_COLOR, font=("Comic Sans MS", 14, "bold"))
|
||||
|
|
@ -218,18 +190,26 @@ class AdminApp:
|
|||
tk.Label(frame, text="Здесь будут подсказки для интерфейса", bg=BACKGROUND_COLOR, fg=TEXT_COLOR, font=("Comic Sans MS", 16)).pack()
|
||||
|
||||
def show_notifications(self, frame):
|
||||
"""Отображение экрана уведомлений"""
|
||||
clear_frame(frame) # Очищаем текущий экран
|
||||
session = get_session()
|
||||
notifications = session.query(Notifications).filter_by(
|
||||
is_read=0).all() # Получаем все непрочитанные уведомления
|
||||
for notification in notifications:
|
||||
tk.Label(frame, text=notification.message, bg=BACKGROUND_COLOR, fg=TEXT_COLOR,
|
||||
font=("Comic Sans MS", 16)).pack()
|
||||
session.close()
|
||||
tk.Label(
|
||||
frame,
|
||||
text="Модуль <Уведомления> в разработке.\nВ планах реализовать: создание оповещений для пользователей (обновления, новости), сообщения от БД (корректность работы)",
|
||||
bg=BACKGROUND_COLOR,
|
||||
fg=TEXT_COLOR,
|
||||
font=("Comic Sans MS", 16)
|
||||
).pack(expand=True)
|
||||
|
||||
def show_security(self, frame):
|
||||
clear_frame(frame)
|
||||
tk.Label(frame, text="Раздел Безопасность", bg=BACKGROUND_COLOR, fg=TEXT_COLOR, font=("Comic Sans MS", 16)).pack()
|
||||
"""Отображение экрана безопасности"""
|
||||
clear_frame(frame) # Очищаем текущий экран
|
||||
tk.Label(
|
||||
frame,
|
||||
text="Модуль <Безопасность> в разработке.\nВ планах реализовать: управление доступом (создание других админов, смена пароля администратора).",
|
||||
bg=BACKGROUND_COLOR,
|
||||
fg=TEXT_COLOR,
|
||||
font=("Comic Sans MS", 16)
|
||||
).pack(expand=True)
|
||||
|
||||
def change_ui_settings(self, frame):
|
||||
clear_frame(frame)
|
||||
|
|
|
|||
|
|
@ -219,4 +219,3 @@ class DogAcademyApp:
|
|||
def show_user_dashboard(self):
|
||||
"""Перейти к главному меню пользователя после авторизации."""
|
||||
UserApp(self.root, self)
|
||||
|
||||
|
|
|
|||
28
src/utils.py
28
src/utils.py
|
|
@ -1,4 +1,32 @@
|
|||
import tkinter as tk
|
||||
|
||||
def clear_frame(frame):
|
||||
"""Удаление всех виджетов из фрейма."""
|
||||
for widget in frame.winfo_children():
|
||||
widget.destroy()
|
||||
|
||||
def feature_in_development(frame):
|
||||
"""Сообщение о том, что функционал недоступен."""
|
||||
clear_frame(frame) # Очистка фрейма перед выводом сообщения
|
||||
tk.Label(
|
||||
frame,
|
||||
text="Этот функционал пока что недоступен, в разработке.",
|
||||
bg="#403d49", # Фон сообщения
|
||||
fg="#b2acc0", # Цвет текста
|
||||
font=("Comic Sans MS", 16)
|
||||
).pack(expand=True)
|
||||
|
||||
|
||||
def create_tooltip(widget, text):
|
||||
"""Создание подсказки для виджета."""
|
||||
tooltip = tk.Toplevel()
|
||||
tooltip.wm_overrideredirect(True) # Отключаем рамки окна
|
||||
tooltip.wm_geometry(f"+{widget.winfo_rootx() + 20}+{widget.winfo_rooty() + 20}")
|
||||
label = tk.Label(tooltip, text=text, bg="#333", fg="#fff", font=("Comic Sans MS", 10), padx=5, pady=5)
|
||||
label.pack()
|
||||
|
||||
def hide_tooltip(event):
|
||||
tooltip.destroy()
|
||||
|
||||
widget.bind("<Enter>", lambda event: tooltip.deiconify())
|
||||
widget.bind("<Leave>", hide_tooltip)
|
||||
Loading…
Add table
Add a link
Reference in a new issue