Proyecto Global inicial
This commit is contained in:
commit
9f7d1e247c
|
|
@ -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.
|
|
@ -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
|
||||
|
|
@ -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()
|
||||
Loading…
Reference in New Issue