Source code for NekUpload.frontend.components.terminal
import tkinter as tk
import ttkbootstrap as ttk
from ttkbootstrap.scrolled import ScrolledText
from ttkbootstrap.constants import *
import logging
[docs]
class TerminalHandler(logging.Handler):
"""Custom logging handler
Args:
logging (_type_): _description_
"""
def __init__(self, terminal: 'TerminalWidget'):
super().__init__()
self.terminal = terminal
[docs]
def emit(self, record):
"""Writes a log to the terminal
Args:
record (_type_): _description_
"""
msg = self.format(record)
level = record.levelname # Get the log level
tag = None # Default tag
if level == "ERROR": # Check for ERROR level
tag = "error" # Use the "error" tag
elif level == "WARNING":
tag = "warn"
self.terminal.write(msg + "\n", tag=tag) # Pass the tag to write()
self.terminal.terminal.update_idletasks()
[docs]
class TerminalWidget(ttk.Frame):
"""Terminal widget to emulate a terminal
Args:
ttk (_type_): _description_
"""
def __init__(self, parent, height=10, **kwargs):
"""Creates a widget containing a text terminal
Args:
parent (ttk.Frame): Parent frame
height (int, optional): Height of terminal. Defaults to 10.
"""
super().__init__(parent, **kwargs)
self.terminal = ScrolledText(
master=self,
wrap=tk.WORD,
state=tk.DISABLED,
height=height,
bootstyle=INFO,
autohide=True
)
self.terminal.pack(fill=tk.BOTH, expand=True)
# Configure the "error" tag for red text
self.terminal.text.tag_configure("error", foreground="red") # Set foreground to red
self.terminal.text.tag_configure("warn", foreground="blue") # Set foreground to red
[docs]
def write(self, text: str, tag=None):
"""Appends text to the terminal.
Args:
text: The text to add.
tag: An optional tag to apply to the text (for styling).
"""
self.terminal.text.config(state=tk.NORMAL)
self.terminal.text.insert(tk.END, text, tag) # Use the tag here
self.terminal.text.see(tk.END)
self.terminal.text.config(state=tk.DISABLED)
[docs]
def clear(self):
"""Clears the terminal content."""
self.terminal.text.config(state=tk.NORMAL)
self.terminal.text.delete(1.0, tk.END) # Delete from beginning to end
self.terminal.text.config(state=tk.DISABLED)
[docs]
def tag_configure(self, tag, **kwargs):
"""Configures a tag for styling text."""
self.terminal.text.tag_configure(tag, **kwargs)