Interface-module/frames/CTkColoredConsoleFrame.py
2025-03-18 15:23:04 +03:00

97 lines
3.1 KiB
Python

import tkinter as tk
from datetime import datetime
from enum import Enum
from customtkinter import CTkTextbox, CTk
from loguru import logger as _logger
from ..utils import fonts
logger = _logger.bind(module="ColoredConsole", prefix="misc")
class LogLevels(Enum):
DEBUG = 0
ERROR = 1
WARNING = 2
INFO = 3
SUCCESS = 4
class CTkColoredConsoleFrame(CTkTextbox):
def __init__(self, master: CTk, corner_radius=0, font=None, _callback=None, **kwargs):
if font is None:
font = fonts.log_font()
super().__init__(master, corner_radius=corner_radius, font=font, **kwargs)
self.configure(state='disabled')
self.__callback = _callback
self._create_tags()
self._create_menu()
def _copy(self, _=None):
self.clipboard_clear()
selected_text = self.get(tk.SEL_FIRST, tk.SEL_LAST).replace("\n\n", "\n")
self.clipboard_append(selected_text)
def _open_menu(self, ev):
self.menu.post(ev.x_root, ev.y_root)
def _create_menu(self):
self.menu = tk.Menu(self, tearoff=0)
self.menu.add_command(label="Copy", command=self._copy)
self.master.bind("<Control-c>", self._copy)
self.master.bind("<Button-3>", self._open_menu)
def _create_tags(self):
self.tag_config(LogLevels.DEBUG, foreground='#0000FF')
self.tag_config(LogLevels.ERROR, foreground='#FF0000')
self.tag_config(LogLevels.WARNING, foreground='#FFA500')
self.tag_config(LogLevels.INFO, foreground='white')
self.tag_config(LogLevels.SUCCESS, foreground='#008000')
def clear(self):
self.configure(state='normal')
self.delete(1.0, 'end')
self.configure(state='disabled')
def log(self, level, message, _date=None):
logger.debug(f"[{self.master}] [{level.name}] {message}")
if not _date:
_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
if self.__callback:
self.__callback(level, message, _date)
self.update_idletasks()
self.configure(state='normal')
self.insert('end', f"{_date} | {level.name} | {message}" + '\n', (level, ))
self.see('end')
self.configure(state='disabled')
self.update_idletasks()
def debug(self, message):
self.after(50, self.log, LogLevels.DEBUG, message)
def error(self, message):
self.after(50, self.log, LogLevels.ERROR, message)
def warning(self, message):
self.after(50, self.log, LogLevels.WARNING, message)
def info(self, message):
self.after(50, self.log, LogLevels.INFO, message)
def success(self, message):
self.after(50, self.log, LogLevels.SUCCESS, message)
if __name__ == '__main__':
_root = CTk()
_root.title("CTkColoredConsoleFrame")
_root.geometry("400x300")
_root.configure(bg='white')
con = CTkColoredConsoleFrame(_root)
con.pack(fill='both', expand=True)
con.debug("Debug message")
con.error("Error message")
con.warning("Warning message")
con.info("Info message")
con.success("Success message")
_root.mainloop()