From 6f4591cd316a5f380969147ea38fb934cc74e01f Mon Sep 17 00:00:00 2001 From: PySimpleGUI Date: Sat, 28 Aug 2021 11:55:57 -0400 Subject: [PATCH] Made ttk style names more unique so same keys can be used in multiple windows --- PySimpleGUI.py | 46 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/PySimpleGUI.py b/PySimpleGUI.py index e4dbf466..b63e54a9 100644 --- a/PySimpleGUI.py +++ b/PySimpleGUI.py @@ -1,6 +1,6 @@ #!/usr/bin/python3 -version = __version__ = "4.46.0.12 Unreleased" +version = __version__ = "4.46.0.13 Unreleased" """ Changelog since 4.46.0 release to PyPI on 10 Aug 2021 @@ -34,6 +34,10 @@ version = __version__ = "4.46.0.12 Unreleased" 4.46.0.12 Add NEW upgrade from GitHub code. Thank you @israel-dryer! Fix for Image.update docstring + 4.46.0.13 + Change in ttk style naming to ensure more unique style names are used + + """ __version__ = version.split()[0] # For PEP 396 and PEP 345 @@ -880,6 +884,7 @@ class Element(): self.TKText = None self.TKEntry = None self.TKImage = None + self.ttk_style_name = '' # set in the packer function self._metadata = None # type: Any @@ -3889,6 +3894,7 @@ class Button(Element): self.Disabled = disabled self.ChangeSubmits = change_submits or enable_events self.UseTtkButtons = use_ttk_buttons + self.ttk_style_name = '' # set in the packer function self._files_delimiter = BROWSE_FILES_DELIMITER # used by the file browse button. used when multiple files are selected by user if use_ttk_buttons is None and running_mac(): self.UseTtkButtons = True @@ -4156,7 +4162,8 @@ class Button(Element): return if self.UseTtkButtons: - style_name = str(self.Key) + 'custombutton.TButton' + style_name = self.ttk_style_name # created when made initial window (in the pack) + # style_name = str(self.Key) + 'custombutton.TButton' button_style = ttk.Style() if text is not None: self.TKButton.configure(text=text) @@ -8060,6 +8067,7 @@ class Window: _container_element_counter = 0 # used to get a number of Container Elements (Frame, Column, Tab) _read_call_from_debugger = False _timeout_0_counter = 0 # when timeout=0 then go through each window one at a time + _counter_for_ttk_widgets = 0 def __init__(self, title, layout=None, default_element_size=None, default_button_element_size=(None, None), @@ -12808,6 +12816,13 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form): # '\nValid choices include: {}'.format(style.theme_names())) return False + + def _make_ttk_style_name(base_style, element): + Window._counter_for_ttk_widgets += 1 + style_name = str(Window._counter_for_ttk_widgets) + (element.Key) + base_style + element.ttk_style_name = style_name + return style_name + def _add_right_click_menu(element): if element.RightClickMenu == MENU_RIGHT_CLICK_DISABLED: return @@ -13285,8 +13300,9 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form): tkbutton = element.Widget = ttk.Button(tk_row_frame, text=btext, width=width) tkbutton.bind('', element.ButtonReleaseCallBack) tkbutton.bind('', element.ButtonPressCallBack) - - style_name = str(element.Key) + 'custombutton.TButton' + # Window._counter_for_ttk_widgets += 1 + # style_name = str(Window._counter_for_ttk_widgets) + (element.Key) + 'custombutton.TButton' + style_name = _make_ttk_style_name('custombutton.TButton', element) button_style = ttk.Style() if _valid_theme(button_style, toplevel_form.TtkTheme): button_style.theme_use(toplevel_form.TtkTheme) @@ -13519,7 +13535,8 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form): else: width = max_line_len + 1 element.TKStringVar = tk.StringVar() - style_name = 'TCombobox' + style_name = _make_ttk_style_name('.TCombobox', element) + # style_name = 'TCombobox' s = ttk.Style() if _valid_theme(s, toplevel_form.TtkTheme): s.theme_use(toplevel_form.TtkTheme) @@ -13527,14 +13544,16 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form): if element.TextColor is not None and element.TextColor != COLOR_SYSTEM_DEFAULT: # Creates 1 style per Text Color/ Background Color combination - style_name = str(element.Key) + '.TCombobox' + # style_name = str(element.Key) + '.TCombobox' + combostyle = ttk.Style() if _valid_theme(combostyle, toplevel_form.TtkTheme): combostyle.theme_use(toplevel_form.TtkTheme) # Creates a unique name for each field element(Sure there is a better way to do this) + # unique_field = str(element.Key) + '.TCombobox.field' + unique_field = _make_ttk_style_name('.TCombobox.field', element) - unique_field = str(element.Key) + '.TCombobox.field' # Clones over the TCombobox.field element from the "alt" theme. # This is what will allow us to change the background color without altering the whole programs theme @@ -14143,7 +14162,8 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form): # ------------------------- TabGroup placement element ------------------------- # elif element_type == ELEM_TYPE_TAB_GROUP: element = element # type: TabGroup - custom_style = str(element.Key) + 'customtab.TNotebook' + # custom_style = str(element.Key) + 'customtab.TNotebook' + custom_style = _make_ttk_style_name('customtab.TNotebook', element) style = ttk.Style() style.theme_use(toplevel_form.TtkTheme) if element.TabLocation is not None: @@ -14319,7 +14339,9 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form): else: treeview.tag_configure(row_def[0], background=row_def[2], foreground=row_def[1]) # ------ Do Styling of Colors ----- - style_name = str(element.Key) + 'customtable.Treeview' + # style_name = str(element.Key) + 'customtable.Treeview' + style_name = _make_ttk_style_name( 'customtable.Treeview', element) + table_style = ttk.Style() table_style.theme_use(toplevel_form.TtkTheme) @@ -14453,7 +14475,8 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form): add_treeview_data(element.TreeData.root_node) treeview.column('#0', width=element.Col0Width * _char_width_in_pixels(font), anchor=anchor) # ----- configure colors ----- - style_name = str(element.Key) + '.Treeview' + # style_name = str(element.Key) + '.Treeview' + style_name = _make_ttk_style_name('.Treeview', element) tree_style = ttk.Style() tree_style.theme_use(toplevel_form.TtkTheme) if element.BackgroundColor is not None and element.BackgroundColor != COLOR_SYSTEM_DEFAULT: @@ -14500,7 +14523,8 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form): # ------------------------- Separator placement element ------------------------- # elif element_type == ELEM_TYPE_SEPARATOR: element = element # type: VerticalSeparator - style_name = str(element.Key) + "Line.TSeparator" + # style_name = str(element.Key) + "Line.TSeparator" + style_name = _make_ttk_style_name("Line.TSeparator", element) style = ttk.Style() style.theme_use(toplevel_form.TtkTheme) if element.color is not None: