def reduce_colours(img_rgb, final_colours): if not isinstance(img_rgb, np.ndarray): img_rgb = np.asarray(img_rgb) / 255 final_img = img_rgb.copy() # TODO: check if the RGB2LAB conversion MUST occurs at the very last # or if the problems I had were because of code problem uh pb = ProgressBar('Reducing colours') for i in range(final_img.shape[0]): for j in range(final_img.shape[1]): c1 = color.rgb2lab([[final_img[i, j]]])[0][0] c2 = [color.rgb2lab([[x]])[0][0] for x in final_colours] distances = [dst(c1, x) for x in c2] final_img[i, j] = final_colours[distances.index(min(distances))] pb.set_value( floor((((i * final_img.shape[1]) + j) / (final_img.shape[0] * final_img.shape[1])) * 100)) QApplication.processEvents() pb.close() return final_img
def append_root(self, root): ''' 添加一个root ''' data = self.read() # 如果目录已存在,或是现有Root集的子路径,跳出;否则添加目录 for _root in data['Root']: if _root == root or _root in root: return data['Root'].append(root) # 初始化一个进度条 progress_bar = ProgressBar('Code Files') # 添加目录下的所有文件 file_reader = FileReader() file_list = file_reader.walk_folder(root) total_number = len(file_list) for index, file in enumerate(file_list): # 获取文件基本信息 ## 获取文件标识码 file_code = file_reader.code_file(file) ## 获取文件名和文件扩展名 file_basename = os.path.basename(file) file_name, file_extension = os.path.splitext(file_basename) ## 获取文件大小 file_size_num = (int)(file_code.split('-')[-1]) file_size_num = round(file_size_num / 1024 / 1024) file_size = str(file_size_num) + ' MB' if file_size_num < 1024 \ else str(round(file_size_num / 1024, 2)) + ' GB' # 如果在已有数据中找不到文件,进行添加 if file not in data['File']: data['File'][file] = { 'code': file_code, 'extension': file_extension, 'name': file_name, 'path': file, 'size': file_size, } # 进度条即时显示 progress_bar.set_value(index + 1, total_number) QApplication.processEvents() # 循环结束,关闭进度条 progress_bar.close() # 回填更新后的数据 self.write(data)
class ProgressBarController(object): """управление полоской прогресса""" __slots__ = ('_width', '_term_width', '_progress_bar', '_oldsignal') def __init__(self, min, max, width=0, value=None): self._width = None self._term_width = None self._oldsignal = None self._progress_bar = ProgressBar(min, max, min) if value is not None: self._progress_bar.set_value(value) # ширина в ноль означает, что полоска должна растянуться на все окно # при изменении размера окна полоска подстаивается под новый размер self.set_width(width) def update_term_width(self): # узнать ширину окна self._term_width = get_term_width() # self._term_height = int(rd[0]) def sigwinch_handler(self, sig, frame): if self._width == 0: self.set_width(0) else: pass if hasattr(self._oldsignal, '__call__'): self._oldsignal(sig, frame) def redraw(self): import sys s = str(self._progress_bar) l = len(s) sys.stdout.write(s + ESC + str(l) + "D") sys.stdout.flush() def set_value(self, value, animated=False): import sys if not animated: self._set_value(value) sys.stdout.write(str(self._progress_bar)) else: from animation_controller import \ AnimationController, AnimationTimingQuad start_value = self.value() delta = value - start_value def step_hook(progress): self._set_value(start_value + (delta * progress)) self.redraw() def complete_hook(): self._set_value(value) self.redraw() sys.stdout.write(ESC + str(len(str(self._progress_bar))) + "C") anim = AnimationController(step=step_hook, timing=AnimationTimingQuad, complete=complete_hook) anim.begin() def _set_value(self, value): self._progress_bar.set_value(value) def value(self): return self._progress_bar.value() def set_width(self, width): self.update_term_width() if width < 0: raise ValueError('set_width: width must be >= 0') elif width == 0 or width >= self._term_width - 1: self._width = 0 self._progress_bar.set_width(self._term_width - 1) self._oldsignal = \ signal.signal(signal.SIGWINCH, self.sigwinch_handler) else: self._width = width self._progress_bar.set_width(width) sig = self._oldsignal if self._oldsignal else signal.SIG_DFL signal.signal(signal.SIGWINCH, sig) self._oldsignal = None def width(self): if self._width == 0: return self._term_width - 1 else: return self._width def progress_bar(self): return self._progress_bar def set_progress_bar(self, pb): self._progress_bar = pb pb.set_width(self._width) def __str__(self): return str(self._progress_bar) def __repr__(self): pb = self._progress_bar return 'ProgressBarController(min=%f, max=%f, width=%d, value=%f)' %\ (pb.min(), pb.max(), pb.width(), pb.value())