12345678910111213141516171819202122 |
- from statecharts_core import EventLoop
- import math
- class TkEventLoop(EventLoop):
- def __init__(self, tk):
-
- tk.sccd_force_update = False
- # bind scheduler callback
- def schedule(callback, timeout):
- if timeout == 0:
- # tk considers updating the window an 'idle' task, only to be done if no events are scheduled for a while. But this has the downside of the interface becoming completely unresponsive while the model is performing steps with no gaps in between. Thus we insert an 'update_idletasks()' to obtain "javascript event loop"-like behavior.
- if tk.sccd_force_update:
- tk.update_idletasks()
- tk.sccd_force_update = False
- else:
- return (False, None) # don't schedule 0-timeout, it's more performant to just keep running
- return (True, tk.after(int(math.ceil(timeout*1000.0)), callback))
- EventLoop.__init__(self, schedule, tk.after_cancel)
|