""" 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()