Ajout du multiprocessing pour que l'IHM ne freez pas

This commit is contained in:
Sdj Geek 2020-07-07 16:07:04 +02:00
parent 602ead50a9
commit b9beb304e6

View File

@ -1,11 +1,17 @@
import tkinter as tk import tkinter as tk
import tkinter.ttk as ttk import tkinter.ttk as ttk
import tkinter.filedialog as tkfiledialog import tkinter.filedialog as tkfiledialog
from multiprocessing import Process, Pipe
from trouver_decedes import trouver_decedes from trouver_decedes import trouver_decedes
class MainApplication(tk.Frame): class MainApplication(tk.Frame):
def __init__(self, parent, *args, **kwargs): def __init__(self, parent, *args, **kwargs):
# Worker
self.run = False
self.pipe = None
# GUI
tk.Frame.__init__(self, parent, *args, **kwargs) tk.Frame.__init__(self, parent, *args, **kwargs)
self.parent = parent self.parent = parent
self.frame = tk.Frame(parent) self.frame = tk.Frame(parent)
@ -54,22 +60,63 @@ class MainApplication(tk.Frame):
def command_button_dir_out(self): def command_button_dir_out(self):
self.value_dir_out.set(tkfiledialog.askdirectory(title="Répertoire de sortie")) self.value_dir_out.set(tkfiledialog.askdirectory(title="Répertoire de sortie"))
def tracker(self, step=None, text=None, set_max=None): def add_log(self, text):
if step: self.text_log.configure(state='normal')
self.progressbar.step(step) self.text_log.insert(tk.END, text)
elif text: self.text_log.configure(state='disabled')
print(text)
self.text_log.configure(state='normal') def watch(self):
self.text_log.insert(tk.END, text) if self.run:
self.text_log.configure(state='disabled') if self.pipe.poll():
elif set_max: message = self.pipe.recv()
self.progressbar['maximum'] = set_max 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): def command_button_valid(self):
trouver_decedes(chemin_base_donnees=self.value_bdd_insee.get(), self.button_valid.configure(state='disabled')
chemin_repertoire_sortie=self.value_dir_out.get(), self.run = True
numeros_unites=self.value_units.get().split(','), (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) tracker=self.tracker)
self.pipe.send({'running': False})
if __name__ == "__main__": if __name__ == "__main__":