modulo de interface gráfico

This commit is contained in:
2025-05-02 21:07:00 +01:00
parent c5198725f1
commit 2af661e990

131
modules/gui.py Normal file
View File

@ -0,0 +1,131 @@
# gui.py
# Interface gráfica da aplicação UNIQ usando tkinter
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter.ttk import Progressbar
from pathlib import Path
import threading
from modules.logger import logger
from modules.copier import copiar_ficheiros_para_destino
from modules.scanner import listar_ficheiros, listar_ficheiros_unicos
class UniqGUI:
def __init__(self, master):
self.master = master
self.master.title("Uniq - Cópia de Ficheiros")
self.master.geometry("600x300")
self.origem = tk.StringVar()
self.destino = tk.StringVar()
self.categorizar_data = tk.BooleanVar()
self.usar_criacao = tk.BooleanVar()
self.remover_duplicados = tk.BooleanVar()
self._construir_interface()
def _construir_interface(self):
# Selecção de origem
tk.Label(self.master, text="Pasta de Origem:").grid(
row=0, column=0, sticky="e")
tk.Entry(self.master, textvariable=self.origem,
width=40).grid(row=0, column=1)
tk.Button(self.master, text="Procurar", command=self._selecionar_origem).grid(
row=0, column=2
)
# Selecção de destino
tk.Label(self.master, text="Pasta de Destino:").grid(
row=1, column=0, sticky="e"
)
tk.Entry(self.master, textvariable=self.destino,
width=40).grid(row=1, column=1)
tk.Button(self.master, text="Procurar", command=self._selecionar_destino).grid(
row=1, column=2
)
# Opções
tk.Checkbutton(
self.master, text="Categorizar por data", variable=self.categorizar_data
).grid(row=2, column=1, sticky="w")
tk.Checkbutton(
self.master, text="Usar data de criação", variable=self.usar_criacao
).grid(row=3, column=1, sticky="w")
tk.Checkbutton(
self.master,
text="Remover ficheiros duplicados",
variable=self.remover_duplicados,
).grid(row=4, column=1, sticky="w")
# Botão de início
tk.Button(
self.master, text="Iniciar cópia", command=self._iniciar_copia_thread
).grid(row=5, column=1, pady=10)
# Barra de progresso
self.progress = Progressbar(self.master, mode="determinate")
self.progress.grid(row=6, column=0, columnspan=3,
sticky="ew", padx=10, pady=10)
def _selecionar_origem(self):
pasta = filedialog.askdirectory()
if pasta:
self.origem.set(pasta)
def _selecionar_destino(self):
pasta = filedialog.askdirectory()
if pasta:
self.destino.set(pasta)
def _iniciar_copia_thread(self):
thread = threading.Thread(target=self._iniciar_copia)
thread.start()
def _iniciar_copia(self):
origem = self.origem.get()
destino = self.destino.get()
if not origem or not destino:
messagebox.showerror("Erro", "Origem e destino são obrigatórios.")
return
if self.remover_duplicados.get():
ficheiros_dict = listar_ficheiros_unicos(origem)
lista_ficheiros = [ficheiro[0]
for ficheiro in ficheiros_dict.values()]
else:
lista_ficheiros = listar_ficheiros(origem)
total = len(lista_ficheiros)
self.progress["maximum"] = total
logger.info("lista de ficheiros com %d entradas", total)
def callback():
self.progress["value"] += 1
def progresso_callback():
self.master.after(0, callback)
copiar_ficheiros_para_destino(
lista_ficheiros,
destino,
categorizar_data=self.categorizar_data.get(),
usar_criacao=self.usar_criacao.get(),
progresso_callback=progresso_callback,
)
self.master.after(
0,
lambda: messagebox.showinfo(
"Concluído", f"Foram copiados {total} ficheiros."
),
)
if __name__ == "__main__":
root = tk.Tk()
app = UniqGUI(root)
root.mainloop()