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

139 lines
5.5 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 répertoire sortie
self.label_dir_out = tk.Label(self.frame, text="Répertoire de sortie")
self.label_dir_out.grid(row=1, 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=1, 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=1, 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=2, 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=2, 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=3, column=0, columnspan=3)
# Barre de progression
self.progressbar = ttk.Progressbar(self.frame, orient=tk.HORIZONTAL, mode='determinate')
self.progressbar.grid(row=4, 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=5, sticky='nesw')
def command_button_bdd_insee(self):
self.value_bdd_insee.set(tkfiledialog.askopenfilename(title="Fichier de l'INSEE"))
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 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):
print(message['text'])
self.add_log(message['text'])
elif message.get('running', False):
self.run = message['running']
elif message.get('set_max', False):
self.progressbar['maximum'] = message['set_max']
self.parent.after(100, self.watch)
else:
print("Recherche terminée")
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.run = True
(conn1, conn2) = Pipe()
self.pipe = conn1
Worker(conn2, self.value_bdd_insee.get(), self.value_dir_out.get(), self.value_units.get().split(',')).start()
self.watch()
class Worker(Process):
def __init__(self, pipe, bdd_insee, dir_out, units):
Process.__init__(self)
self.pipe = pipe
self.bdd_insee = bdd_insee
self.dir_out = dir_out
self.units = units
def tracker(self, step=None, text=None, set_max=None, running=None):
if step:
self.pipe.send({'step': step})
elif text:
self.pipe.send({'text': text})
elif set_max:
self.pipe.send({'set_max': set_max})
elif done:
self.pipe.send({'running': running})
def run(self):
trouver_decedes(chemin_base_donnees=self.bdd_insee,
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()