from peak.events.trellis import *
from peak.events.activity import *
from time import time
class Progress(Component):
started = attr(False)
started_time = attr(None)
completed = attr(0)
@compute
def time_passed(self):
if self.started_time:
bool(Time[0.1])
return (time() - self.started_time)
@compute
def time_remaining(self):
if self.time_passed and self.completed:
return self.time_passed * ((1 - self.completed) / self.completed)
@maintain
def on_start(self):
if self.started:
self.started_time = time()
######################################################
######################################################
import wx
class WxProgressWindow(Component):
progress = make(Progress)
def __init__(self):
self.app = wx.PySimpleApp()
self.frame = wx.Frame(None)
self.pbar = wx.Gauge(self.frame, range=1000)
self.frame.Show()
@perform
def on_progress(self):
self.pbar.Value = 1000 * self.progress.completed
class WxProgressWindowPlus(WxProgressWindow):
def __init__(self):
WxProgressWindow.__init__(self)
self.text = wx.StaticText(self.frame)
sz = self.frame.Sizer = wx.BoxSizer(orient=wx.VERTICAL)
sz.AddWindow(self.pbar, flag=wx.GROW)
sz.AddWindow(self.text, flag=wx.GROW)
@perform
def on_progress_plus(self):
tp = self.progress.time_passed
tr = self.progress.time_remaining
if tp is None:
txt = "Not started"
else:
txt = "Seconds passed: %.1f" % tp
if tr:
txt += "; Seconds remaining: %.1f" % tr
self.text.Label = txt
self.frame.Layout()
######################################################
######################################################
class SteadyIncrease(Component):
subject = make(int)
increment = attr(1)
@task
def increase(self):
next = True
while True:
while not next:
yield Pause
next = Time[1]
self.subject += self.increment
######################################################
######################################################
win = WxProgressWindowPlus()
win.progress.started = True
#win.progress.completed = 0.5
EventLoop <<= WXEventLoop
autoinc = SteadyIncrease(subject=win.progress.__cells__['completed'], increment=0.1)
EventLoop.run()