MaselliSimulatorApp/utils.py

104 lines
3.6 KiB
Python

"""
Utilidades comunes para el proyecto
"""
import tkinter as tk
from datetime import datetime
import os
MAX_LOG_LINES = 100 # Número máximo de líneas en el log
class Utils:
@staticmethod
def log_message(log_widget, message):
"""Escribe un mensaje con timestamp en el widget de log especificado, limitando el número de líneas."""
if log_widget:
log_widget.configure(state=tk.NORMAL)
timestamp = datetime.now().strftime('%H:%M:%S')
log_widget.insert(tk.END, f"[{timestamp}] {message}\n")
# Limitar el número de líneas
num_lines = int(log_widget.index('end-1c').split('.')[0])
if num_lines > MAX_LOG_LINES:
lines_to_delete = num_lines - MAX_LOG_LINES
# Sumamos 1.0 porque delete va hasta el índice anterior al segundo parámetro
log_widget.delete('1.0', f"{lines_to_delete + 1}.0")
log_widget.see(tk.END)
log_widget.configure(state=tk.DISABLED)
@staticmethod
def load_icon(root):
"""Intenta cargar un icono para la ventana"""
icon_loaded = False
for icon_file in ['icon.png', 'icon.ico', 'icon.gif']:
if os.path.exists(icon_file):
try:
if icon_file.endswith('.ico'):
root.iconbitmap(icon_file)
else:
icon = tk.PhotoImage(file=icon_file)
root.iconphoto(True, icon)
icon_loaded = True
break
except Exception as e:
print(f"No se pudo cargar {icon_file}: {e}")
if not icon_loaded:
print("No se encontró ningún archivo de icono (icon.png, icon.ico, icon.gif)")
@staticmethod
def create_csv_filename(prefix="maselli"):
"""Crea un nombre de archivo CSV con timestamp"""
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
return f"{prefix}_{timestamp}.csv"
@staticmethod
def validate_number_entry(value, min_val=None, max_val=None, is_float=True):
"""Valida que una entrada sea un número válido dentro del rango especificado"""
try:
num = float(value) if is_float else int(value)
if min_val is not None and num < min_val:
return False
if max_val is not None and num > max_val:
return False
return True
except ValueError:
return False
@staticmethod
def set_widgets_state(widgets, state):
"""Establece el estado de múltiples widgets"""
for widget in widgets:
try:
widget.config(state=state)
except:
pass # Algunos widgets pueden no tener la propiedad state
@staticmethod
def format_brix_display(brix_value):
"""Formatea un valor Brix para mostrar"""
return f"{brix_value:.3f} Brix"
@staticmethod
def format_ma_display(ma_value):
"""Formatea un valor mA para mostrar"""
return f"{ma_value:.3f} mA"
@staticmethod
def clear_graph_data(*data_containers):
"""Limpia los contenedores de datos del gráfico"""
for container in data_containers:
if hasattr(container, 'clear'):
container.clear()
@staticmethod
def clear_log_widget(log_widget):
"""Limpia el contenido del widget de log especificado."""
if log_widget:
log_widget.configure(state=tk.NORMAL)
log_widget.delete('1.0', tk.END)
log_widget.configure(state=tk.DISABLED)