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