Updating a FloatProgress widget within a thread doesn't work anymore in a notebook
steffenl <[email protected]> Mon, 12 Oct 2015 06:30:27 -0700 (PDT)
| Newsgroups | gmane.comp.python.ipython.user |
|---|---|
| Message-ID | <[email protected]> |
I am writing a application that calculates some physical beheaviour based on
user defined models. These calculations have a high workload. Therefore the
user needs some information over the calculation progress.
It is very difficult to show the progress in a Jupyter notebook. With text
printing the output can not easily get flushed because of the notebooks
output handling. Therefore I used the FloatProgress widget out of the
IPython.html module. I used a threading.Timer to update the widgets value.
This no longer works in the updated ipython version 3.2.
The widget does not show the actual value. It updates its visual
representation only once after the code in the nodebook cell is already
processed.
How is it possible to update the visual representation of the widget during
the computation? The following simplified code can show the problem if it
runs in a notebook cell:
from IPython.html import widgets
from IPython.display import display
import threading
class Counter:
"""Simulates a task with heavy workload.
The 'value' attribut holds the state of the progress.
If the value of 'value' reaches the value of the 'max' attribut,
the work is done."""
def __init__(self, max):
self.max = max
self.value = 0
def count(self):
for i in xrange(self.max + 1):
for _ in xrange(self.max):
self.value = i
class ProgressBar(widgets.FloatProgress):
def __init__(self, counter):
super(ProgressBar, self).__init__()
self.max = counter.max
self.counter = counter
display(self)
self.show_progress()
def show_progress(self):
self._timer = (
threading.Timer(interval=1.0,
function=self.show_progress)) # restart timer
self._timer.daemon = True # kill thread at shut down of main process
self.value = self.counter.value # here, the bar should visually
respond
self._timer.start()
if self.value >= self.max:
self.bar_style = 'success'
self._timer.cancel()
c = Counter(10000)
s = ProgressBar(c)
c.count()
--
View this message in context: http://python.6.x6.nabble.com/Updating-a-FloatProgress-widget-within-a-thread-doesn-t-work-anymore-in-a-notebook-tp5173902.html
Sent from the IPython - User mailing list archive at Nabble.com.