Addition of wrapper for OneLineProgressMeter

This commit is contained in:
MikeTheWatchGuy 2019-06-19 20:31:12 -04:00
parent b3307d7255
commit 6a7954b9a7
1 changed files with 60 additions and 1 deletions

View File

@ -10,10 +10,11 @@ from time import sleep
"""
Demonstration of simple and multiple OneLineProgressMeter's as well as the Progress Meter Element
There are 3 demos
There are 4 demos
1. Manually updated progress bar
2. Custom progress bar built into your window, updated in a loop
3. OneLineProgressMeters, nested meters showing how 2 can be run at the same time.
4. An "iterable" style progress meter - a wrapper for OneLineProgressMeters
If the software determined that a meter should be cancelled early,
calling OneLineProgresMeterCancel(key) will cancel the meter with the matching key
@ -138,6 +139,64 @@ def custom_meter_example():
window.Close()
'''
A Wrapper for OneLineProgressMeter that combines your iterable with a progress meter into a single interface. For this you need 2 functions:
progess_bar
progress_bar_range
'''
def progress_bar(key, iterable, *args, title='', **kwargs):
"""
Takes your iterable and adds a progress meter onto it
:param key: Progress Meter key
:param iterable: your iterable
:param args: To be shown in one line progress meter
:param title: Title shown in meter window
:param kwargs: Other arguments to pass to OneLineProgressMeter
:return:
"""
sg.OneLineProgressMeter(title, 0, len(iterable), key, *args, **kwargs)
for i, val in enumerate(iterable):
yield val
if not sg.OneLineProgressMeter(title, i+1, len(iterable), key, *args, **kwargs):
break
def progress_bar_range(key, start, stop, step=1, *args, **kwargs):
"""
Acts like the range() function but with a progress meter built-into it
:param key: progess meter's key
:param start: low end of the range
:param stop: Uppder end of range
:param step:
:param args:
:param kwargs:
:return:
"""
return progress_bar(key, range(start, stop, step), *args, **kwargs)
# -------------------- Demo Usage --------------------
def demo_iterable_progress_bar():
my_list = list(range(1000)) # start with a list of 100 integers as the user's list
# first form takes an iterable and a key and will return a value from your iterable
# and bump the progress meter at the same time
for value in progress_bar('bar1', my_list):
# do something useful with value, a value from your list.
print(value)
# Since the progress_bar is an iterator, you can use it within a list comprehension
my_list = [x for x in progress_bar('bar1', my_list)]
# The second form will act like a range function and provide a set of integers while also
# incrementing a progress meter
for i in progress_bar_range('bar2', 1000, 2000, title='Range progress bar'):
# do something with i
print(i)
demo_iterable_progress_bar()
manually_updated_meter_test()
custom_meter_example()
demo_one_line_progress_meter()