Proyecto Global inicial

This commit is contained in:
marcos 2025-12-05 18:50:57 +01:00
commit 9f7d1e247c
6 changed files with 2386 additions and 0 deletions

67
README.md Normal file
View File

@ -0,0 +1,67 @@
# Proyecto Global Dashboard
Panel de control escrito en Python 3.14 + Tkinter que reúne las prácticas solicitadas (scraping, monitorización, alarmas, notas, música y más) con una estética cuidada y paneles diferenciados.
## 🚀 Características principales
- **Dashboard modular**: panel izquierdo con accesos rápidos (scraping, clima de Jávea, Camellos, copias de seguridad, etc.), cuaderno central por pestañas y panel derecho con chat y listado de alumnos.
- **Scraping integrado**: workflows para Wallapop y scraping genérico con popups dedicados y avisos de estado.
- **Monitor de sistema**: gráficas PSUtil actualizadas mediante `after` de Tk, evitando bloqueos y mostrando CPU/RAM/Net de forma fluida.
- **Bloc de notas y backups reales**: edición rápida de texto con copias automáticas a una carpeta de respaldo mostrando progreso.
- **Widgets temáticos**: reproductor musical con tarjetas, gestor de alarmas rediseñado y popup meteorológico (OpenWeather, coordenadas de Jávea) cacheado para reducir llamadas.
- **Servidor de mensajería**: `servidor.py` permite broadcast TCP para pruebas de chat local.
## ⚙️ Requisitos
- Python 3.8 o superior (desarrollado con 3.14)
- Dependencias listadas en `requirements.txt`
```sh
pip install -r requirements.txt
```
## ▶️ Puesta en marcha rápida
1. (Opcional) Arranca el servidor de mensajería:
```sh
python3 servidor.py
```
Verás `Servidor escuchando en 0.0.0.0:3333` en consola.
2. Lanza la interfaz gráfica:
```sh
python3 app.py
```
3. Desde el panel derecho ajusta host/puerto y pulsa `Conectar` para chatear. Explora el resto de pestañas (scraping, notas, alarmas, música, clima) desde los botones laterales.
## 🧱 Arquitectura de carpetas
```
app.py # GUI principal y lógica de scraping, clima, monitorización, alarmas...
servidor.py # Servidor TCP broadcast para el chat de pruebas
requirements.txt # Dependencias del proyecto
README.md # Este archivo
```
## 🛠️ Funcionalidades destacadas
- **Scraping Wallapop y genérico**: ventanas emergentes, peticiones HTTP con Requests + BeautifulSoup, mensajes de éxito/error.
- **Weather popup “API Tiempo”**: botón dedicado que consulta OpenWeather (con clave fallback), muestra iconos, temperaturas y caché temporal.
- **Copias de seguridad guiadas**: barra de progreso y notificaciones durante la duplicación de directorios.
- **Editor y bloc de notas**: pestañas separadas para notas rápidas y bloc organizado.
- **Gestor de alarmas**: UI modernizada con tarjetas, botones primarios y feedback visual.
- **Música y utilidades**: reproductor basado en pygame y accesos a herramientas externas (“Camellos”, lanzadores, etc.).
## 🌤️ Servicios externos
- **OpenWeatherMap**: usado para el popup del clima (coordenadas de Jávea). Define `OPENWEATHER_API_KEY` en el entorno para usar tu propia clave.
- **Wallapop / sitios objetivo**: las rutinas de scraping respetan temporizadores y headers básicos; ajusta las URLs o parámetros dentro de `app.py` para nuevos escenarios.
## 📌 Próximos pasos sugeridos
1. Añadir pruebas unitarias para la lógica no gráfica (scraping, backups, parsers).
2. Persistir chats y notas en SQLite para mantener el historial.
3. Integrar reproductor completo dentro de la app (playlist, carátulas).
---
¿Necesitas extender alguna funcionalidad? Abre un issue o comenta qué módulo quieres potenciar (más scraping, dashboards adicionales, automatización de backups, etc.).

Binary file not shown.

Binary file not shown.

2228
app.py Normal file

File diff suppressed because it is too large Load Diff

7
requirements.txt Normal file
View File

@ -0,0 +1,7 @@
psutil>=5.9.0
matplotlib>=3.5.0
pillow>=9.0.0
# pygame optional for direct mp3 playback; we use system player as fallback
pygame>=2.1.0
requests>=2.32.0
beautifulsoup4>=4.12.0

84
servidor.py Normal file
View File

@ -0,0 +1,84 @@
#!/usr/bin/env python3
"""
Servidor de mensajería simple (broadcast) - puerto 3333
Ejecutar en un terminal separado:
python3 servidor.py
"""
import socket
import threading
HOST = '0.0.0.0'
PORT = 3333
clients = []
clients_lock = threading.Lock()
def broadcast(message: bytes, sender: socket.socket):
with clients_lock:
for client in list(clients):
if client is sender:
continue
try:
client.sendall(message)
except Exception:
try:
client.close()
except Exception:
pass
clients.remove(client)
def handle_client(client_socket: socket.socket, client_address):
print(f"[NUEVO CLIENTE] {client_address} conectado.")
try:
while True:
data = client_socket.recv(4096)
if not data:
break
text = data.decode('utf-8', errors='replace')
print(f"[{client_address}] {text}")
# Re-enviar a los demás
broadcast(data, client_socket)
except Exception as e:
print(f"[ERROR] {client_address}:", e)
finally:
with clients_lock:
if client_socket in clients:
clients.remove(client_socket)
try:
client_socket.close()
except Exception:
pass
print(f"[DESCONECTADO] {client_address} cerrado.")
def start_server():
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind((HOST, PORT))
server.listen(10)
print(f"[INICIO] Servidor escuchando en {HOST}:{PORT}")
try:
while True:
client_socket, client_address = server.accept()
with clients_lock:
clients.append(client_socket)
t = threading.Thread(target=handle_client, args=(client_socket, client_address), daemon=True)
t.start()
except KeyboardInterrupt:
print('\n[APAGANDO] Servidor detenido por el usuario')
finally:
with clients_lock:
for c in clients:
try:
c.close()
except Exception:
pass
try:
server.close()
except Exception:
pass
if __name__ == '__main__':
start_server()