You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
2.8 KiB

Elapsed / Remaining Time on Progress Bar parent 00e0f3e7c6434240ffe02522a0be2daf8c5b456c author Jack McKew <jackmckew2@gmail.com> 1594344614 +1000 committer Jack McKew <jackmckew2@gmail.com> 1594346638 +1000 Elapsed / Remaining Time on Progress Bar parent 00e0f3e7c6434240ffe02522a0be2daf8c5b456c author Fizban <jackmckew2@gmail.com> 1593182730 +1000 committer Fizban <jackmckew2@gmail.com> 1593246420 +1000 parent 00e0f3e7c6434240ffe02522a0be2daf8c5b456c author Fizban <jackmckew2@gmail.com> 1593182730 +1000 committer Fizban <jackmckew2@gmail.com> 1593246359 +1000 Elapsed / Remaining Time on Progress Bar Elapsed / Remaining Time on Progress Bar Time Remaining Text for Progress Time remaining somewhat working Time format working Add tests and pythn 2.7 compat Incase python 2 import perf counter in func Fix flickering text and align Remove transactUI Add new decorators Update time remaining notes in README Amend tests with new arguments Remove unused import Separate into time module Move to dictionary structure options Explicitly show time text Amend tests for separate module Integration test - missing on complete tests Remove old code Elapsed / Remaining Time on Progress Bar parent 00e0f3e7c6434240ffe02522a0be2daf8c5b456c author Fizban <jackmckew2@gmail.com> 1593182730 +1000 committer Fizban <jackmckew2@gmail.com> 1593246420 +1000 parent 00e0f3e7c6434240ffe02522a0be2daf8c5b456c author Fizban <jackmckew2@gmail.com> 1593182730 +1000 committer Fizban <jackmckew2@gmail.com> 1593246359 +1000 Elapsed / Remaining Time on Progress Bar Elapsed / Remaining Time on Progress Bar Time Remaining Text for Progress Time remaining somewhat working Time format working Add tests and pythn 2.7 compat Incase python 2 import perf counter in func Fix flickering text and align Remove transactUI Add new decorators Update time remaining notes in README Amend tests with new arguments Remove unused import Separate into time module Move to dictionary structure options Explicitly show time text Amend tests for separate module Remove old code Pass testdata as dict instead of kwargs Merge dictionaries for defaults Test almost working Delete settings.json Revert "Test almost working" This reverts commit f17d50681cae664719f67a7e8cc0b1feaf1ac4c7. Back to working state Remove unhelpful test Update docs Working without updated test Add tests for time remaining text Elapsed / Remaining Time on Progress Bar parent 00e0f3e7c6434240ffe02522a0be2daf8c5b456c author Jack McKew <jackmckew2@gmail.com> 1594344614 +1000 committer Jack McKew <jackmckew2@gmail.com> 1594346638 +1000 Elapsed / Remaining Time on Progress Bar parent 00e0f3e7c6434240ffe02522a0be2daf8c5b456c author Fizban <jackmckew2@gmail.com> 1593182730 +1000 committer Fizban <jackmckew2@gmail.com> 1593246420 +1000 parent 00e0f3e7c6434240ffe02522a0be2daf8c5b456c author Fizban <jackmckew2@gmail.com> 1593182730 +1000 committer Fizban <jackmckew2@gmail.com> 1593246359 +1000 Elapsed / Remaining Time on Progress Bar Elapsed / Remaining Time on Progress Bar Time Remaining Text for Progress Time remaining somewhat working Time format working Add tests and pythn 2.7 compat Incase python 2 import perf counter in func Fix flickering text and align Remove transactUI Add new decorators Update time remaining notes in README Amend tests with new arguments Remove unused import Separate into time module Move to dictionary structure options Explicitly show time text Amend tests for separate module Integration test - missing on complete tests Remove old code Elapsed / Remaining Time on Progress Bar parent 00e0f3e7c6434240ffe02522a0be2daf8c5b456c author Fizban <jackmckew2@gmail.com> 1593182730 +1000 committer Fizban <jackmckew2@gmail.com> 1593246420 +1000 parent 00e0f3e7c6434240ffe02522a0be2daf8c5b456c author Fizban <jackmckew2@gmail.com> 1593182730 +1000 committer Fizban <jackmckew2@gmail.com> 1593246359 +1000 Elapsed / Remaining Time on Progress Bar Elapsed / Remaining Time on Progress Bar Time Remaining Text for Progress Time remaining somewhat working Time format working Add tests and pythn 2.7 compat Incase python 2 import perf counter in func Fix flickering text and align Remove transactUI Add new decorators Update time remaining notes in README Amend tests with new arguments Remove unused import Separate into time module Move to dictionary structure options Explicitly show time text Amend tests for separate module Remove old code Pass testdata as dict instead of kwargs Merge dictionaries for defaults Test almost working Delete settings.json Revert "Test almost working" This reverts commit f17d50681cae664719f67a7e8cc0b1feaf1ac4c7. Back to working state Remove unhelpful test Update docs Working without updated test Add tests for time remaining text Remove artifact from squashing Amend artifacts Handle no progress and tidy up footer label
4 years ago
  1. """
  2. Module for evaluating time elapsed & time remaining from progress
  3. """
  4. import wx
  5. from gooey.gui.pubsub import pub
  6. from gooey.gui import events
  7. class Timing(object):
  8. def __init__(self, parent):
  9. self.startTime = 0
  10. self.estimatedRemaining = None
  11. self.wxTimer = wx.Timer(parent)
  12. self.parent = parent
  13. parent.Bind(wx.EVT_TIMER, self.publishTime, self.wxTimer)
  14. pub.subscribe(events.PROGRESS_UPDATE, self._updateEstimate)
  15. def _updateEstimate(self, *args, **kwargs):
  16. prog = kwargs.get('progress')
  17. if(not prog):
  18. self.estimatedRemaining = None
  19. return
  20. if(prog > 0):
  21. self.estimatedRemaining = estimate_time_remaining(prog,self.startTime)
  22. def publishTime(self, *args, **kwargs):
  23. pub.send_message(
  24. events.TIME_UPDATE,
  25. start=self.startTime,
  26. current=get_current_time(),
  27. elapsed_time=format_interval(get_elapsed_time(self.startTime)),
  28. estimatedRemaining=format_interval(self.estimatedRemaining))
  29. def start(self):
  30. self.startTime = get_current_time()
  31. self.estimatedRemaining = None
  32. self.wxTimer.Start()
  33. def stop(self):
  34. self.wxTimer.Stop()
  35. def format_interval(timeValue):
  36. """
  37. Formats a number of seconds as a clock time, [H:]MM:SS
  38. Parameters
  39. ----------
  40. t : int
  41. Number of seconds.
  42. Returns
  43. -------
  44. out : str
  45. [H:]MM:SS
  46. """
  47. # https://github.com/tqdm/tqdm/blob/0cd9448b2bc08125e74538a2aea6af42ee1a7b6f/tqdm/std.py#L228
  48. try:
  49. mins, s = divmod(int(timeValue), 60)
  50. h, m = divmod(mins, 60)
  51. if h:
  52. return '{0:d}:{1:02d}:{2:02d}'.format(h, m, s)
  53. else:
  54. return '{0:02d}:{1:02d}'.format(m, s)
  55. except:
  56. return None
  57. def get_elapsed_time(startTime):
  58. """
  59. Get elapsed time in form of seconds. Provide a start time in seconds as float.
  60. Args:
  61. startTime (float): Start time to compare against in seconds.
  62. Returns:
  63. float: Time between start time and now
  64. """
  65. return get_current_time() - startTime
  66. def estimate_time_remaining(progress,startTime):
  67. # https://github.com/tqdm/tqdm/blob/0cd9448b2bc08125e74538a2aea6af42ee1a7b6f/tqdm/std.py#L392
  68. # https://github.com/tqdm/tqdm/blob/0cd9448b2bc08125e74538a2aea6af42ee1a7b6f/tqdm/std.py#L417
  69. _rate = progress / get_elapsed_time(startTime)
  70. return ((100 - progress) / _rate)
  71. def get_current_time():
  72. """
  73. Returns a float of the current time in seconds. Attempt to import perf_counter (more accurate in 3.4+), otherwise utilise timeit.
  74. Returns:
  75. float: Current time in seconds from performance counter.
  76. """
  77. try:
  78. from time import perf_counter
  79. return perf_counter()
  80. except:
  81. import timeit
  82. return timeit.default_timer()