FinalProjectAndresGMoran/app/panel_izquierdo/panel_izquierdo.py

115 lines
5.0 KiB
Python

import tkinter as tk
import threading
import requests
from PIL import Image, ImageTk
from io import BytesIO
from app import scraping
class PanelIzquierdo:
def __init__(self, frame, text_widget):
# Configuración del panel
self.frame = frame
self.frame.configure(bg="lightblue", width=200)
self.frame.grid_propagate(False)
self.frame.columnconfigure(0, weight=1)
# Sección: Clima
clima_frame = tk.Frame(self.frame, bg="white", bd=2, relief="sunken")
clima_frame.grid(row=0, column=0, sticky="ew", padx=5, pady=5)
clima_title = tk.Label(clima_frame, text="Clima Actual", bg="white", font=("Helvetica", 12, "bold"), fg="navy")
clima_title.pack(pady=5)
self.weather_icon = tk.Label(clima_frame, bg="white")
self.weather_icon.pack()
self.weather_label = tk.Label(clima_frame, text="Cargando clima...", bg="white", font=("Helvetica", 10), fg="black")
self.weather_label.pack(pady=5)
#self.update_weather() Comentado para que no gaste limite de requests en la api
# Sección: Scraping
scraping_frame = tk.Frame(self.frame, bg="white", bd=2, relief="sunken")
scraping_frame.grid(row=1, column=0, sticky="ew", padx=5, pady=5)
scraping_title = tk.Label(scraping_frame, text="Scraping", bg="white", font=("Helvetica", 12, "bold"), fg="navy")
scraping_title.pack(pady=5)
self.entry_url = tk.Entry(scraping_frame, font=("Helvetica", 10), width=30)
self.entry_url.pack(pady=5)
self.entry_url.insert(0, "https://www.amazon.es/") # URL por defecto
boton_scrapping = tk.Button(
scraping_frame,
text="Iniciar Scraping",
command=lambda: threading.Thread(
target=scraping.iniciar_scraping_y_insercion,
args=(self.entry_url.get(), text_widget)
).start(),
bg="lightgreen"
)
boton_scrapping.pack(pady=5)
# Sección: Noticias
noticias_frame = tk.Frame(self.frame, bg="white", bd=2, relief="sunken")
noticias_frame.grid(row=2, column=0, sticky="nsew", padx=5, pady=5)
noticias_title = tk.Label(noticias_frame, text="Últimas Noticias", bg="white", font=("Helvetica", 12, "bold"), fg="navy")
noticias_title.pack(pady=5)
self.news_label = tk.Label(
noticias_frame, text="Cargando noticias...", bg="white", font=("Helvetica", 10), fg="black", wraplength=180, justify="left"
)
self.news_label.pack(pady=5)
#self.update_news() Comentado para que no gaste limite de requests en la api
self.frame.rowconfigure(2, weight=1)
def update_weather(self):
"""Actualiza la información del clima utilizando un hilo."""
def fetch_weather():
try:
url = f'http://api.openweathermap.org/data/2.5/weather?q=Javea&appid=2f79c6f35c48e876bceae7fa7f4f4735&units=metric&lang=es'
response = requests.get(url)
response.raise_for_status()
data = response.json()
# Información del clima
temp = data['main']['temp']
weather = data['weather'][0]['description']
icon_code = data['weather'][0]['icon']
# Actualiza el texto del clima
self.weather_label.config(
text=f"Javea:\n{temp}°C, {weather.capitalize()}"
)
# Descarga y muestra el ícono del clima
icon_url = f"http://openweathermap.org/img/wn/{icon_code}@2x.png"
icon_response = requests.get(icon_url)
icon_image = Image.open(BytesIO(icon_response.content))
icon_photo = ImageTk.PhotoImage(icon_image)
self.weather_icon.config(image=icon_photo)
self.weather_icon.image = icon_photo # Referencia para evitar que se elimine
except Exception as e:
self.weather_label.config(text="Error al obtener el clima.")
print(f"Error al obtener el clima: {e}")
threading.Thread(target=fetch_weather, daemon=True).start()
def update_news(self):
"""Consulta y actualiza las últimas noticias en tiempo real."""
def fetch_news():
while True:
try:
url = 'https://newsapi.org/v2/top-headlines?country=us&apiKey=bc352d5c21cf4ebcbbcf780f4a4b78d9'
response = requests.get(url)
response.raise_for_status()
data = response.json()
articles = data['articles'][:7] # Obtiene las 5 primeras noticias
news_text = "\n\n".join([f"- {article['title']}" for article in articles])
self.news_label.config(text=news_text)
except Exception as e:
self.news_label.config(text="Error al obtener noticias")
print(f"Error al obtener noticias: {e}")
threading.Thread(target=fetch_news, daemon=True).start()