modulo de interface gráfico
This commit is contained in:
131
modules/gui.py
Normal file
131
modules/gui.py
Normal 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()
|
||||
Reference in New Issue
Block a user