Fixed output when console is spinning
This commit is contained in:
		| @@ -8,6 +8,7 @@ from tabulate import tabulate | ||||
| from termcolor import colored | ||||
|  | ||||
| from cpl.console.background_color import BackgroundColor | ||||
| from cpl.console.console_call import ConsoleCall | ||||
| from cpl.console.foreground_color import ForegroundColor | ||||
| from cpl.console.spinner_thread import SpinnerThread | ||||
|  | ||||
| @@ -21,6 +22,9 @@ class Console: | ||||
|     _y: Optional[int] = None | ||||
|     _disabled: bool = False | ||||
|  | ||||
|     _hold_back = False | ||||
|     _hold_back_calls: list[ConsoleCall] = [] | ||||
|  | ||||
|     """ | ||||
|         Properties | ||||
|     """ | ||||
| @@ -39,6 +43,10 @@ class Console: | ||||
|         Settings | ||||
|     """ | ||||
|  | ||||
|     @classmethod | ||||
|     def set_hold_back(cls, value: bool): | ||||
|         cls._hold_back = value | ||||
|  | ||||
|     @classmethod | ||||
|     def set_background_color(cls, color: Union[BackgroundColor, str]): | ||||
|         if type(color) is str: | ||||
| @@ -95,16 +103,25 @@ class Console: | ||||
|     """ | ||||
|         Useful public methods | ||||
|     """ | ||||
|  | ||||
|     @classmethod | ||||
|     def banner(cls, string: str): | ||||
|         if cls._disabled: | ||||
|             return | ||||
|  | ||||
|         if cls._hold_back: | ||||
|             cls._hold_back_calls.append(ConsoleCall(cls.banner, string)) | ||||
|             return | ||||
|  | ||||
|         ascii_banner = pyfiglet.figlet_format(string) | ||||
|         cls.write_line(ascii_banner) | ||||
|  | ||||
|     @classmethod | ||||
|     def clear(cls): | ||||
|         if cls._hold_back: | ||||
|             cls._hold_back_calls.append(ConsoleCall(cls.clear)) | ||||
|             return | ||||
|  | ||||
|         os.system('cls' if os.name == 'nt' else 'clear') | ||||
|  | ||||
|     @classmethod | ||||
| @@ -112,6 +129,10 @@ class Console: | ||||
|         if cls._disabled: | ||||
|             return | ||||
|  | ||||
|         if cls._hold_back: | ||||
|             cls._hold_back_calls.append(ConsoleCall(cls.close)) | ||||
|             return | ||||
|  | ||||
|         Console.reset() | ||||
|         Console.write('\n\n\nPress any key to continue...') | ||||
|         Console.read_line() | ||||
| @@ -126,6 +147,10 @@ class Console: | ||||
|         if cls._disabled: | ||||
|             return | ||||
|  | ||||
|         if cls._hold_back: | ||||
|             cls._hold_back_calls.append(ConsoleCall(cls.error, string, tb)) | ||||
|             return | ||||
|  | ||||
|         cls.set_foreground_color('red') | ||||
|         if tb is not None: | ||||
|             cls.write_line(f'{string} -> {tb}') | ||||
| @@ -139,14 +164,14 @@ class Console: | ||||
|  | ||||
|     @classmethod | ||||
|     def read(cls, output: str = None) -> str: | ||||
|         if output is not None: | ||||
|         if output is not None and not cls._hold_back: | ||||
|             cls.write(output) | ||||
|  | ||||
|         return input()[0] | ||||
|  | ||||
|     @classmethod | ||||
|     def read_line(cls, output: str = None) -> str: | ||||
|         if cls._disabled: | ||||
|         if cls._disabled and not cls._hold_back: | ||||
|             return '' | ||||
|  | ||||
|         if output is not None: | ||||
| @@ -164,6 +189,10 @@ class Console: | ||||
|         if cls._disabled: | ||||
|             return | ||||
|  | ||||
|         if cls._hold_back: | ||||
|             cls._hold_back_calls.append(ConsoleCall(cls.table, header, values)) | ||||
|             return | ||||
|  | ||||
|         table = tabulate(values, headers=header) | ||||
|  | ||||
|         Console.write_line(table) | ||||
| @@ -174,6 +203,10 @@ class Console: | ||||
|         if cls._disabled: | ||||
|             return | ||||
|  | ||||
|         if cls._hold_back: | ||||
|             cls._hold_back_calls.append(ConsoleCall(cls.write, args)) | ||||
|             return | ||||
|  | ||||
|         string = ' '.join(map(str, args)) | ||||
|         cls._output(string, end='') | ||||
|  | ||||
| @@ -182,6 +215,10 @@ class Console: | ||||
|         if cls._disabled: | ||||
|             return | ||||
|  | ||||
|         if cls._hold_back: | ||||
|             cls._hold_back_calls.append(ConsoleCall(cls.write_at, x, y, args)) | ||||
|             return | ||||
|  | ||||
|         string = ' '.join(map(str, args)) | ||||
|         cls._output(string, x, y, end='') | ||||
|  | ||||
| @@ -190,6 +227,10 @@ class Console: | ||||
|         if cls._disabled: | ||||
|             return | ||||
|  | ||||
|         if cls._hold_back: | ||||
|             cls._hold_back_calls.append(ConsoleCall(cls.write_line, args)) | ||||
|             return | ||||
|  | ||||
|         string = ' '.join(map(str, args)) | ||||
|         if not cls._is_first_write: | ||||
|             cls._output('') | ||||
| @@ -200,6 +241,10 @@ class Console: | ||||
|         if cls._disabled: | ||||
|             return | ||||
|  | ||||
|         if cls._hold_back: | ||||
|             cls._hold_back_calls.append(ConsoleCall(cls.write_line_at, x, y, args)) | ||||
|             return | ||||
|  | ||||
|         string = ' '.join(map(str, args)) | ||||
|         if not cls._is_first_write: | ||||
|             cls._output('', end='') | ||||
| @@ -207,14 +252,18 @@ class Console: | ||||
|  | ||||
|     @classmethod | ||||
|     def spinner(cls, message: str, call: Callable) -> any: | ||||
|         if cls._hold_back: | ||||
|             cls._hold_back_calls.append(ConsoleCall(cls.spinner, message, call)) | ||||
|             return | ||||
|  | ||||
|         cls.write_line(message) | ||||
|         spinner = SpinnerThread(cls) | ||||
|         cls.set_hold_back(True) | ||||
|         spinner = SpinnerThread() | ||||
|         spinner.start() | ||||
|         return_value = call() | ||||
|         spinner.stop_spinning() | ||||
|         cls.set_hold_back(False) | ||||
|         for call in cls._hold_back_calls: | ||||
|             call.function(*call.args) | ||||
|  | ||||
|         return return_value | ||||
|  | ||||
|     @classmethod | ||||
|     def flush(cls): | ||||
|         sys.stdout.flush() | ||||
|   | ||||
							
								
								
									
										16
									
								
								src/cpl/console/console_call.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/cpl/console/console_call.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| from collections import Callable | ||||
|  | ||||
|  | ||||
| class ConsoleCall: | ||||
|  | ||||
|     def __init__(self, function: Callable, *args): | ||||
|         self._func = function | ||||
|         self._args = args | ||||
|  | ||||
|     @property | ||||
|     def function(self): | ||||
|         return self._func | ||||
|  | ||||
|     @property | ||||
|     def args(self): | ||||
|         return self._args | ||||
| @@ -1,13 +1,13 @@ | ||||
| import sys | ||||
| import threading | ||||
| import time | ||||
|  | ||||
|  | ||||
| class SpinnerThread(threading.Thread): | ||||
|  | ||||
|     def __init__(self, console): | ||||
|     def __init__(self): | ||||
|         threading.Thread.__init__(self) | ||||
|  | ||||
|         self._console = console | ||||
|         self._is_spinning = True | ||||
|  | ||||
|     @staticmethod | ||||
| @@ -17,16 +17,19 @@ class SpinnerThread(threading.Thread): | ||||
|                 yield cursor | ||||
|  | ||||
|     def run(self) -> None: | ||||
|         self._console.write('\t') | ||||
|         print('\t', end='') | ||||
|         spinner = self._spinner() | ||||
|         while self._is_spinning: | ||||
|             self._console.write(next(spinner)) | ||||
|             # self._console.write(next(spinner)) | ||||
|             print(next(spinner), end='') | ||||
|             time.sleep(0.1) | ||||
|             self._console.write('\b') | ||||
|             # self._console.write('\b') | ||||
|             print('\b', end='') | ||||
|  | ||||
|             self._console.flush() | ||||
|             sys.stdout.flush() | ||||
|  | ||||
|         self._console.write(' ') | ||||
|         # self._console.write(' ') | ||||
|         print(' ', end='') | ||||
|  | ||||
|     def stop_spinning(self): | ||||
|         self._is_spinning = False | ||||
|   | ||||
		Reference in New Issue
	
	Block a user