Compute the background color of checkbox's box and radio button's circle

This commit is contained in:
PySimpleGUI 2019-12-31 19:27:10 -05:00
parent 68cf528a3a
commit da14e3517e
1 changed files with 30 additions and 23 deletions

View File

@ -1,6 +1,6 @@
#!/usr/bin/python3
version = __version__ = "4.14.1.5 Unreleased - blank Text element sized to default element size, added events for Calendar button but may remove, changed how bring_to_front works on Windows, SetIcon bug fix, Fix for closing window with X on Linux - requires update, allow progress bar values > max"
version = __version__ = "4.14.1.6 Unreleased - blank Text element sized to default element size, added events for Calendar button but may remove, changed how bring_to_front works on Windows, SetIcon bug fix, Fix for closing window with X on Linux - requires update, allow progress bar values > max, checkbox & radio color computation"
port = 'PySimpleGUI'
@ -342,7 +342,7 @@ def RGB(red, green, blue):
:param blue: (int) Blue portion from 0 to 255
:return: (str) A single RGB String in the format "#RRGGBB" where each pair is a hex number.
"""
return '#%02x%02x%02x' % (int(red), int(green), int(blue))
return '#%02x%02x%02x' % (min(int(red), 255), min(int(green),255), min(int(blue), 255))
# ====================================================================== #
@ -1439,7 +1439,19 @@ class Radio(Element):
self.GroupID = group_id
self.Value = None
self.Disabled = disabled
self.TextColor = text_color or DEFAULT_TEXT_COLOR
self.TextColor = text_color if text_color else theme_text_color()
# ---- compute color of circle background ---
try: # something in here will fail if a color is not specified in Hex
text_hsl = _hex_to_hsl(self.TextColor)
background_hsl = _hex_to_hsl(background_color if background_color else theme_background_color())
l_delta = abs(text_hsl[2] - background_hsl[2])/6
if text_hsl[2] > background_hsl[2]: # if the text is "lighter" than the background then make background darker
bg_rbg = _hsl_to_rgb(background_hsl[0], background_hsl[1], background_hsl[2]-l_delta)
else:
bg_rbg = _hsl_to_rgb(background_hsl[0], background_hsl[1],background_hsl[2]+l_delta)
self.CircleBackgroundColor = RGB(*bg_rbg)
except:
self.CircleBackgroundColor = background_color if background_color else theme_background_color()
self.ChangeSubmits = change_submits or enable_events
self.EncodedRadioValue = None
super().__init__(ELEM_TYPE_INPUT_RADIO, size=size, auto_size_text=auto_size_text, font=font,
@ -1535,24 +1547,19 @@ class Checkbox(Element):
self.TKCheckbutton = self.Widget = None # type: tk.Checkbutton
self.Disabled = disabled
self.TextColor = text_color if text_color else theme_text_color()
# print(f'text color = {self.TextColor}')
# text_hsl = _hex_to_hsl(self.TextColor)
# background_hsl = _hex_to_hsl(background_color if background_color else theme_background_color())
# background_hsv = _hsl_to_hsv(*background_hsl)
# background_rgb = _hsl_to_rgb(*background_hsl)
# print(f'backgroundHSL = {background_hsl} HSV = {background_hsv}')
# if text_hsl[2]> background_hsl[2]: # if the text is "lighter" than the background then make background darker
# print('Making Darker')
# l_delta = (text_hsl[2] - background_hsl[2])/6
# bg_rbg = _hsl_to_rgb(background_hsl[0], background_hsl[1], background_hsl[2])
# else:
# print('Making Lighter')
# l_delta = (background_hsl[2]-text_hsl[2])/6
# print(f'background V = {background_hsv[2]} delta = {l_delta}')
# bg_rbg = _hsl_to_rgb(background_hsl[0], background_hsl[1],background_hsl[2])
# checkbox_background_color = RGB(*bg_rbg)
# self.CheckboxBackgrounColor = checkbox_background_color
self.CheckboxBackgrounColor = background_color if background_color else theme_background_color()
# ---- compute color of circle background ---
try: # something in here will fail if a color is not specified in Hex
text_hsl = _hex_to_hsl(self.TextColor)
background_hsl = _hex_to_hsl(background_color if background_color else theme_background_color())
# print(f'backgroundHSL = {background_hsl}')
l_delta = abs(text_hsl[2] - background_hsl[2])/6
if text_hsl[2] > background_hsl[2]: # if the text is "lighter" than the background then make background darker
bg_rbg = _hsl_to_rgb(background_hsl[0], background_hsl[1], background_hsl[2]-l_delta)
else:
bg_rbg = _hsl_to_rgb(background_hsl[0], background_hsl[1],background_hsl[2]+l_delta)
self.CheckboxBackgroundColor = RGB(*bg_rbg)
except:
self.CheckboxBackgroundColor = background_color if background_color else theme_background_color()
self.ChangeSubmits = change_submits or enable_events
super().__init__(ELEM_TYPE_INPUT_CHECKBOX, size=size, auto_size_text=auto_size_text, font=font,
@ -8596,7 +8603,7 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
element.TKCheckbutton.configure(state='disable')
if element.BackgroundColor is not None and element.BackgroundColor != COLOR_SYSTEM_DEFAULT:
element.TKCheckbutton.configure(background=element.BackgroundColor)
element.TKCheckbutton.configure(selectcolor=element.CheckboxBackgrounColor) # The background of the checkbox
element.TKCheckbutton.configure(selectcolor=element.CheckboxBackgroundColor) # The background of the checkbox
element.TKCheckbutton.configure(activebackground=element.BackgroundColor)
if text_color is not None and text_color != COLOR_SYSTEM_DEFAULT:
element.TKCheckbutton.configure(fg=text_color)
@ -8660,7 +8667,7 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
bd=border_depth, font=font)
if not element.BackgroundColor in (None, COLOR_SYSTEM_DEFAULT):
element.TKRadio.configure(background=element.BackgroundColor)
element.TKRadio.configure(selectcolor=element.BackgroundColor)
element.TKRadio.configure(selectcolor=element.CircleBackgroundColor)
element.TKRadio.configure(activebackground=element.BackgroundColor)
if text_color is not None and text_color != COLOR_SYSTEM_DEFAULT:
element.TKRadio.configure(fg=text_color)