132 lines
4.1 KiB
Python
132 lines
4.1 KiB
Python
# 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()
|