Purge_Registres_D-c-s_INSEE/purge-registres-deces-insee/gui_trouver_decedes.py

161 lines
6.6 KiB
Python

"""
Copyright (c) 2020 Sdj Geek
Voir le fichier LICENSE
Ce programme permet de comparer le fichier des personnes décédées établi par l'INSEE avec les registre de membres de
l'Église, afin de déterminer si figurent dans nos registre des personnes décédées.
L'INSEE reçoit des communes les décès enregistrés. Le fichier des personnes décédées établi par l'INSEE est en accès
libre sur le site https://www.data.gouv.fr.
"""
import tkinter as tk
import tkinter.ttk as ttk
import tkinter.filedialog as tkfiledialog
from multiprocessing import Process, Pipe
from trouver_decedes import trouver_decedes
class MainApplication(tk.Frame):
def __init__(self, parent, *args, **kwargs):
# Worker
self.run = False
self.pipe = None
# GUI
tk.Frame.__init__(self, parent, *args, **kwargs)
self.parent = parent
self.frame = tk.Frame(parent)
self.frame.pack()
# Sélection base INSEE
self.label_bdd_insee = tk.Label(self.frame, text="Fichier de l'INSEE")
self.label_bdd_insee.grid(row=0, column=0, sticky='e')
self.value_bdd_insee = tk.StringVar()
self.entry_bdd_insee = tk.Entry(self.frame, state='disabled', textvariable=self.value_bdd_insee)
self.entry_bdd_insee.grid(row=0, column=1, sticky='ew')
self.button_bdd_insee = tk.Button(self.frame, text="...", command=self.command_button_bdd_insee)
self.button_bdd_insee.grid(row=0, column=2, sticky='w')
# Sélection fichier Excel
self.label_fichier_excel = tk.Label(self.frame, text="Fichier Excel")
self.label_fichier_excel.grid(row=1, column=0, sticky='e')
self.value_fichier_excel = tk.StringVar()
self.entry_fichier_excel = tk.Entry(self.frame, state='disabled', textvariable=self.value_fichier_excel)
self.entry_fichier_excel.grid(row=1, column=1, sticky='ew')
self.button_fichier_excel = tk.Button(self.frame, text="...", command=self.command_button_fichier_excel)
self.button_fichier_excel.grid(row=1, column=2, sticky='w')
# Sélection répertoire sortie
self.label_dir_out = tk.Label(self.frame, text="Répertoire de sortie")
self.label_dir_out.grid(row=2, column=0, sticky='e')
self.value_dir_out = tk.StringVar()
self.entry_dir_out = tk.Entry(self.frame, state='disabled', textvariable=self.value_dir_out)
self.entry_dir_out.grid(row=2, column=1, sticky='ew')
self.button_dir_out = tk.Button(self.frame, text="...", command=self.command_button_dir_out)
self.button_dir_out.grid(row=2, column=2, sticky='w')
# Sélection des unités à traiter
self.label_units = tk.Label(self.frame, text="Unités à purger")
self.label_units.grid(row=3, column=0, sticky='e')
self.value_units = tk.StringVar()
self.entry_units = tk.Entry(self.frame, textvariable=self.value_units)
self.entry_units.grid(row=3, column=1, sticky='ew', columnspan="2")
# Bouton validation
self.button_valid = tk.Button(self.frame, text="Ok", command=self.command_button_valid)
self.button_valid.grid(row=4, column=0, columnspan=3)
# Barre de progression
self.progressbar = ttk.Progressbar(self.frame, orient=tk.HORIZONTAL, mode='determinate')
self.progressbar.grid(row=5, column=0, columnspan=3, sticky='ew')
# Affichage des logs
self.text_log = tk.Text(self.frame, state='disabled')
self.text_log.grid(row=0, column=3, rowspan=6, sticky='nesw')
def command_button_bdd_insee(self):
self.value_bdd_insee.set(tkfiledialog.askopenfilename(title="Fichier de l'INSEE"))
def command_button_fichier_excel(self):
self.value_fichier_excel.set(tkfiledialog.askopenfilename(title="Fichier Excel"))
def command_button_dir_out(self):
self.value_dir_out.set(tkfiledialog.askdirectory(title="Répertoire de sortie"))
def add_log(self, text):
self.text_log.configure(state='normal')
self.text_log.insert(tk.END, text)
self.text_log.configure(state='disabled')
def clear_log(self):
self.text_log.configure(state='normal')
self.text_log.delete('1.0', tk.END)
self.text_log.configure(state='disabled')
def watch(self):
if self.run:
if self.pipe.poll():
message = self.pipe.recv()
if message.get('step', False):
self.progressbar.step(message['step'])
elif message.get('text', False):
self.add_log(message['text'])
elif 'running' in message:
self.run = message['running']
elif message.get('set_max', False):
self.progressbar["value"] = 0
self.progressbar['maximum'] = message['set_max']
self.parent.after(100, self.watch)
else:
self.add_log("\nRecherche terminée\n")
self.button_valid.configure(state='normal')
def command_button_valid(self):
self.button_valid.configure(state='disabled')
self.clear_log()
self.run = True
(conn1, conn2) = Pipe()
self.pipe = conn1
unite = self.value_units.get().split(',')
if unite == ['']:
unite = None
Worker(conn2, self.value_bdd_insee.get(), self.value_fichier_excel.get(), self.value_dir_out.get(), unite).start()
self.watch()
class Worker(Process):
def __init__(self, pipe, bdd_insee, fichier_excel, dir_out, units):
Process.__init__(self)
self.pipe = pipe
self.bdd_insee = bdd_insee
self.fichier_excel = fichier_excel
self.dir_out = dir_out
self.units = units
def tracker(self, step=None, text=None, set_max=None, running=None):
if step is not None:
self.pipe.send({'step': step})
elif text is not None:
self.pipe.send({'text': text})
elif set_max is not None:
self.pipe.send({'set_max': set_max})
elif running is not None:
self.pipe.send({'running': running})
def run(self):
trouver_decedes(chemin_base_donnees=self.bdd_insee,
excel_path=self.fichier_excel,
chemin_repertoire_sortie=self.dir_out,
numeros_unites=self.units,
tracker=self.tracker)
self.pipe.send({'running': False})
if __name__ == "__main__":
root = tk.Tk()
root.title('Recherche des personnes décédées dans les registres')
MainApplication(root).pack(side="top", fill="both", expand=True)
root.mainloop()