0.9. переделаны шаблоны, теперь есть возможность отправлять несколько медиа в команде.. надеюсь
This commit is contained in:
4
GUI/__init__.py
Normal file
4
GUI/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
# GUI/__init__.py
|
||||
# Инициализация пакета GUI, для работы с графическим интерфейсом
|
||||
|
||||
from .console import *
|
||||
167
GUI/console.py
Normal file
167
GUI/console.py
Normal file
@@ -0,0 +1,167 @@
|
||||
from tkinter import PhotoImage
|
||||
import customtkinter as ctk # модуль для создания стилизованных интерфейсов
|
||||
from PIL import Image, ImageTk
|
||||
from BotLibrary import * # импорт настроек бота (например, имени, фамилии, и имени пользователя)
|
||||
|
||||
# Создание роутера и настройка экспорта
|
||||
__all__ = ("App", )
|
||||
command_text = "GUI"
|
||||
|
||||
|
||||
# Настройка внешнего вида интерфейса
|
||||
ctk.set_appearance_mode("System") # Установка режима внешнего вида: "System", "Dark" или "Light"
|
||||
ctk.set_default_color_theme("blue") # Установка цветовой темы: "blue", "green", "dark-blue"
|
||||
|
||||
|
||||
# Класс приложения, наследующий от customtkinter.CTk
|
||||
class App(ctk.CTk):
|
||||
def __init__(self):
|
||||
super().__init__() # Инициализация базового класса
|
||||
|
||||
# Настройка главного окна
|
||||
self.title(f"{BotInfo.first_name} {BotInfo.last_name} - @{BotInfo.username}") # Заголовок окна
|
||||
self.geometry(f"{700}x{580}") # Размер окна (ширина x высота)
|
||||
|
||||
# Настройка сетки (разметка окна на ячейки)
|
||||
self.grid_columnconfigure(0, weight=1) # Установка растяжения для 1-го столбца (боковая панель)
|
||||
self.grid_columnconfigure(1, weight=9) # Установка растяжения для 2-го столбца (содержимое вкладок)
|
||||
self.grid_rowconfigure((0, 1), weight=1) # Установка растяжения для первых трех строк
|
||||
|
||||
# Создание боковой панели
|
||||
self.sidebar_frame = ctk.CTkFrame(self, width=100, corner_radius=0) # Рамка боковой панели с уменьшенной шириной
|
||||
self.sidebar_frame.grid(row=0, column=0, rowspan=4, sticky="nsew") # Расположение в сетке
|
||||
self.sidebar_frame.grid_rowconfigure(4, weight=1) # Установка растяжения для 4-й строки
|
||||
|
||||
# Логотип на боковой панели
|
||||
self.logo_label = ctk.CTkLabel(self.sidebar_frame, text=BotInfo.username,
|
||||
font=ctk.CTkFont(size=16, weight="bold")) # Метка с текстом
|
||||
self.logo_label.grid(row=0, column=0, padx=10, pady=(20, 10)) # Расположение метки в сетке
|
||||
|
||||
# Кнопки на боковой панели
|
||||
self.sidebar_button_1 = ctk.CTkButton(self.sidebar_frame, text="Консоль",
|
||||
command=self.switch_tab_console,
|
||||
font=ctk.CTkFont(size=14))
|
||||
self.sidebar_button_1.grid(row=1, column=0, padx=10, pady=10) # Первая кнопка
|
||||
self.sidebar_button_2 = ctk.CTkButton(self.sidebar_frame, text="База данных",
|
||||
command=self.switch_tab_database,
|
||||
font=ctk.CTkFont(size=14))
|
||||
self.sidebar_button_2.grid(row=2, column=0, padx=10, pady=10) # Вторая кнопка
|
||||
self.sidebar_button_3 = ctk.CTkButton(self.sidebar_frame, text="Иное",
|
||||
command=self.switch_tab_other,
|
||||
font=ctk.CTkFont(size=14))
|
||||
self.sidebar_button_3.grid(row=3, column=0, padx=10, pady=10) # Третья кнопка
|
||||
|
||||
# Новые кнопки "Запуск" и "Выключение"
|
||||
self.start_button = ctk.CTkButton(self.sidebar_frame, text="Запуск", command=self.start_button_click,
|
||||
font=ctk.CTkFont(size=14))
|
||||
self.start_button.grid(row=5, column=0, padx=10, pady=10) # Кнопка "Запуск"
|
||||
|
||||
self.stop_button = ctk.CTkButton(self.sidebar_frame, text="Выключение",
|
||||
command=self.stop_button_click,
|
||||
font=ctk.CTkFont(size=14))
|
||||
self.stop_button.grid(row=6, column=0, padx=10, pady=10) # Кнопка "Выключение"
|
||||
|
||||
# Элементы управления режимами и масштабированием интерфейса
|
||||
self.appearance_mode_label = ctk.CTkLabel(self.sidebar_frame, text="Тема UI", anchor="w",
|
||||
font=ctk.CTkFont(size=12))
|
||||
self.appearance_mode_label.grid(row=7, column=0, padx=10, pady=(10, 0)) # Метка для выбора темы
|
||||
self.appearance_mode_optionemenu = ctk.CTkOptionMenu(
|
||||
self.sidebar_frame, values=["Светлая", "Темная", "Система"], command=self.change_appearance_mode_event
|
||||
) # Меню выбора темы
|
||||
self.appearance_mode_optionemenu.grid(row=8, column=0, padx=10, pady=(10, 10)) # Расположение меню
|
||||
|
||||
self.scaling_label = ctk.CTkLabel(self.sidebar_frame, text="Масштабирование",
|
||||
anchor="w", font=ctk.CTkFont(size=12)) # Метка для масштабирования
|
||||
self.scaling_label.grid(row=9, column=0, padx=10, pady=(10, 0)) # Расположение метки
|
||||
self.scaling_optionemenu = ctk.CTkOptionMenu(
|
||||
self.sidebar_frame, values=["80%", "90%", "100%", "110%", "120%"], command=self.change_scaling_event
|
||||
) # Меню выбора масштаба
|
||||
self.scaling_optionemenu.grid(row=10, column=0, padx=10, pady=(10, 20)) # Расположение меню
|
||||
|
||||
# Создание вкладок
|
||||
self.tabview = ctk.CTkTabview(self, width=250) # Виджет вкладок
|
||||
self.tabview.grid(row=0, column=1, rowspan=3, columnspan=2, padx=(20, 0), pady=(20, 0),
|
||||
sticky="nsew") # Растягиваем на все пустое пространство
|
||||
self.tabview.add("Консоль") # Первая вкладка
|
||||
self.tabview.add("База данных") # Вторая вкладка
|
||||
self.tabview.add("Иное") # Третья вкладка
|
||||
|
||||
# Вкладка "Консоль" с текстовым полем
|
||||
self.textbox_tab_1 = ctk.CTkTextbox(self.tabview.tab("Консоль"))
|
||||
self.textbox_tab_1.grid(row=0, column=0, padx=0, pady=0, sticky="nsew")
|
||||
self.textbox_tab_1.insert("0.0", "Текст в Textbox на вкладке Консоль\n\n")
|
||||
|
||||
# Вкладка "База данных" с текстовым полем
|
||||
self.textbox_tab_2 = ctk.CTkTextbox(self.tabview.tab("База данных"))
|
||||
self.textbox_tab_2.grid(row=0, column=0, padx=0, pady=0, sticky="nsew")
|
||||
self.textbox_tab_2.insert("0.0", "Текст в Textbox на вкладке База данных\n\n")
|
||||
|
||||
# Вкладка "Иное" с текстовым полем
|
||||
self.textbox_tab_3 = ctk.CTkTextbox(self.tabview.tab("Иное"))
|
||||
self.textbox_tab_3.grid(row=0, column=0, padx=0, pady=0, sticky="nsew")
|
||||
self.textbox_tab_3.insert("0.0", "Текст в Textbox на вкладке Иное\n\n")
|
||||
|
||||
# Растягиваем строки и столбцы вкладок
|
||||
self.tabview.grid_rowconfigure(0, weight=1) # Растягиваем строку, где находится текстовое поле
|
||||
self.tabview.grid_columnconfigure(0, weight=1) # Растягиваем столбец, где находится текстовое поле
|
||||
|
||||
# Убедитесь, что в каждой из вкладок разрешено растяжение:
|
||||
self.tabview.tab("Консоль").grid_rowconfigure(0, weight=1)
|
||||
self.tabview.tab("База данных").grid_rowconfigure(0, weight=1)
|
||||
self.tabview.tab("Иное").grid_rowconfigure(0, weight=1)
|
||||
|
||||
self.tabview.tab("Консоль").grid_columnconfigure(0, weight=1)
|
||||
self.tabview.tab("База данных").grid_columnconfigure(0, weight=1)
|
||||
self.tabview.tab("Иное").grid_columnconfigure(0, weight=1)
|
||||
|
||||
# Настройка элементов
|
||||
self.appearance_mode_optionemenu.set("Темная") # Режим отображения установлен на "Dark"
|
||||
self.scaling_optionemenu.set("100%") # Масштаб интерфейса установлен на 100%
|
||||
|
||||
self.update() # Принудительное обновление окна после создания
|
||||
|
||||
def change_appearance_mode_event(self, new_appearance_mode: str):
|
||||
# Метод для изменения режима отображения интерфейса
|
||||
if new_appearance_mode == "Светлая":
|
||||
ctk.set_appearance_mode("Light")
|
||||
elif new_appearance_mode == "Темная":
|
||||
ctk.set_appearance_mode("Dark")
|
||||
elif new_appearance_mode == "Система":
|
||||
ctk.set_appearance_mode("System")
|
||||
|
||||
def change_scaling_event(self, new_scaling: str):
|
||||
# Метод для изменения масштаба интерфейса
|
||||
new_scaling_float = int(new_scaling.replace("%", "")) / 100
|
||||
# Преобразование процента масштаба в дробное число
|
||||
ctk.set_widget_scaling(new_scaling_float)
|
||||
# Применение нового масштаба ко всем виджетам
|
||||
|
||||
def switch_tab_console(self):
|
||||
# Переключение на вкладку "Консоль"
|
||||
self.tabview.grid(row=0, column=1, rowspan=3, columnspan=2, padx=(20, 0), pady=(20, 0), sticky="nsew")
|
||||
self.tabview.set("Консоль")
|
||||
|
||||
def switch_tab_database(self):
|
||||
# Переключение на вкладку "База данных"
|
||||
# Для возвращения вкладок
|
||||
self.tabview.grid(row=0, column=1, rowspan=3, columnspan=2, padx=(20, 0), pady=(20, 0), sticky="nsew")
|
||||
self.tabview.set("База данных")
|
||||
|
||||
def switch_tab_other(self):
|
||||
# Переключение на вкладку "Иное"
|
||||
self.tabview.grid(row=0, column=1, rowspan=3, columnspan=2, padx=(20, 0), pady=(20, 0), sticky="nsew")
|
||||
self.tabview.set("Иное")
|
||||
|
||||
def start_button_click(self):
|
||||
# Обработчик для кнопки "Запуск"
|
||||
print("Запуск")
|
||||
|
||||
def stop_button_click(self):
|
||||
# Обработчик для кнопки "Выключение"
|
||||
print("Выключение")
|
||||
|
||||
|
||||
# Начало кода и запуск GUI
|
||||
if __name__ == "__main__":
|
||||
app = App()
|
||||
app.mainloop()
|
||||
74
GUI/console_0.py
Normal file
74
GUI/console_0.py
Normal file
@@ -0,0 +1,74 @@
|
||||
import sys
|
||||
import customtkinter as ctk
|
||||
import asyncio
|
||||
import threading
|
||||
|
||||
# Ваши настройки и модули
|
||||
from BotLibrary import *
|
||||
from BotCode.routers import router as main_router
|
||||
from BotCode.routers import set_commands
|
||||
|
||||
|
||||
# Класс для перенаправления стандартного вывода в текстовое поле
|
||||
class Logger:
|
||||
def __init__(self, text_widget):
|
||||
self.text_widget = text_widget
|
||||
|
||||
def write(self, message):
|
||||
self.text_widget.insert("end", message)
|
||||
self.text_widget.see("end") # Прокрутка к последнему сообщению
|
||||
|
||||
def flush(self):
|
||||
pass
|
||||
|
||||
|
||||
# Основная функция для запуска бота
|
||||
async def main_bot():
|
||||
just_fix_windows_console() # Подключение ANSI в Windows CMD
|
||||
dp.include_router(main_router) # Подключение главного роутера
|
||||
|
||||
await set_all() # Установка настроек бота
|
||||
await set_commands() # Установка команд бота
|
||||
await bot_get_info() # Получение информации о боте
|
||||
|
||||
# Логирование в консоль и текстовое поле
|
||||
logger.add(sys.stderr, colorize=True, format=logs_text, level="INFO")
|
||||
logger.info(f"Начало запуска бота @{BotInfo.username}...")
|
||||
|
||||
bot_info_out() # Включение опроса бота
|
||||
await dp.start_polling(bot) # Запуск бота
|
||||
|
||||
|
||||
# Класс графического интерфейса
|
||||
class BotConsoleWindow(ctk.CTk):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
# Настройка окна
|
||||
self.title("Bot Console")
|
||||
self.geometry("800x600")
|
||||
|
||||
# Создание текстового поля для логов
|
||||
self.log_text = ctk.CTkTextbox(self, wrap="word", width=780, height=500)
|
||||
self.log_text.pack(padx=10, pady=10)
|
||||
|
||||
# Перенаправление вывода в текстовое поле
|
||||
sys.stdout = Logger(self.log_text)
|
||||
sys.stderr = Logger(self.log_text)
|
||||
|
||||
# Кнопка запуска бота
|
||||
self.start_button = ctk.CTkButton(self, text="Запустить бота", command=self.start_bot)
|
||||
self.start_button.pack(pady=10)
|
||||
|
||||
def start_bot(self):
|
||||
self.start_button.configure(state="disabled") # Отключить кнопку
|
||||
threading.Thread(target=self.run_bot, daemon=True).start()
|
||||
|
||||
def run_bot(self):
|
||||
asyncio.run(main_bot())
|
||||
self.start_button.configure(state="normal") # Включить кнопку после завершения
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = BotConsoleWindow()
|
||||
app.mainloop()
|
||||
Reference in New Issue
Block a user