Merge pull request #6286 from PySimpleGUI/Dev-latest

Combo.update - added text and background color. Also made font parm w…
This commit is contained in:
PySimpleGUI 2023-03-09 05:43:37 -05:00 committed by GitHub
commit cd7967fe4a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 70 additions and 24 deletions

View File

@ -1,6 +1,6 @@
#!/usr/bin/python3 #!/usr/bin/python3
version = __version__ = "4.61.0.161 Unreleased" version = __version__ = "4.61.0.162 Unreleased"
_change_log = """ _change_log = """
Changelog since 4.60.0 released to PyPI on 8-May-2022 Changelog since 4.60.0 released to PyPI on 8-May-2022
@ -389,6 +389,8 @@ _change_log = """
Fix "Bold" crash from watermarking feature Fix "Bold" crash from watermarking feature
4.61.0.161 4.61.0.161
New set_options to control user-defined watermarks New set_options to control user-defined watermarks
4.61.0.162
Addition of new parms to Combo.update - text color, background color. Also font now applied correctly to dropdown list
""" """
__version__ = version.split()[0] # For PEP 396 and PEP 345 __version__ = version.split()[0] # For PEP 396 and PEP 345
@ -2624,7 +2626,7 @@ class Combo(Element):
super().__init__(ELEM_TYPE_INPUT_COMBO, size=sz, auto_size_text=auto_size_text, background_color=bg, super().__init__(ELEM_TYPE_INPUT_COMBO, size=sz, auto_size_text=auto_size_text, background_color=bg,
text_color=fg, key=key, pad=pad, tooltip=tooltip, font=font or DEFAULT_FONT, visible=visible, metadata=metadata) text_color=fg, key=key, pad=pad, tooltip=tooltip, font=font or DEFAULT_FONT, visible=visible, metadata=metadata)
def update(self, value=None, values=None, set_to_index=None, disabled=None, readonly=None, font=None, visible=None, size=(None, None), select=None): def update(self, value=None, values=None, set_to_index=None, disabled=None, readonly=None, font=None, visible=None, size=(None, None), select=None, text_color=None, background_color=None):
""" """
Changes some of the settings for the Combo Element. Must call `Window.Read` or `Window.Finalize` prior. Changes some of the settings for the Combo Element. Must call `Window.Read` or `Window.Finalize` prior.
Note that the state can be in 3 states only.... enabled, disabled, readonly even Note that the state can be in 3 states only.... enabled, disabled, readonly even
@ -2637,25 +2639,30 @@ class Combo(Element):
function "pin" to ensure your element is "pinned" to that location in your layout so that it returns there function "pin" to ensure your element is "pinned" to that location in your layout so that it returns there
when made visible. when made visible.
:param value: change which value is current selected based on new list of previous list of choices :param value: change which value is current selected based on new list of previous list of choices
:type value: (Any) :type value: (Any)
:param values: change list of choices :param values: change list of choices
:type values: List[Any] :type values: List[Any]
:param set_to_index: change selection to a particular choice starting with index = 0 :param set_to_index: change selection to a particular choice starting with index = 0
:type set_to_index: (int) :type set_to_index: (int)
:param disabled: disable or enable state of the element :param disabled: disable or enable state of the element
:type disabled: (bool) :type disabled: (bool)
:param readonly: if True make element readonly (user cannot change any choices). Enables the element if either choice are made. :param readonly: if True make element readonly (user cannot change any choices). Enables the element if either choice are made.
:type readonly: (bool) :type readonly: (bool)
:param font: specifies the font family, size, etc. Tuple or Single string format 'name size styles'. Styles: italic * roman bold normal underline overstrike :param font: specifies the font family, size, etc. Tuple or Single string format 'name size styles'. Styles: italic * roman bold normal underline overstrike
:type font: (str or (str, int[, str]) or None) :type font: (str or (str, int[, str]) or None)
:param visible: control visibility of element :param visible: control visibility of element
:type visible: (bool) :type visible: (bool)
:param size: width, height. Width = characters-wide, height = NOTE it's the number of entries to show in the list :param size: width, height. Width = characters-wide, height = NOTE it's the number of entries to show in the list
:type size: (int, int) :type size: (int, int)
:param select: if True, then the text will be selected, if False then selection will be cleared :param select: if True, then the text will be selected, if False then selection will be cleared
:type select: (bool) :type select: (bool)
:param background_color: color of background
:type background_color: (str)
:param text_color: color of the text
:type text_color: (str)
""" """
if size != (None, None): if size != (None, None):
if isinstance(size, int): if isinstance(size, int):
size = (size, 1) size = (size, 1)
@ -2720,8 +2727,44 @@ class Combo(Element):
elif disabled is False and self.Readonly is False: elif disabled is False and self.Readonly is False:
self.TKCombo['state'] = 'enable' self.TKCombo['state'] = 'enable'
self.Disabled = disabled if disabled is not None else self.Disabled self.Disabled = disabled if disabled is not None else self.Disabled
combostyle = self.ttk_style
style_name = self.ttk_style_name
if text_color is not None:
combostyle.configure(style_name, foreground=text_color)
combostyle.configure(style_name, selectbackground=text_color)
combostyle.configure(style_name, insertcolor=text_color)
combostyle.map(style_name, fieldforeground=[('readonly', text_color)])
self.TextColor = text_color
if background_color is not None:
combostyle.configure(style_name, selectforeground=background_color)
combostyle.map(style_name, fieldbackground=[('readonly', background_color)])
combostyle.configure(style_name, fieldbackground=background_color)
self.BackgroundColor = background_color
if self.Readonly is True:
if text_color not in (None, COLOR_SYSTEM_DEFAULT):
combostyle.configure(style_name, selectforeground=text_color)
if background_color not in (None, COLOR_SYSTEM_DEFAULT):
combostyle.configure(style_name, selectbackground=background_color)
if font is not None: if font is not None:
self.Font = font
self.TKCombo.configure(font=font) self.TKCombo.configure(font=font)
self._dropdown_newfont = tkinter.font.Font(font=font)
self.ParentRowFrame.option_add("*TCombobox*Listbox*Font", self._dropdown_newfont)
# make tcl call to deal with colors for the drop-down formatting
try:
if self.BackgroundColor not in (None, COLOR_SYSTEM_DEFAULT) and \
self.TextColor not in (None, COLOR_SYSTEM_DEFAULT):
self.Widget.tk.eval(
'[ttk::combobox::PopdownWindow {}].f.l configure -foreground {} -background {} -selectforeground {} -selectbackground {} -font {}'.format(self.Widget, self.TextColor, self.BackgroundColor, self.BackgroundColor, self.TextColor, self._dropdown_newfont))
except Exception as e:
pass # going to let this one slide
if visible is False: if visible is False:
self._pack_forget_save_settings() self._pack_forget_save_settings()
# self.TKCombo.pack_forget() # self.TKCombo.pack_forget()
@ -2735,6 +2778,7 @@ class Combo(Element):
elif select is False: elif select is False:
self.TKCombo.select_clear() self.TKCombo.select_clear()
def get(self): def get(self):
""" """
Returns the current (right now) value of the Combo. DO NOT USE THIS AS THE NORMAL WAY OF READING A COMBO! Returns the current (right now) value of the Combo. DO NOT USE THIS AS THE NORMAL WAY OF READING A COMBO!
@ -10027,6 +10071,8 @@ class Window:
_original_stderr = None _original_stderr = None
_watermark = None _watermark = None
_watermark_temp_forced = False _watermark_temp_forced = False
_watermark_user_text = ''
def __init__(self, title, layout=None, default_element_size=None, def __init__(self, title, layout=None, default_element_size=None,
default_button_element_size=(None, None), default_button_element_size=(None, None),
auto_size_text=None, auto_size_buttons=None, location=(None, None), relative_location=(None, None), size=(None, None), auto_size_text=None, auto_size_buttons=None, location=(None, None), relative_location=(None, None), size=(None, None),
@ -16619,8 +16665,8 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form):
"Parent Window's Title: {}".format(toplevel_form.Title)) "Parent Window's Title: {}".format(toplevel_form.Title))
# Strange code that is needed to set the font for the drop-down list # Strange code that is needed to set the font for the drop-down list
element._newfont = tkinter.font.Font(font=font) element._dropdown_newfont = tkinter.font.Font(font=font)
tk_row_frame.option_add("*TCombobox*Listbox*Font", element._newfont) tk_row_frame.option_add("*TCombobox*Listbox*Font", element._dropdown_newfont)
element.TKCombo = element.Widget = ttk.Combobox(tk_row_frame, width=width, textvariable=element.TKStringVar, font=font, style=style_name) element.TKCombo = element.Widget = ttk.Combobox(tk_row_frame, width=width, textvariable=element.TKStringVar, font=font, style=style_name)
@ -19430,7 +19476,7 @@ def set_options(icon=None, button_color=None, element_size=(None, None), button_
DEFAULT_USE_BUTTON_SHORTCUTS = use_button_shortcuts DEFAULT_USE_BUTTON_SHORTCUTS = use_button_shortcuts
if watermark_text is not None: if watermark_text is not None:
pysimplegui_user_settings.set('-watermark user text-', watermark_text) Window._watermark_user_text = watermark_text
return True return True
@ -26429,4 +26475,4 @@ if __name__ == '__main__':
exit(0) exit(0)
main() main()
exit(0) exit(0)
#0ca08f0f911461d1d3ae002c055cdf86ca5d243565b37eef48a6b3e02a3e917ab3af8d7317296be3d6074b3257e506129a87b27b5ac89ab40f1ff33fbb907e4d32f218f30eb86903bcf017466d2291a534180cc363996ebac425524929e3caebd4d524524f380c2471d7497ac7f62df5a3525cbd9ebff46b6dcca3caf749c5c6e32b3697685a524169887216d4b24c66760e31c4b92f52e15c00a4adbf0b66b2b474fc8883def17a066b98ce9c0839f6c7900a4df01b49321b8410894264a7dd24babe7a66556ce725d0fe18810ba616e777c8db14978e56679262ef41c917dc52a2454b4926c52aa8c4415f86b824dbaadb89c15b020de386d263e13b609cd26a76925840970bcfb198ecc165609780d9fc24453a25d917254404251a69aa68b4503f761d5cdedbcb68ab281be964d1e04182d8f87135648a71b25a9655d02662593556b55f79d60109151403a478d4824c09264fb2b5b056b4fa57fbf7c391cf746c48ec98da618a509b2a72434d86c92c10961c85744c6172b37a183b3553299ae092a265764bf85d3d6c061f86dbf3c64c089bfa6f570beda30138c8c3427fe97b4a9c9b80571e7c67f718723f802d8d1959378b26df664ec7e1b0176c5cfbedb6f8d0280298633304d18bfdf3fd5d7900182bc47414d3b2ab7624f9756c33332e022160f619a0df34df54aebba8dc622b1cc68cb05807dd31372009363a #0f39d7ccc690f323707b2c591286af1aa7833c959432b3478340c6818dff6f76095f647e438ccdd3bccf0b24b1ea4f2e65b3dd131346e60e564361f2638b765cc96144915a9e22af993eec69165cee78a4234a49360501170277d846db7b9d1503e1c73f55252cb82865bd79554d67a769ddb860d568c93e202e0944b5676ed64dabc0373a6ed98c283c8e91980b43e7b2ce817dae72ab7fc4199949f34e8953f7b8f17a3fefda65baeb53f49c8d55896f2402675298a42f3a0ffb8046b58c26e52fb40ec9118b8c7d369f75e77e6c91d95f9db37462e0f62b9a10cf98ac7cfe769235ce6310136ec9c88c22332ca877bfb8508c26b39a94b6b0c90160692d4756569aba1ff4ce0115840d145bf6b509b8de50fba63f56509ebb72401337697e6b9bb2d669e4e28210f5e753db71bd97432dc55759d0251346b5239d6c4f120d56141c1e7f8269c0dc4bcfac73ee79dd2b8d70f4049a5f93554bd87b246708c808ae1dc3f2bfb224ee6479824b3c1b653ed1c5918198670840d02e3eb2162319049dd1bf486492fb202fc87810127bc3f00770ba7b7251b7f33880b02284bf9e103428186576d28f89e6749e4f4dea026ef740528d21ab022858ab0f78b08186d9c919e5ea02b819c9934670f8437f869ba5026de5e0321030b9d863cb0b1b5e33c3e91f6e14034d89ecb13210ffaa6d23cb910bd8cbd33457a588a4c3c52439