Files
feelGrib/iface.py

133 lines
5.0 KiB
Python

import tkinter as tk
from tkinter import ttk
from tkinter import filedialog
from PIL import Image, ImageTk
import threading
from downloader import CopernicusDownloader
class MapSelector:
def __init__(self, root):
self.root = root
self.root.title("Copernicus Downloader")
# Image
self.canvas = tk.Canvas(self.root, cursor="cross")
self.canvas.pack(fill=tk.BOTH, expand=True)
self.original_img = Image.open("map.png")
self.tk_img = ImageTk.PhotoImage(self.original_img)
self.img_id = self.canvas.create_image(0, 0, anchor="nw", image=self.tk_img)
self.canvas.bind("<Configure>", self.resize_image)
self.canvas.bind("<Button-1>", self.on_click)
self.canvas.bind("<B1-Motion>", self.on_drag)
self.canvas.bind("<ButtonRelease-1>", self.on_release)
self.start_x = self.start_y = None
self.rect = None
# Coordonnées
coord_frame = tk.Frame(self.root)
coord_frame.pack(pady=5)
self.lat1_var = tk.StringVar()
self.lon1_var = tk.StringVar()
self.lat2_var = tk.StringVar()
self.lon2_var = tk.StringVar()
for i, (label, var) in enumerate([
("Lat Min", self.lat1_var), ("Lon Min", self.lon1_var),
("Lat Max", self.lat2_var), ("Lon Max", self.lon2_var)
]):
tk.Label(coord_frame, text=label).grid(row=i//2, column=(i % 2) * 2)
tk.Entry(coord_frame, textvariable=var).grid(row=i//2, column=(i % 2) * 2 + 1)
# Authentification
auth_frame = tk.Frame(self.root)
auth_frame.pack(pady=5)
self.user_var = tk.StringVar()
self.pwd_var = tk.StringVar()
tk.Label(auth_frame, text="Utilisateur:").grid(row=0, column=0)
tk.Entry(auth_frame, textvariable=self.user_var).grid(row=0, column=1)
tk.Label(auth_frame, text="Mot de passe:").grid(row=1, column=0)
tk.Entry(auth_frame, textvariable=self.pwd_var, show="*").grid(row=1, column=1)
# Durée
self.duration_var = tk.StringVar(value="1")
tk.Label(self.root, text="Durée (jours):").pack()
ttk.Combobox(self.root, textvariable=self.duration_var, values=["1", "2", "3", "4", "5"]).pack(pady=5)
# Boutons
tk.Button(self.root, text="Télécharger", command=self.start_download).pack(pady=5)
self.status = tk.Label(self.root, text="")
self.status.pack()
self.progress = ttk.Progressbar(self.root, orient="horizontal", length=300, mode="indeterminate")
self.progress.pack(pady=5)
self.display_image()
def resize_image(self, event):
resized_img = self.original_img.resize((event.width, event.height), Image.Resampling.LANCZOS)
self.tk_img = ImageTk.PhotoImage(resized_img)
self.canvas.itemconfig(self.img_id, image=self.tk_img)
def latlon_from_xy(self, x, y):
lat_min, lat_max = 45.0, 56.6
lon_min, lon_max = -9.0, 9.5
lat = lat_max - (y / self.canvas.winfo_height()) * (lat_max - lat_min)
lon = lon_min + (x / self.canvas.winfo_width()) * (lon_max - lon_min)
return lat, lon
def on_click(self, event):
self.start_x, self.start_y = event.x, event.y
self.rect = self.canvas.create_rectangle(self.start_x, self.start_y, event.x, event.y, outline="red")
def on_drag(self, event):
self.canvas.coords(self.rect, self.start_x, self.start_y, event.x, event.y)
def on_release(self, event):
lat1, lon1 = self.latlon_from_xy(self.start_x, self.start_y)
lat2, lon2 = self.latlon_from_xy(event.x, event.y)
self.lat1_var.set(f"{min(lat1, lat2):.4f}")
self.lat2_var.set(f"{max(lat1, lat2):.4f}")
self.lon1_var.set(f"{min(lon1, lon2):.4f}")
self.lon2_var.set(f"{max(lon1, lon2):.4f}")
def display_image(self):
resized_img = self.original_img.resize((self.canvas.winfo_width(), self.canvas.winfo_height()), Image.Resampling.LANCZOS)
self.tk_img = ImageTk.PhotoImage(resized_img)
self.canvas.itemconfig(self.img_id, image=self.tk_img)
def start_download(self):
threading.Thread(target=self.download).start()
def download(self):
self.status.config(text="Téléchargement en cours...")
self.progress.start()
self.root.update_idletasks()
try:
downloader = CopernicusDownloader(self.user_var.get(), self.pwd_var.get())
downloader.download(
lat_min=float(self.lat1_var.get()),
lat_max=float(self.lat2_var.get()),
lon_min=float(self.lon1_var.get()),
lon_max=float(self.lon2_var.get()),
days=int(self.duration_var.get()),
output_dir="downloads"
)
self.status.config(text="Téléchargement terminé avec succès.")
except Exception as e:
self.status.config(text=f"Erreur: {e}")
finally:
self.progress.stop()
if __name__ == "__main__":
root = tk.Tk()
app = MapSelector(root)
root.mainloop()