Merge pull request #4904 from PySimpleGUI/Dev-latest

Addition of bar_color to the ProgressBar.update method. Fixed Image e…
This commit is contained in:
PySimpleGUI 2021-10-29 17:08:18 -04:00 committed by GitHub
commit f0d28167ae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 53 additions and 42 deletions

View File

@ -1,8 +1,7 @@
#!/usr/bin/python3
version = __version__ = "4.53.0.5 Unreleased"
version = __version__ = "4.53.0.6 Unreleased"
_change_log = """
Changelog since 4.53.0 released to PyPI on 24-Oct-2021
4.53.0.1
@ -26,7 +25,9 @@ _change_log = """
image_subsample parameter - subsample for image (makes smaller by 1/image_subsample)
TabGroup changes
tab_border_width parameter - sets the border around the tab top portion. Now can set to 0 if you want
Removed the green color for the Multiple Choice Group in sg.main so that it's readable now
4.53.0.6
Added bar_color to ProgressMeter.update
Fixed a couple of typos from previous changes
"""
__version__ = version.split()[0] # For PEP 396 and PEP 345
@ -495,11 +496,14 @@ THEME_LIST = ('default', 'winnative', 'clam', 'alt', 'classic', 'vista', 'xpnati
# The theme to use by default for all windows
DEFAULT_TTK_THEME = THEME_DEFAULT
TTK_THEME_LIST = ('default', 'winnative', 'clam', 'alt', 'classic', 'vista', 'xpnative')
USE_TTK_BUTTONS = None
DEFAULT_PROGRESS_BAR_COLOR = (GREENS[0], '#D0D0D0') # a nice green progress bar
DEFAULT_PROGRESS_BAR_COLOR = ("#01826B", '#D0D0D0') # a nice green progress bar
DEFAULT_PROGRESS_BAR_COMPUTE = ('#000000', '#000000') # Means that the progress bar colors should be computed from other colors
DEFAULT_PROGRESS_BAR_COLOR_OFFICIAL = (GREENS[0], '#D0D0D0') # a nice green progress bar
DEFAULT_PROGRESS_BAR_COLOR_OFFICIAL = ("#01826B", '#D0D0D0') # a nice green progress bar
DEFAULT_PROGRESS_BAR_SIZE = (20, 20) # Size of Progress Bar (characters for length, pixels for width)
DEFAULT_PROGRESS_BAR_BORDER_WIDTH = 1
DEFAULT_PROGRESS_BAR_RELIEF = RELIEF_GROOVE
@ -3542,7 +3546,7 @@ SBar = StatusBar
class TKProgressBar():
uniqueness_counter = 0
def __init__(self, root, max, length=400, width=DEFAULT_PROGRESS_BAR_SIZE[1], style=DEFAULT_TTK_THEME,
def __init__(self, root, max, length=400, width=DEFAULT_PROGRESS_BAR_SIZE[1], ttk_theme=DEFAULT_TTK_THEME, style_name='',
relief=DEFAULT_PROGRESS_BAR_RELIEF, border_width=DEFAULT_PROGRESS_BAR_BORDER_WIDTH,
orientation='horizontal', BarColor=(None, None), key=None):
"""
@ -3554,8 +3558,10 @@ class TKProgressBar():
:type length: (int)
:param width: width in pixels of the bar
:type width: (int)
:param style: Progress bar style defined as one of these 'default', 'winnative', 'clam', 'alt', 'classic', 'vista', 'xpnative'
:type style: (str)
:param style_name: Progress bar style to use. Set in the packer function
:type style_name: (str)
:param ttk_theme: Progress bar style defined as one of these 'default', 'winnative', 'clam', 'alt', 'classic', 'vista', 'xpnative'
:type ttk_theme: (str)
:param relief: relief style. Values are same as progress meter relief values. Can be a constant or a string: `RELIEF_RAISED RELIEF_SUNKEN RELIEF_FLAT RELIEF_RIDGE RELIEF_GROOVE RELIEF_SOLID` (Default value = DEFAULT_PROGRESS_BAR_RELIEF)
:type relief: (str)
:param border_width: The amount of pixels that go around the outside of the bar
@ -3574,39 +3580,34 @@ class TKProgressBar():
self.Orientation = orientation
self.Count = None
self.PriorCount = 0
self.StyleName = ''
self.style_name = style_name
TKProgressBar.uniqueness_counter += 1
if orientation.lower().startswith('h'):
s = ttk.Style()
s.theme_use(style)
s.theme_use(ttk_theme)
self.style_name = str(key) + str(TKProgressBar.uniqueness_counter) + "my.Horizontal.TProgressbar"
if BarColor != COLOR_SYSTEM_DEFAULT:
# self.style_name = str(key) + str(TKProgressBar.uniqueness_counter) + "my.Horizontal.TProgressbar"
if BarColor != COLOR_SYSTEM_DEFAULT and BarColor[0] != COLOR_SYSTEM_DEFAULT:
s.configure(self.style_name, background=BarColor[0], troughcolor=BarColor[1],
troughrelief=relief, borderwidth=border_width, thickness=width)
else:
s.configure(self.style_name, troughrelief=relief, borderwidth=border_width,
thickness=width)
s.configure(self.style_name, troughrelief=relief, borderwidth=border_width, thickness=width)
self.TKProgressBarForReal = ttk.Progressbar(root, maximum=self.Max,
style=self.style_name, length=length,
orient=tk.HORIZONTAL, mode='determinate')
self.TKProgressBarForReal = ttk.Progressbar(root, maximum=self.Max, style=self.style_name, length=length, orient=tk.HORIZONTAL, mode='determinate')
else:
s = ttk.Style()
s.theme_use(style)
self.style_name = str(key) + str(TKProgressBar.uniqueness_counter) + "my.Vertical.TProgressbar"
if BarColor != COLOR_SYSTEM_DEFAULT:
s.theme_use(ttk_theme)
# self.style_name = str(key) + str(TKProgressBar.uniqueness_counter) + "my.Vertical.TProgressbar"
if BarColor != COLOR_SYSTEM_DEFAULT and BarColor[0] != COLOR_SYSTEM_DEFAULT:
s.configure(self.style_name, background=BarColor[0],
troughcolor=BarColor[1], troughrelief=relief, borderwidth=border_width, thickness=width)
else:
s.configure(self.style_name, troughrelief=relief,
borderwidth=border_width, thickness=width)
self.TKProgressBarForReal = ttk.Progressbar(root, maximum=self.Max,
style=self.style_name,
length=length, orient=tk.VERTICAL, mode='determinate')
s.configure(self.style_name, troughrelief=relief, borderwidth=border_width, thickness=width)
self.TKProgressBarForReal = ttk.Progressbar(root, maximum=self.Max, style=self.style_name, length=length, orient=tk.VERTICAL, mode='determinate')
def Update(self, count=None, max=None):
"""
@ -4624,16 +4625,12 @@ class ProgressBar(Element):
self.NotRunning = True
self.Orientation = orientation if orientation else DEFAULT_METER_ORIENTATION
self.RightClickMenu = right_click_menu
self.ttk_style_name = None # set in the pack function so can use in the update
# Progress Bar colors can be a tuple (text, background) or a string with format "bar on background" - examples "red on white" or ("red", "white")
if bar_color is None:
bar_color = DEFAULT_PROGRESS_BAR_COLOR
else:
try:
if isinstance(bar_color, str):
bar_color = bar_color.split(' on ')
except Exception as e:
print('* ProgressBar warning * you messed up with color formatting', e)
bar_color = _simplified_dual_color_to_tuple(bar_color, default=DEFAULT_PROGRESS_BAR_COLOR)
self.BarColor = bar_color # should be a tuple at this point
self.BarStyle = style if style else DEFAULT_TTK_THEME
@ -4673,7 +4670,7 @@ class ProgressBar(Element):
return False
return True
def update(self, current_count, max=None, visible=None):
def update(self, current_count=None, max=None, bar_color=None, visible=None):
"""
Changes some of the settings for the ProgressBar Element. Must call `Window.Read` or `Window.Finalize` prior
Now has the ability to modify the count so that the update_bar method is not longer needed separately
@ -4682,6 +4679,8 @@ class ProgressBar(Element):
:type current_count: (int)
:param max: changes the max value
:type max: (int)
:param bar_color: The 2 colors that make up a progress bar. Easy to remember which is which if you say "ON" between colors. "red" on "green".
:type bar_color: (str, str) or str
:param visible: control visibility of element
:type visible: (bool)
:return: Returns True if update was OK. False means something wrong with window or it was closed
@ -4699,8 +4698,14 @@ class ProgressBar(Element):
self.TKProgressBar.TKProgressBarForReal.pack(padx=self.pad_used[0], pady=self.pad_used[1])
if visible is not None:
self._visible = visible
if bar_color is not None:
bar_color = _simplified_dual_color_to_tuple(bar_color, default=DEFAULT_PROGRESS_BAR_COLOR)
self.BarColor = bar_color
style = ttk.Style()
style.configure(self.ttk_style_name, background=bar_color[0], troughcolor=bar_color[1])
if current_count is not None:
self.TKProgressBar.Update(current_count, max=max)
self.TKProgressBar.Update(current_count, max=max)
try:
self.ParentForm.TKroot.update()
except:
@ -6159,7 +6164,7 @@ class Tab(Element):
elif isinstance(image_source, str):
filename = image_source
else:
warnings.warn('Image element - source is not a valid type: {}'.format(type(source)), UserWarning)
warnings.warn('Image element - source is not a valid type: {}'.format(type(image_source)), UserWarning)
self.Filename = filename
self.Data = data
@ -8631,6 +8636,7 @@ class Window:
self._grab_anywhere_include_these_list = []
self._has_custom_titlebar = use_custom_titlebar
self._mousex = self._mousey = 0
self._startx = self._starty = 0
self.scaling = scaling if scaling is not None else DEFAULT_SCALING
if self.use_custom_titlebar:
self.Margins = (0, 0)
@ -12609,7 +12615,7 @@ def _simplified_dual_color_to_tuple(color_tuple_or_string, default=(None, None))
return (COLOR_SYSTEM_DEFAULT, COLOR_SYSTEM_DEFAULT)
text_color = background_color = COLOR_SYSTEM_DEFAULT
try:
if isinstance(color_tuple_or_string, tuple):
if isinstance(color_tuple_or_string, (tuple, list)):
if len(color_tuple_or_string) >= 2:
text_color = color_tuple_or_string[0] or default[0]
background_color = color_tuple_or_string[1] or default[1]
@ -12634,16 +12640,16 @@ def _simplified_dual_color_to_tuple(color_tuple_or_string, default=(None, None))
text_color, background_color = default
else:
if not SUPPRESS_ERROR_POPUPS:
_error_popup_with_traceback('** Badly formatted button color... not a tuple nor string **', color_tuple_or_string)
_error_popup_with_traceback('** Badly formatted dual-color... not a tuple nor string **', color_tuple_or_string)
else:
print('** Badly formatted button color... not a tuple nor string **', color_tuple_or_string)
text_color = background_color = COLOR_SYSTEM_DEFAULT
print('** Badly formatted dual-color... not a tuple nor string **', color_tuple_or_string)
text_color, background_color = default
except Exception as e:
if not SUPPRESS_ERROR_POPUPS:
_error_popup_with_traceback('** Badly formatted button color **', color_tuple_or_string, e)
else:
print('** Badly formatted button color... not a tuple nor string **', color_tuple_or_string, e)
text_color = background_color = COLOR_SYSTEM_DEFAULT
text_color, background_color = default
if isinstance(text_color, int):
text_color = "#%06X" % text_color
if isinstance(background_color, int):
@ -14392,10 +14398,15 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
bar_color = element.BarColor
else:
bar_color = DEFAULT_PROGRESS_BAR_COLOR
if element.Orientation.lower().startswith('h'):
base_style_name = ".Horizontal.TProgressbar"
else:
base_style_name = ".Vertical.TProgressbar"
style_name = _make_ttk_style_name(base_style_name, element)
element.TKProgressBar = TKProgressBar(tk_row_frame, element.MaxValue, progress_length, progress_width,
orientation=direction, BarColor=bar_color,
border_width=element.BorderWidth, relief=element.Relief,
style=toplevel_form.TtkTheme, key=element.Key)
ttk_theme=toplevel_form.TtkTheme, key=element.Key, style_name=style_name)
expand, fill, row_should_expand, row_fill_direction = _add_expansion(element, row_should_expand, row_fill_direction)
element.TKProgressBar.TKProgressBarForReal.pack(side=tk.LEFT, padx=elementpad[0], pady=elementpad[1], expand=expand, fill=fill)
if element.visible is False:
@ -19159,7 +19170,7 @@ def popup_animated(image_source, message=None, background_color=None, text_color
window = Window(title, layout, no_titlebar=no_titlebar, grab_anywhere=grab_anywhere,
keep_on_top=keep_on_top, background_color=background_color, location=location,
alpha_channel=alpha_channel, element_padding=(0, 0), margins=(0, 0),
transparent_color=transparent_color, finalize=True, element_justification='c', icon=icon)
transparent_color=transparent_color, finalize=True, element_justification='c', icon=icon, relative_location=relative_location)
Window._animated_popup_dict[image_source] = window
else:
window = Window._animated_popup_dict[image_source]
@ -19411,7 +19422,7 @@ def shell_with_animation(command, args=None, image_source=DEFAULT_BASE64_LOADING
while True:
popup_animated(image_source=image_source, message=message, time_between_frames=time_between_frames, transparent_color=transparent_color,
text_color=text_color, background_color=background_color, font=font, no_titlebar=no_titlebar, grab_anywhere=grab_anywhere,
keep_on_top=keep_on_top, location=location, relative_location=relative_location, alpha_channel=alpha_channel)
keep_on_top=keep_on_top, location=location, alpha_channel=alpha_channel)
thread.join(timeout=time_between_frames / 1000)
if not thread.is_alive():
break