From c795e5258a620fa14b59eedd44e11d26148efe76 Mon Sep 17 00:00:00 2001 From: Auroir <36361058+Auroir@users.noreply.github.com> Date: Fri, 16 Aug 2019 16:06:47 -0700 Subject: [PATCH] Fix log_info/log_err printing with progress bars **Issue** While a TQDM progress bar is active using a standard 'print' will cause unpredicable output. In most cases this causes the progress bar to be duplicated/frozen next to the log message: ``` Running on CPU0. Running on CPU1. Converting: 0% 0/356 [00:00 is not a dfl image file required for training` does use `log_info` and prints correctly. A majority of the commonly seen messages are covered, so this is still very worthwhile from a UX perspective. --- interact/interact.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/interact/interact.py b/interact/interact.py index c9b22f1..bda74af 100644 --- a/interact/interact.py +++ b/interact/interact.py @@ -33,6 +33,7 @@ class InteractBase(object): self.key_events = {} self.pg_bar = None self.focus_wnd_name = None + self.error_log_line_prefix = '/!\\ ' def is_support_windows(self): return False @@ -65,10 +66,22 @@ class InteractBase(object): raise NotImplemented def log_info(self, msg, end='\n'): + if self.pg_bar is not None: + try: # Attempt print before the pb + tqdm.write(msg) + return + except: + pass #Fallback to normal print upon failure print (msg, end=end) def log_err(self, msg, end='\n'): - print (msg, end=end) + if self.pg_bar is not None: + try: # Attempt print before the pb + tqdm.write(f'{self.error_log_line_prefix}{msg}') + return + except: + pass #Fallback to normal print upon failure + print (f'{self.error_log_line_prefix}{msg}', end=end) def named_window(self, wnd_name): if wnd_name not in self.named_windows: @@ -150,9 +163,12 @@ class InteractBase(object): else: print("progress_bar not set.") def progress_bar_generator(self, data, desc, leave=True): - for x in tqdm( data, desc=desc, leave=leave, ascii=True ): + self.pg_bar = tqdm( data, desc=desc, leave=leave, ascii=True ) + for x in self.pg_bar: yield x - + self.pg_bar.close() + self.pg_bar = None + def process_messages(self, sleep_time=0): self.on_process_messages(sleep_time)