import tkinter as tk from tkinter import ttk, scrolledtext class LogFrame(ttk.Frame): """Frame for displaying log messages.""" def __init__(self, parent, **kwargs): """ Initialize the Log Frame. Args: parent: The parent widget. **kwargs: Additional arguments for ttk.Frame. """ super().__init__(parent, **kwargs) self._create_widgets() def _create_widgets(self): """Create the widgets for the log frame.""" # Create scrolled text widget self.log_text = scrolledtext.ScrolledText( self, wrap=tk.WORD, width=80, height=20, font=('Consolas', 10) ) self.log_text.pack(fill=tk.BOTH, expand=True, padx=5, pady=5) self.log_text.configure(state='disabled') # Create button frame button_frame = ttk.Frame(self) button_frame.pack(fill=tk.X, padx=5, pady=(0, 5)) # Create buttons ttk.Button( button_frame, text="Clear", command=self.clear ).pack(side=tk.LEFT, padx=5) ttk.Button( button_frame, text="Copy to Clipboard", command=self.copy_to_clipboard ).pack(side=tk.LEFT, padx=5) ttk.Button( button_frame, text="Save to File", command=self.save_to_file ).pack(side=tk.LEFT, padx=5) def append(self, text): """Append text to the log. Args: text (str): The text to append. """ self.log_text.configure(state='normal') self.log_text.insert('end', text) self.log_text.see('end') self.log_text.configure(state='disabled') def clear(self): """Clear the log.""" self.log_text.configure(state='normal') self.log_text.delete(1.0, tk.END) self.log_text.configure(state='disabled') def copy_to_clipboard(self): """Copy log contents to clipboard.""" self.log_text.configure(state='normal') text = self.log_text.get(1.0, tk.END) self.log_text.configure(state='disabled') if text.strip(): self.clipboard_clear() self.clipboard_append(text) self.append("\nCopied to clipboard.\n") def save_to_file(self): """Save log contents to a file.""" self.log_text.configure(state='normal') text = self.log_text.get(1.0, tk.END) self.log_text.configure(state='disabled') if text.strip(): from tkinter import filedialog file_path = filedialog.asksaveasfilename( defaultextension=".txt", filetypes=[("Text files", "*.txt"), ("All files", "*.*")] ) if file_path: try: with open(file_path, 'w') as f: f.write(text) self.append(f"\nLog saved to {file_path}\n") except Exception as e: self.append(f"\nError saving log: {str(e)}\n") # Example usage (for testing) if __name__ == '__main__': root = tk.Tk() root.title("Log Frame Test") root.geometry("600x400") # Style for testing style = ttk.Style() style.theme_use('clam') style.configure('TFrame', background='#f0f0f0') style.configure('TLabel', background='#f0f0f0') # Create and pack the log frame log_frame = LogFrame(root) log_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) # Test buttons def add_log(): log_frame.append("Test log message\n") ttk.Button(root, text="Add Log", command=add_log).pack(pady=5) root.mainloop()