def log_progress(sequence, every=None, size=None, name='Items'): from ipywidgets import IntProgress, HTML, VBox from IPython.display import display is_iterator = False if size is None: try: size = len(sequence) except TypeError: is_iterator = True if size is not None: if every is None: if size <= 200: every = 1 else: every = int(size / 200) # every 0.5% else: assert every is not None, 'sequence is iterator, set every' if is_iterator: progress = IntProgress(min=0, max=1, value=1) progress.bar_style = 'info' else: progress = IntProgress(min=0, max=size, value=0) label = HTML() box = VBox(children=[label, progress]) display(box) index = 0 try: for index, record in enumerate(sequence, 1): if index == 1 or index % every == 0: if is_iterator: label.value = '{name}: {index} / ?'.format(name=name, index=index) else: progress.value = index label.value = u'{name}: {index} / {size}'.format( name=name, index=index, size=size) yield record except: progress.bar_style = 'danger' raise else: progress.bar_style = 'success' progress.value = index label.value = "{name}: {index}".format(name=name, index=str(index or '?'))
def create(self): """ Create the log viewer. """ from ipywidgets import HTML, HBox, VBox html = HTML() html.value = """<div style="max-height: 400px; overflow-y: auto; width: 100%";>""" buttons = [] for type in self.log_levels: buttons.append( HTML( self.toggle_button_line.format(type_lower=type.lower(), type_upper=type.upper()))) buttons_view = HBox(buttons) buttons_view.margin = "10px 0px" html.value += """<table style="word-break: break-all; margin: 10px;">""" for line in self.log_content.split("\n"): found = False for type in self.log_levels: type_upper = type.upper() type_lower = type.lower() color = self.log_color_codes[type_upper] if line.startswith( "[{type_upper}]".format(type_upper=type_upper)): html.value += self.log_line.format(content=line, type_lower=type_lower, color=color) found = True break if not found: html.value += self.log_line.format( content=line, type_lower="default", color=self.log_color_codes["DEFAULT"]) html.value += "</table></div>" html.width = "100%" html.margin = "5px" result_vbox = VBox((buttons_view, html)) return result_vbox