From 2629723e3248158f9d5c3e219ff8e10097a55dbd Mon Sep 17 00:00:00 2001
From: MikeTheWatchGuy <mike_barnett@hotmail.com>
Date: Thu, 29 Nov 2018 11:46:56 -0500
Subject: [PATCH 1/2] Menu keys! Menu updates!  New enable_events parm for all
 elements

---
 PySimpleGUI.py | 140 ++++++++++++++++++++++++++++++-------------------
 1 file changed, 86 insertions(+), 54 deletions(-)

diff --git a/PySimpleGUI.py b/PySimpleGUI.py
index 71b9c34b..57b36ef1 100644
--- a/PySimpleGUI.py
+++ b/PySimpleGUI.py
@@ -184,6 +184,7 @@ TIMEOUT_KEY = '__TIMEOUT__'
 WRITE_ONLY_KEY = '__WRITE ONLY__'
 
 MENU_DISABLED_CHARACTER = '!'
+MENU_KEY_SEPARATOR = '::'
 
 
 # a shameful global variable. This represents the top-level window information. Needed because opening a second window is different than opening the first.
@@ -484,7 +485,7 @@ class Element():
 class InputText(Element):
     def __init__(self, default_text='', size=(None, None), disabled=False, password_char='',
                  justification=None, background_color=None, text_color=None, font=None, tooltip=None,
-                 change_submits=False,
+                 change_submits=False, enable_events=False,
                  do_not_clear=False, key=None, focus=False, pad=None):
         '''
         Input a line of text Element
@@ -501,7 +502,7 @@ class InputText(Element):
         self.do_not_clear = do_not_clear
         self.Justification = justification
         self.Disabled = disabled
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
         super().__init__(ELEM_TYPE_INPUT_TEXT, size=size, background_color=bg, text_color=fg, key=key, pad=pad,
                          font=font, tooltip=tooltip)
 
@@ -545,7 +546,7 @@ Input = InputText
 # ---------------------------------------------------------------------- #
 class InputCombo(Element):
     def __init__(self, values, default_value=None, size=(None, None), auto_size_text=None, background_color=None,
-                 text_color=None, change_submits=False, disabled=False, key=None, pad=None, tooltip=None,
+                 text_color=None, change_submits=False, enable_events=False, disabled=False, key=None, pad=None, tooltip=None,
                  readonly=False, font=None):
         '''
         Input Combo Box Element (also called Dropdown box)
@@ -556,7 +557,7 @@ class InputCombo(Element):
         '''
         self.Values = values
         self.DefaultValue = default_value
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
         self.TKCombo = None
         # self.InitializeAsDisabled = disabled
         self.Disabled = disabled
@@ -677,9 +678,7 @@ InputOptionMenu = OptionMenu
 #                           Listbox                                      #
 # ---------------------------------------------------------------------- #
 class Listbox(Element):
-    def __init__(self, values, default_values=None, select_mode=None, change_submits=False, bind_return_key=False,
-                 size=(None, None), disabled=False, auto_size_text=None, font=None, background_color=None,
-                 text_color=None, key=None, pad=None, tooltip=None):
+    def __init__(self, values, default_values=None, select_mode=None, change_submits=False,enable_events=False, bind_return_key=False, size=(None, None), disabled=False, auto_size_text=None, font=None, background_color=None, text_color=None, key=None, pad=None, tooltip=None):
         '''
         Listbox Element
         :param values:
@@ -700,7 +699,7 @@ class Listbox(Element):
         self.Values = values
         self.DefaultValues = default_values
         self.TKListbox = None
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
         self.BindReturnKey = bind_return_key
         self.Disabled = disabled
         if select_mode == LISTBOX_SELECT_MODE_BROWSE:
@@ -758,7 +757,7 @@ class Listbox(Element):
 # ---------------------------------------------------------------------- #
 class Radio(Element):
     def __init__(self, text, group_id, default=False, disabled=False, size=(None, None), auto_size_text=None,
-                 background_color=None, text_color=None, font=None, key=None, pad=None, tooltip=None, change_submits=False):
+                 background_color=None, text_color=None, font=None, key=None, pad=None, tooltip=None, change_submits=False, enable_events=False):
         '''
         Radio Button Element
         :param text:
@@ -782,7 +781,7 @@ class Radio(Element):
         self.Value = None
         self.Disabled = disabled
         self.TextColor = text_color or DEFAULT_TEXT_COLOR
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
 
         super().__init__(ELEM_TYPE_INPUT_RADIO, size=size, auto_size_text=auto_size_text, font=font,
                          background_color=background_color, text_color=self.TextColor, key=key, pad=pad,
@@ -814,7 +813,7 @@ class Radio(Element):
 # ---------------------------------------------------------------------- #
 class Checkbox(Element):
     def __init__(self, text, default=False, size=(None, None), auto_size_text=None, font=None, background_color=None,
-                 text_color=None, change_submits=False, disabled=False, key=None, pad=None, tooltip=None):
+                 text_color=None, change_submits=False,enable_events=False, disabled=False, key=None, pad=None, tooltip=None):
         '''
         Checkbox Element
         :param text:
@@ -836,7 +835,7 @@ class Checkbox(Element):
         self.TKCheckbutton = None
         self.Disabled = disabled
         self.TextColor = text_color if text_color else DEFAULT_TEXT_COLOR
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
 
         super().__init__(ELEM_TYPE_INPUT_CHECKBOX, size=size, auto_size_text=auto_size_text, font=font,
                          background_color=background_color, text_color=self.TextColor, key=key, pad=pad,
@@ -874,7 +873,7 @@ Check = Checkbox
 class Spin(Element):
     # Values = None
     # TKSpinBox = None
-    def __init__(self, values, initial_value=None, disabled=False, change_submits=False, size=(None, None),
+    def __init__(self, values, initial_value=None, disabled=False, change_submits=False,enable_events=False , size=(None, None),
                  auto_size_text=None, font=None, background_color=None, text_color=None, key=None, pad=None,
                  tooltip=None):
         '''
@@ -894,7 +893,7 @@ class Spin(Element):
         '''
         self.Values = values
         self.DefaultValue = initial_value
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
         self.TKSpinBox = None
         self.Disabled = disabled
         bg = background_color if background_color else DEFAULT_INPUT_ELEMENTS_COLOR
@@ -945,7 +944,7 @@ class Spin(Element):
 # ---------------------------------------------------------------------- #
 class Multiline(Element):
     def __init__(self, default_text='', enter_submits=False, disabled=False, autoscroll=False, size=(None, None),
-                 auto_size_text=None, background_color=None, text_color=None, change_submits=False, do_not_clear=False, key=None, focus=False,
+                 auto_size_text=None, background_color=None, text_color=None, change_submits=False, enable_events=False,do_not_clear=False, key=None, focus=False,
                  font=None, pad=None, tooltip=None):
         '''
         Multiline Element
@@ -972,7 +971,7 @@ class Multiline(Element):
         fg = text_color if text_color is not None else DEFAULT_INPUT_TEXT_COLOR
         self.Autoscroll = autoscroll
         self.Disabled = disabled
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
 
         super().__init__(ELEM_TYPE_INPUT_MULTILINE, size=size, auto_size_text=auto_size_text, background_color=bg,
                          text_color=fg, key=key, pad=pad, tooltip=tooltip, font=font or DEFAULT_FONT)
@@ -1018,8 +1017,7 @@ class Multiline(Element):
 #                                       Text                             #
 # ---------------------------------------------------------------------- #
 class Text(Element):
-    def __init__(self, text, size=(None, None), auto_size_text=None, click_submits=None, relief=None, font=None,
-                 text_color=None, background_color=None, justification=None, pad=None, key=None, tooltip=None):
+    def __init__(self, text, size=(None, None), auto_size_text=None, click_submits=False, enable_events=False, relief=None, font=None, text_color=None, background_color=None, justification=None, pad=None, key=None, tooltip=None):
         '''
         Text Element
         :param text:
@@ -1039,7 +1037,7 @@ class Text(Element):
         self.TextColor = text_color if text_color else DEFAULT_TEXT_COLOR
         self.Justification = justification
         self.Relief = relief
-        self.ClickSubmits = click_submits
+        self.ClickSubmits = click_submits or enable_events
         if background_color is None:
             bg = DEFAULT_TEXT_ELEMENT_BACKGROUND_COLOR
         else:
@@ -1074,7 +1072,7 @@ T = Text
 #                                       StatusBar                        #
 # ---------------------------------------------------------------------- #
 class StatusBar(Element):
-    def __init__(self, text, size=(None, None), auto_size_text=None, click_submits=None, relief=RELIEF_SUNKEN, font=None,
+    def __init__(self, text, size=(None, None), auto_size_text=None, click_submits=None, enable_events=False, relief=RELIEF_SUNKEN, font=None,
                  text_color=None, background_color=None, justification=None, pad=None, key=None, tooltip=None):
         '''
         Text Element
@@ -1095,7 +1093,7 @@ class StatusBar(Element):
         self.TextColor = text_color if text_color else DEFAULT_TEXT_COLOR
         self.Justification = justification
         self.Relief = relief
-        self.ClickSubmits = click_submits
+        self.ClickSubmits = click_submits or enable_events
         if background_color is None:
             bg = DEFAULT_TEXT_ELEMENT_BACKGROUND_COLOR
         else:
@@ -1285,7 +1283,7 @@ class Output(Element):
 # ---------------------------------------------------------------------- #
 class Button(Element):
     def __init__(self, button_text='', button_type=BUTTON_TYPE_READ_FORM, target=(None, None), tooltip=None,
-                 file_types=(("ALL Files", "*.*"),), initial_folder=None, disabled=False, change_submits=False, image_filename=None, image_data=None, image_size=(None, None), image_subsample=None, border_width=None, size=(None, None), auto_size_button=None, button_color=None, font=None, bind_return_key=False, focus=False, pad=None, key=None):
+                 file_types=(("ALL Files", "*.*"),), initial_folder=None, disabled=False, change_submits=False, enable_events=False, image_filename=None, image_data=None, image_size=(None, None), image_subsample=None, border_width=None, size=(None, None), auto_size_button=None, button_color=None, font=None, bind_return_key=False, focus=False, pad=None, key=None):
         '''
         Button Element
         :param button_text:
@@ -1329,7 +1327,7 @@ class Button(Element):
         self.DefaultDate_M_D_Y = (None, None, None)
         self.InitialFolder = initial_folder
         self.Disabled = disabled
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
 
         super().__init__(ELEM_TYPE_BUTTON, size=size, font=font, pad=pad, key=key, tooltip=tooltip)
         return
@@ -1639,7 +1637,7 @@ class Canvas(Element):
 #                           Graph                                        #
 # ---------------------------------------------------------------------- #
 class Graph(Element):
-    def __init__(self, canvas_size, graph_bottom_left, graph_top_right, background_color=None, pad=None, change_submits=False, drag_submits=False, key=None,
+    def __init__(self, canvas_size, graph_bottom_left, graph_top_right, background_color=None, pad=None, change_submits=False, drag_submits=False, enable_events=False, key=None,
                  tooltip=None):
         '''
         Graph Element
@@ -1656,7 +1654,7 @@ class Graph(Element):
         self.TopRight = graph_top_right
         self._TKCanvas = None
         self._TKCanvas2 = None
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
         self.DragSubmits = drag_submits
         self.ClickPosition = (None, None)
         self.MouseButtonDown = False
@@ -2036,7 +2034,7 @@ class Tab(Element):
 # ---------------------------------------------------------------------- #
 class TabGroup(Element):
     def __init__(self, layout, tab_location=None, title_color=None, selected_title_color=None, background_color=None,
-                 font=None, change_submits=False, pad=None, border_width=None, theme=None, key=None, tooltip=None):
+                 font=None, change_submits=False, enable_events=False,pad=None, border_width=None, theme=None, key=None, tooltip=None):
         '''
         TabGroup Element
         :param layout:
@@ -2065,7 +2063,7 @@ class TabGroup(Element):
         self.BorderWidth = border_width
         self.Theme = theme
         self.BackgroundColor = background_color if background_color is not None else DEFAULT_BACKGROUND_COLOR
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
         self.TabLocation = tab_location
 
         self.Layout(layout)
@@ -2118,7 +2116,7 @@ class TabGroup(Element):
 # ---------------------------------------------------------------------- #
 class Slider(Element):
     def __init__(self, range=(None, None), default_value=None, resolution=None, tick_interval=None, orientation=None,
-                 border_width=None, relief=None, change_submits=False, disabled=False, size=(None, None), font=None,
+                 border_width=None, relief=None, change_submits=False, enable_events=False, disabled=False, size=(None, None), font=None,
                  background_color=None, text_color=None, key=None, pad=None, tooltip=None):
         '''
         Slider Element
@@ -2145,7 +2143,7 @@ class Slider(Element):
         self.BorderWidth = border_width if border_width else DEFAULT_SLIDER_BORDER_WIDTH
         self.Relief = relief if relief else DEFAULT_SLIDER_RELIEF
         self.Resolution = 1 if resolution is None else resolution
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
         self.Disabled = disabled
         self.TickInterval = tick_interval
         temp_size = size
@@ -2579,6 +2577,29 @@ class Menu(Element):
         if self.ParentForm.CurrentlyRunningMainloop:
             self.ParentForm.TKroot.quit()  # kick the users out of the mainloop
 
+
+    def Update(self, menu_definition):
+        self.MenuDefinition = menu_definition
+        self.TKMenu = tk.Menu(self.ParentForm.TKroot, tearoff=self.Tearoff)  # create the menubar
+        menubar = self.TKMenu
+        for menu_entry in menu_definition:
+            # print(f'Adding a Menubar ENTRY {menu_entry}')
+            baritem = tk.Menu(menubar, tearoff=self.Tearoff)
+            pos = menu_entry[0].find('&')
+            # print(pos)
+            if pos != -1:
+                if pos == 0 or menu_entry[0][pos - 1] != "\\":
+                    menu_entry[0] = menu_entry[0][:pos] + menu_entry[0][pos + 1:]
+            if menu_entry[0][0] == MENU_DISABLED_CHARACTER:
+                menubar.add_cascade(label=menu_entry[0][len(MENU_DISABLED_CHARACTER):], menu=baritem, underline=pos)
+                menubar.entryconfig(menu_entry[0][len(MENU_DISABLED_CHARACTER):], state='disabled')
+            else:
+                menubar.add_cascade(label=menu_entry[0], menu=baritem, underline=pos)
+
+            if len(menu_entry) > 1:
+                AddMenuItem(baritem, menu_entry[1], self)
+        self.ParentForm.TKroot.configure(menu=self.TKMenu)
+
     def __del__(self):
         super().__del__()
 
@@ -2590,7 +2611,7 @@ class Table(Element):
     def __init__(self, values, headings=None, visible_column_map=None, col_widths=None, def_col_width=10,
                  auto_size_columns=True, max_col_width=20, select_mode=None, display_row_numbers=False, num_rows=None,
                  font=None, justification='right', text_color=None, background_color=None, alternating_row_color=None,
-                 size=(None, None), change_submits=False, bind_return_key=False, pad=None, key=None, tooltip=None):
+                 size=(None, None), change_submits=False, enable_events=False, bind_return_key=False, pad=None, key=None, tooltip=None):
         '''
         Table Element
         :param values:
@@ -2628,7 +2649,7 @@ class Table(Element):
         self.TKTreeview = None
         self.AlternatingRowColor = alternating_row_color
         self.SelectedRows = []
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
         self.BindReturnKey = bind_return_key
         self.StartingRowNumber = 0                  # When displaying row numbers, where to start
         self.RowHeaderText = 'Row'
@@ -2690,7 +2711,7 @@ class Table(Element):
 # ---------------------------------------------------------------------- #
 class Tree(Element):
     def __init__(self, data=None, headings=None, visible_column_map=None, col_widths=None, col0_width=10,
-                 def_col_width=10, auto_size_columns=True, max_col_width=20, select_mode=None, show_expanded=False, change_submits=False, font=None,
+                 def_col_width=10, auto_size_columns=True, max_col_width=20, select_mode=None, show_expanded=False, change_submits=False, enable_events=False, font=None,
                  justification='right', text_color=None, background_color=None, num_rows=None, pad=None, key=None,
                  tooltip=None):
         '''
@@ -2728,7 +2749,7 @@ class Tree(Element):
         self.Col0Width = col0_width
         self.TKTreeview = None
         self.SelectedRows = []
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
 
         super().__init__(ELEM_TYPE_TREE, text_color=text_color, background_color=background_color, font=font, pad=pad,
                          key=key, tooltip=tooltip)
@@ -2960,12 +2981,13 @@ class Window:
         return self
 
     def LayoutAndRead(self, rows, non_blocking=False):
-        self.AddRows(rows)
-        self.Show(non_blocking=non_blocking)
-        return self.ReturnValues
+        raise DeprecationWarning('LayoutAndRead is no longer supported... change your call window.Layout(layout).Read()')
+        # self.AddRows(rows)
+        # self.Show(non_blocking=non_blocking)
+        # return self.ReturnValues
 
     def LayoutAndShow(self, rows):
-        raise DeprecationWarning('LayoutAndShow is no longer supported... change your call to LayoutAndRead')
+        raise DeprecationWarning('LayoutAndShow is no longer supported... ')
 
     # ------------------------- ShowForm   THIS IS IT! ------------------------- #
     def Show(self, non_blocking=False):
@@ -3420,10 +3442,10 @@ FlexForm = Window
 
 # -------------------------  FOLDER BROWSE Element lazy function  ------------------------- #
 def FolderBrowse(button_text='Browse', target=(ThisRow, -1), initial_folder=None, tooltip=None, size=(None, None),
-                 auto_size_button=None, button_color=None, disabled=False, change_submits=False, font=None, pad=None, key=None):
+                 auto_size_button=None, button_color=None, disabled=False, change_submits=False, enable_events=False,font=None, pad=None, key=None):
     return Button(button_text=button_text, button_type=BUTTON_TYPE_BROWSE_FOLDER, target=target,
                   initial_folder=initial_folder, tooltip=tooltip, size=size, auto_size_button=auto_size_button,
-                  disabled=disabled, button_color=button_color,change_submits=change_submits, font=font, pad=pad, key=key)
+                  disabled=disabled, button_color=button_color,change_submits=change_submits, enable_events=enable_events, font=font, pad=pad, key=key)
 
 
 # -------------------------  FILE BROWSE Element lazy function  ------------------------- #
@@ -3431,34 +3453,34 @@ def FileBrowse(button_text='Browse', target=(ThisRow, -1), file_types=(("ALL Fil
                tooltip=None, size=(None, None), auto_size_button=None, button_color=None, change_submits=False, font=None, disabled=False,
                pad=None, key=None):
     return Button(button_text=button_text, button_type=BUTTON_TYPE_BROWSE_FILE, target=target, file_types=file_types,
-                  initial_folder=initial_folder, tooltip=tooltip, size=size, auto_size_button=auto_size_button, change_submits=change_submits, disabled=disabled, button_color=button_color, font=font, pad=pad, key=key)
+                  initial_folder=initial_folder, tooltip=tooltip, size=size, auto_size_button=auto_size_button, change_submits=change_submits, enable_events=enable_events, disabled=disabled, button_color=button_color, font=font, pad=pad, key=key)
 
 
 # -------------------------  FILES BROWSE Element (Multiple file selection) lazy function  ------------------------- #
 def FilesBrowse(button_text='Browse', target=(ThisRow, -1), file_types=(("ALL Files", "*.*"),), disabled=False,
-                initial_folder=None, tooltip=None, size=(None, None), auto_size_button=None, button_color=None, change_submits=False,
+                initial_folder=None, tooltip=None, size=(None, None), auto_size_button=None, button_color=None, change_submits=False,enable_events=False,
                 font=None, pad=None, key=None):
     return Button(button_text=button_text, button_type=BUTTON_TYPE_BROWSE_FILES, target=target, file_types=file_types,
-                  initial_folder=initial_folder,change_submits=change_submits, tooltip=tooltip, size=size, auto_size_button=auto_size_button,
+                  initial_folder=initial_folder,change_submits=change_submits, enable_events=enable_events, tooltip=tooltip, size=size, auto_size_button=auto_size_button,
                   disabled=disabled, button_color=button_color, font=font, pad=pad, key=key)
 
 
 # -------------------------  FILE BROWSE Element lazy function  ------------------------- #
 def FileSaveAs(button_text='Save As...', target=(ThisRow, -1), file_types=(("ALL Files", "*.*"),), initial_folder=None,
-               disabled=False, tooltip=None, size=(None, None), auto_size_button=None, button_color=None, change_submits=False, font=None,
+               disabled=False, tooltip=None, size=(None, None), auto_size_button=None, button_color=None, change_submits=False, enable_events=False, font=None,
                pad=None, key=None):
     return Button(button_text=button_text, button_type=BUTTON_TYPE_SAVEAS_FILE, target=target, file_types=file_types,
                   initial_folder=initial_folder, tooltip=tooltip, size=size, disabled=disabled,
-                  auto_size_button=auto_size_button, button_color=button_color, change_submits=change_submits, font=font, pad=pad, key=key)
+                  auto_size_button=auto_size_button, button_color=button_color, change_submits=change_submits, enable_events=enable_events, font=font, pad=pad, key=key)
 
 
 # -------------------------  SAVE AS Element lazy function  ------------------------- #
 def SaveAs(button_text='Save As...', target=(ThisRow, -1), file_types=(("ALL Files", "*.*"),), initial_folder=None,
-           disabled=False, tooltip=None, size=(None, None), auto_size_button=None, button_color=None, change_submits=False, font=None,
+           disabled=False, tooltip=None, size=(None, None), auto_size_button=None, button_color=None, change_submits=False, enable_events=False, font=None,
            pad=None, key=None):
     return Button(button_text=button_text, button_type=BUTTON_TYPE_SAVEAS_FILE, target=target, file_types=file_types,
                   initial_folder=initial_folder, tooltip=tooltip, size=size, disabled=disabled,
-                  auto_size_button=auto_size_button, button_color=button_color, change_submits=change_submits, font=font, pad=pad, key=key)
+                  auto_size_button=auto_size_button, button_color=button_color, change_submits=change_submits,  enable_events=enable_events,font=font, pad=pad, key=key)
 
 
 # -------------------------  SAVE BUTTON Element lazy function  ------------------------- #
@@ -3964,12 +3986,17 @@ if sys.version_info[0] >= 3:
                 if sub_menu_info == '---':
                     top_menu.add('separator')
                 else:
-                    if sub_menu_info[0] == MENU_DISABLED_CHARACTER:
-                        top_menu.add_command(label=sub_menu_info[len(MENU_DISABLED_CHARACTER):], underline=pos,
+                    try:
+                        item_without_key = sub_menu_info[:sub_menu_info.index(MENU_KEY_SEPARATOR)]
+                    except:
+                        item_without_key = sub_menu_info
+
+                    if item_without_key[0] == MENU_DISABLED_CHARACTER:
+                        top_menu.add_command(label=item_without_key[len(MENU_DISABLED_CHARACTER):], underline=pos,
                                              command=lambda: Menu.MenuItemChosenCallback(element, sub_menu_info))
-                        top_menu.entryconfig(sub_menu_info[len(MENU_DISABLED_CHARACTER):], state='disabled')
+                        top_menu.entryconfig(item_without_key[len(MENU_DISABLED_CHARACTER):], state='disabled')
                     else:
-                        top_menu.add_command(label=sub_menu_info, underline=pos,
+                        top_menu.add_command(label=item_without_key, underline=pos,
                                          command=lambda: Menu.MenuItemChosenCallback(element, sub_menu_info))
         else:
             i = 0
@@ -4005,12 +4032,17 @@ else:
                 if sub_menu_info == '---':
                     top_menu.add('separator')
                 else:
-                    if sub_menu_info[0] == MENU_DISABLED_CHARACTER:
-                        top_menu.add_command(label=sub_menu_info[len(MENU_DISABLED_CHARACTER):], underline=pos,
+                    try:
+                        item_without_key = sub_menu_info[:sub_menu_info.index(MENU_KEY_SEPARATOR)]
+                    except:
+                        item_without_key = sub_menu_info
+
+                    if item_without_key[0] == MENU_DISABLED_CHARACTER:
+                        top_menu.add_command(label=item_without_key[len(MENU_DISABLED_CHARACTER):], underline=pos,
                                              command=lambda: Menu.MenuItemChosenCallback(element, sub_menu_info))
-                        top_menu.entryconfig(sub_menu_info[len(MENU_DISABLED_CHARACTER):], state='disabled')
+                        top_menu.entryconfig(item_without_key[len(MENU_DISABLED_CHARACTER):], state='disabled')
                     else:
-                        top_menu.add_command(label=sub_menu_info, underline=pos,
+                        top_menu.add_command(label=item_without_key, underline=pos,
                                          command=lambda: Menu.MenuItemChosenCallback(element, sub_menu_info))
         else:
             i = 0

From ff93dd92e7d3d7a5755276c9c3ea2a58834e87e5 Mon Sep 17 00:00:00 2001
From: MikeTheWatchGuy <mike_barnett@hotmail.com>
Date: Thu, 29 Nov 2018 11:48:43 -0500
Subject: [PATCH 2/2] New enable_events parm, Combobox update, Listbox update,
 Radio enable/disable, Menu updates!

---
 PySimpleGUIQt/PySimpleGUIQt.py | 229 ++++++++++++++++++---------------
 1 file changed, 126 insertions(+), 103 deletions(-)

diff --git a/PySimpleGUIQt/PySimpleGUIQt.py b/PySimpleGUIQt/PySimpleGUIQt.py
index 64058908..45b3a60b 100644
--- a/PySimpleGUIQt/PySimpleGUIQt.py
+++ b/PySimpleGUIQt/PySimpleGUIQt.py
@@ -491,7 +491,7 @@ class Element():
 class InputText(Element):
     def __init__(self, default_text='', size=(None, None), disabled=False, password_char='',
                  justification=None, background_color=None, text_color=None, font=None, tooltip=None,
-                 change_submits=False,
+                 change_submits=False, enable_events=False,
                  do_not_clear=False, key=None, focus=False, pad=None):
         '''
         Input a line of text Element
@@ -508,7 +508,7 @@ class InputText(Element):
         self.do_not_clear = do_not_clear
         self.Justification = justification or 'left'
         self.Disabled = disabled
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
         super().__init__(ELEM_TYPE_INPUT_TEXT, size=size, background_color=bg, text_color=fg, key=key, pad=pad,
                          font=font, tooltip=tooltip)
 
@@ -570,7 +570,7 @@ Input = InputText
 # ---------------------------------------------------------------------- #
 class Combo(Element):
     def __init__(self, values, default_value=None, size=(None, None), auto_size_text=None, background_color=None,
-                 text_color=None, change_submits=False, disabled=False, key=None, pad=None, tooltip=None,
+                 text_color=None, change_submits=False, enable_events=False, disabled=False, key=None, pad=None, tooltip=None,
                  readonly=False, visible_items=10, font=None):
         '''
         Input Combo Box Element (also called Dropdown box)
@@ -581,7 +581,7 @@ class Combo(Element):
         '''
         self.Values = values
         self.DefaultValue = default_value
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
         self.TKCombo = None
         # self.InitializeAsDisabled = disabled
         self.Disabled = disabled
@@ -603,39 +603,31 @@ class Combo(Element):
         self.QT_ComboBox = QComboBox()
         self.QT_ComboBox.addItems(self.Values)
 
+
     def Update(self, value=None, values=None, set_to_index=None, disabled=None, readonly=None, font=None):
         if values is not None:
-            try:
-                self.TKCombo['values'] = values
-                self.TKCombo.current(0)
-            except:
-                pass
             self.Values = values
+            for i in range(self.QT_ComboBox.count()):
+                self.QT_ComboBox.removeItem(0)
+            self.QT_ComboBox.addItems(values)
         if value is not None:
             for index, v in enumerate(self.Values):
                 if v == value:
-                    try:
-                        self.TKCombo.current(index)
-                    except:
-                        pass
-                    self.DefaultValue = value
+                    self.QT_ComboBox.setCurrentIndex(index)
                     break
         if set_to_index is not None:
-            try:
-                self.TKCombo.current(set_to_index)
-                self.DefaultValue = self.Values[set_to_index]
-            except:
-                pass
+            self.QT_ComboBox.setCurrentIndex(set_to_index)
         if disabled == True:
-            self.TKCombo['state'] = 'disable'
+            self.QT_ComboBox.setDisabled(True)
         elif disabled == False:
-            self.TKCombo['state'] = 'enable'
-            if readonly is not None:
-                self.Readonly = readonly
-            if self.Readonly:
-                self.TKCombo['state'] = 'readonly'
+            self.QT_ComboBox.setDisabled(False)
+        if readonly is not None:
+            self.Readonly = readonly
         if font is not None:
-            self.TKText.configure(font=font)
+            style = create_style_from_font(font)
+            self.QT_ComboBox.setStyleSheet(style)
+        return
+
 
     def __del__(self):
         try:
@@ -713,7 +705,7 @@ InputOptionMenu = OptionMenu
 #                           Listbox                                      #
 # ---------------------------------------------------------------------- #
 class Listbox(Element):
-    def __init__(self, values, default_values=None, select_mode=None, change_submits=False, bind_return_key=False,
+    def __init__(self, values, default_values=None, select_mode=None, change_submits=False, enable_events=False, bind_return_key=False,
                  size=(None, None), disabled=False, auto_size_text=None, font=None, background_color=None,
                  text_color=None, key=None, pad=None, tooltip=None):
         '''
@@ -736,7 +728,7 @@ class Listbox(Element):
         self.Values = values
         self.DefaultValues = default_values
         self.TKListbox = None
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
         self.BindReturnKey = bind_return_key
         self.Disabled = disabled
         if select_mode == LISTBOX_SELECT_MODE_BROWSE:
@@ -763,18 +755,24 @@ class Listbox(Element):
 
 
     def Update(self, values=None, disabled=None):
-        if disabled == True:
-            pass
-        elif disabled == False:
-            pass
         if values is not None:
-            pass
             self.Values = values
+            for i in range(self.QT_ListWidget.count()):
+                self.QT_ListWidget.takeItem(0)
+            self.QT_ListWidget.addItems(values)
+        if disabled == True:
+            self.QT_ListWidget.setDisabled(True)
+        elif disabled == False:
+            self.QT_ListWidget.setDisabled(False)
+        return
 
     def SetValue(self, values):
-        for index, item in enumerate(self.Values):
-           pass
-        self.DefaultValues = values
+        # for index, item in enumerate(self.Values):
+        for index, value in enumerate(self.Values):
+            item = self.QT_ListWidget.item(index)
+            if value in values:
+                self.QT_ListWidget.setItemSelected(item, True)
+
 
     def GetListValues(self):
         return self.Values
@@ -789,7 +787,7 @@ class Listbox(Element):
 class Radio(Element):
     def __init__(self, text, group_id, default=False, disabled=False, size=(None, None), auto_size_text=None,
                  background_color=None, text_color=None, font=None, key=None, pad=None, tooltip=None,
-                 change_submits=False):
+                 change_submits=False,  enable_events=False):
         '''
         Radio Button Element
         :param text:
@@ -813,20 +811,21 @@ class Radio(Element):
         self.Value = None
         self.Disabled = disabled
         self.TextColor = text_color or DEFAULT_TEXT_COLOR
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
 
         super().__init__(ELEM_TYPE_INPUT_RADIO, size=size, auto_size_text=auto_size_text, font=font,
                          background_color=background_color, text_color=self.TextColor, key=key, pad=pad,
                          tooltip=tooltip)
 
     def Update(self, value=None, disabled=None):
-        location = EncodeRadioRowCol(self.Position[0], self.Position[1])
         if value is not None:
             self.InitialState = value
-        if disabled == True:
-            pass
-        elif disabled == False:
-            pass
+        if disabled:
+            self.QT_Radio_Button.setDisabled(True)
+        else:
+            self.QT_Radio_Button.setDisabled(False)
+        if value:
+            self.QT_Radio_Button.setChecked(True)
 
     def __del__(self):
         super().__del__()
@@ -837,7 +836,7 @@ class Radio(Element):
 # ---------------------------------------------------------------------- #
 class Checkbox(Element):
     def __init__(self, text, default=False, size=(None, None), auto_size_text=None, font=None, background_color=None,
-                 text_color=None, change_submits=False, disabled=False, key=None, pad=None, tooltip=None):
+                 text_color=None, change_submits=False, enable_events=False, disabled=False, key=None, pad=None, tooltip=None):
         '''
         Checkbox Element
         :param text:
@@ -859,7 +858,7 @@ class Checkbox(Element):
         self.TKCheckbutton = None
         self.Disabled = disabled
         self.TextColor = text_color if text_color else DEFAULT_TEXT_COLOR
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
 
         super().__init__(ELEM_TYPE_INPUT_CHECKBOX, size=size, auto_size_text=auto_size_text, font=font,
                          background_color=background_color, text_color=self.TextColor, key=key, pad=pad,
@@ -874,12 +873,11 @@ class Checkbox(Element):
         return self.TKIntVar.get()
 
     def Update(self, value=None, disabled=None):
-        if value is not None:
-            pass
+        self.QT_Checkbox.setChecked(value or False)
         if disabled == True:
-            pass
+            self.QT_Checkbox.setDisabled(True)
         elif disabled == False:
-            pass
+            self.QT_Checkbox.setDisabled(False)
 
     def __del__(self):
         super().__del__()
@@ -898,7 +896,7 @@ Check = Checkbox
 class Spin(Element):
     # Values = None
     # TKSpinBox = None
-    def __init__(self, values, initial_value=None, disabled=False, change_submits=False, size=(None, None),
+    def __init__(self, values, initial_value=None, disabled=False, change_submits=False,  enable_events=False, size=(None, None),
                  auto_size_text=None, font=None, background_color=None, text_color=None, key=None, pad=None,
                  tooltip=None):
         '''
@@ -918,8 +916,7 @@ class Spin(Element):
         '''
         self.Values = values
         self.DefaultValue = initial_value
-        self.ChangeSubmits = change_submits
-        self.TKSpinBox = None
+        self.ChangeSubmits = change_submits or enable_events
         self.Disabled = disabled
         bg = background_color if background_color else DEFAULT_INPUT_ELEMENTS_COLOR
         fg = text_color if text_color is not None else DEFAULT_INPUT_TEXT_COLOR
@@ -936,25 +933,16 @@ class Spin(Element):
 
     def Update(self, value=None, values=None, disabled=None):
         if values != None:
-            pass
+            self.Values = values
+            self.QT_Spinner.setRange(self.Values[0], self.Values[1])
         if value is not None:
-            pass
-        self.DefaultValue = value
+            self.QT_Spinner.setValue(value)
+            self.DefaultValue = value
         if disabled == True:
-            pass
+            self.QT_Spinner.setDisabled(True)
         elif disabled == False:
-            pass
+            self.QT_Spinner.setDisabled(False)
 
-    def SpinChangedHandler(self, event):
-        # first, get the results table built
-        # modify the Results table in the parent FlexForm object
-        if self.Key is not None:
-            self.ParentForm.LastButtonClicked = self.Key
-        else:
-            self.ParentForm.LastButtonClicked = ''
-        self.ParentForm.FormRemainedOpen = True
-        if self.ParentForm.CurrentlyRunningMainloop:
-           pass  # kick the users out of the mainloop
 
     def __del__(self):
         super().__del__()
@@ -965,7 +953,7 @@ class Spin(Element):
 # ---------------------------------------------------------------------- #
 class Multiline(Element, QWidget):
     def __init__(self, default_text='', enter_submits=False, disabled=False, autoscroll=False, size=(None, None),
-                 auto_size_text=None, background_color=None, text_color=None, change_submits=False, do_not_clear=False,
+                 auto_size_text=None, background_color=None, text_color=None, change_submits=False, enable_events=False, do_not_clear=False,
                  key=None, focus=False,
                  font=None, pad=None, tooltip=None):
         '''
@@ -993,7 +981,7 @@ class Multiline(Element, QWidget):
         fg = text_color if text_color is not None else DEFAULT_INPUT_TEXT_COLOR
         self.Autoscroll = autoscroll
         self.Disabled = disabled
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
         tsize = size                # convert tkinter size to pixels
         if size[0] is not None and size[0] < 100:
             tsize = convert_tkinter_size_to_Qt(size)
@@ -1057,7 +1045,7 @@ class Multiline(Element, QWidget):
 # ---------------------------------------------------------------------- #
 class MultilineOutput(Element):
     def __init__(self, default_text='', enter_submits=False, disabled=False, autoscroll=False, size=(None, None),
-                 auto_size_text=None, background_color=None, text_color=None, change_submits=False, do_not_clear=False,
+                 auto_size_text=None, background_color=None, text_color=None, change_submits=False, enable_events=False, do_not_clear=False,
                  key=None, focus=False,
                  font=None, pad=None, tooltip=None):
         '''
@@ -1085,7 +1073,7 @@ class MultilineOutput(Element):
         fg = text_color if text_color is not None else DEFAULT_INPUT_TEXT_COLOR
         self.Autoscroll = autoscroll
         self.Disabled = disabled
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
 
         super().__init__(ELEM_TYPE_MULTILINE_OUTPUT, size=size, auto_size_text=auto_size_text, background_color=bg,
                          text_color=fg, key=key, pad=pad, tooltip=tooltip, font=font or DEFAULT_FONT)
@@ -1234,7 +1222,7 @@ class Output(Element):
 # ---------------------------------------------------------------------- #
 class Button(Element):
     def __init__(self, button_text='', button_type=BUTTON_TYPE_READ_FORM, target=(None, None), tooltip=None,
-                 file_types=(("ALL Files", "*.*"),), initial_folder=None, disabled=False, change_submits=False,
+                 file_types=(("ALL Files", "*.*"),), initial_folder=None, disabled=False, change_submits=False, enable_events=False,
                  image_filename=None, image_data=None, image_size=(None, None), image_subsample=None, border_width=None,
                  size=(None, None), auto_size_button=None, button_color=None, font=None, bind_return_key=False,
                  focus=False, pad=None, key=None):
@@ -1283,7 +1271,7 @@ class Button(Element):
         self.DefaultDate_M_D_Y = (None, None, None)
         self.InitialFolder = initial_folder
         self.Disabled = disabled
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
         self.QT_QPushButton = None
         # self.temp_size = size if size != (NONE, NONE) else
 
@@ -1580,7 +1568,7 @@ class ProgressBar(Element):
 # ---------------------------------------------------------------------- #
 class Image(Element):
     def __init__(self, filename=None, data=None, data_base64=None, background_color=None, size=(None, None), pad=None, key=None,
-                 tooltip=None, click_submits=False):
+                 tooltip=None, click_submits=False,  enable_events=False):
         '''
         Image Element
         :param filename:
@@ -1596,7 +1584,7 @@ class Image(Element):
         self.DataBase64 = data_base64
         self.tktext_label = None
         self.BackgroundColor = background_color
-        self.ClickSubmits = click_submits
+        self.ClickSubmits = click_submits or enable_events
         if data is None and filename is None and data_base64 is None:
             print('* Warning... no image specified in Image Element! *')
         super().__init__(ELEM_TYPE_IMAGE, size=size, background_color=background_color, pad=pad, key=key,
@@ -2044,7 +2032,7 @@ class Tab(Element):
 # ---------------------------------------------------------------------- #
 class TabGroup(Element):
     def __init__(self, layout, tab_location=None, title_color=None, selected_title_color=None, background_color=None,
-                 font=None, change_submits=False, pad=None, border_width=None, theme=None, key=None, tooltip=None):
+                 font=None, change_submits=False, enable_events=False, pad=None, border_width=None, theme=None, key=None, tooltip=None):
         '''
         TabGroup Element
         :param layout:
@@ -2073,7 +2061,7 @@ class TabGroup(Element):
         self.BorderWidth = border_width
         self.Theme = theme
         self.BackgroundColor = background_color if background_color is not None else DEFAULT_BACKGROUND_COLOR
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
         self.TabLocation = tab_location
 
         self.Layout(layout)
@@ -2126,7 +2114,7 @@ class TabGroup(Element):
 # ---------------------------------------------------------------------- #
 class Slider(Element):
     def __init__(self, range=(None, None), default_value=None, resolution=None, tick_interval=None, orientation=None,
-                 border_width=None, relief=None, change_submits=False, disabled=False, size=(None, None), font=None,
+                 border_width=None, relief=None, change_submits=False, enable_events=False, disabled=False, size=(None, None), font=None,
                  background_color=None, text_color=None, key=None, pad=None, tooltip=None):
         '''
         Slider Element
@@ -2153,7 +2141,7 @@ class Slider(Element):
         self.BorderWidth = border_width if border_width else DEFAULT_SLIDER_BORDER_WIDTH
         self.Relief = relief if relief else DEFAULT_SLIDER_RELIEF
         self.Resolution = 1 if resolution is None else resolution
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
         self.Disabled = disabled
         self.TickInterval = tick_interval
         temp_size = size
@@ -2201,7 +2189,7 @@ class Slider(Element):
 # ---------------------------------------------------------------------- #
 class Dial(Element):
     def __init__(self, range=(None, None), default_value=None, resolution=None, tick_interval=None, orientation=None,
-                 border_width=None, relief=None, change_submits=False, disabled=False, size=(None, None), font=None,
+                 border_width=None, relief=None, change_submits=False, enable_events=False, disabled=False, size=(None, None), font=None,
                  background_color=None, text_color=None, key=None, pad=None, tooltip=None):
         '''
         Dial Element
@@ -2228,7 +2216,7 @@ class Dial(Element):
         self.BorderWidth = border_width if border_width else DEFAULT_SLIDER_BORDER_WIDTH
         self.Relief = relief if relief else DEFAULT_SLIDER_RELIEF
         self.Resolution = 1 if resolution is None else resolution
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
         self.Disabled = disabled
         self.TickInterval = tick_interval
         temp_size = size
@@ -2386,6 +2374,25 @@ class Menu(Element):
         # if self.ParentForm.CurrentlyRunningMainloop:
         #     pass # TODO  # kick the users out of the mainloop
 
+    def Update(self, menu_definition):
+        menu_def = menu_definition
+        self.MenuDefinition = menu_def
+        self.QT_QMenuBar = QMenuBar(self.ParentForm.QT_QMainWindow)
+
+        for menu_entry in menu_def:
+            # print(f'Adding a Menubar ENTRY {menu_entry}')
+            baritem = QMenu(self.QT_QMenuBar)
+            if menu_entry[0][0] == MENU_DISABLED_CHARACTER:
+                baritem.setDisabled(True)
+                baritem.setTitle(menu_entry[0][1:])
+            else:
+                baritem.setTitle(menu_entry[0])
+            self.QT_QMenuBar.addAction(baritem.menuAction())
+            AddMenuItem(baritem, menu_entry[1], self)
+
+        self.ParentForm.QT_QMainWindow.setMenuBar(self.QT_QMenuBar)
+
+
     def __del__(self):
         super().__del__()
 
@@ -2397,7 +2404,7 @@ class Table(Element):
     def __init__(self, values, headings=None, visible_column_map=None, col_widths=None, def_col_width=10,
                  auto_size_columns=True, max_col_width=20, select_mode=None, display_row_numbers=False, num_rows=None,
                  font=None, justification='right', text_color=None, background_color=None, alternating_row_color=None,
-                 size=(None, None), change_submits=False, bind_return_key=False, pad=None, key=None, tooltip=None):
+                 size=(None, None), change_submits=False, enable_events=False, bind_return_key=False, pad=None, key=None, tooltip=None):
         '''
         Table Element
         :param values:
@@ -2435,7 +2442,7 @@ class Table(Element):
         self.TKTreeview = None
         self.AlternatingRowColor = alternating_row_color
         self.SelectedRows = []
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
         self.BindReturnKey = bind_return_key
 
         super().__init__(ELEM_TYPE_TABLE, text_color=text_color, background_color=background_color, font=font,
@@ -2534,7 +2541,7 @@ class Table(Element):
 class Tree(Element):
     def __init__(self, data=None, headings=None, visible_column_map=None, col_widths=None, col0_width=10,
                  def_col_width=10, auto_size_columns=True, max_col_width=20, select_mode=None, show_expanded=False,
-                 change_submits=False, font=None, size=(200,600),
+                 change_submits=False, enable_events=False, font=None, size=(200,600),
                  justification='right', text_color=None, background_color=None, num_rows=None, pad=None, key=None,
                  tooltip=None):
         '''
@@ -2572,7 +2579,7 @@ class Tree(Element):
         self.Col0Width = col0_width
         self.TKTreeview = None
         self.SelectedRows = []
-        self.ChangeSubmits = change_submits
+        self.ChangeSubmits = change_submits or enable_events
         self.Size = size
 
         super().__init__(ELEM_TYPE_TREE, text_color=text_color, background_color=background_color, font=font, pad=pad,
@@ -2998,9 +3005,10 @@ class Window:
         return self
 
     def LayoutAndRead(self, rows, non_blocking=False):
-        self.AddRows(rows)
-        self.Show(non_blocking=non_blocking)
-        return self.ReturnValues
+        raise DeprecationWarning('LayoutAndRead is no longer supported... change your call to window.Layout(layout).Read()')
+        # self.AddRows(rows)
+        # self.Show(non_blocking=non_blocking)
+        # return self.ReturnValues
 
     def LayoutAndShow(self, rows):
         raise DeprecationWarning('LayoutAndShow is no longer supported... change your call to LayoutAndRead')
@@ -3574,32 +3582,32 @@ def create_style_from_font(font):
 
 # -------------------------  FOLDER BROWSE Element lazy function  ------------------------- #
 def FolderBrowse(button_text='Browse', target=(ThisRow, -1), initial_folder=None, tooltip=None, size=(None, None),
-                 auto_size_button=None, button_color=None, disabled=False, change_submits=False, font=None, pad=None,
+                 auto_size_button=None, button_color=None, disabled=False, change_submits=False, enable_events=False, font=None, pad=None,
                  key=None):
     return Button(button_text=button_text, button_type=BUTTON_TYPE_BROWSE_FOLDER, target=target,
                   initial_folder=initial_folder, tooltip=tooltip, size=size, auto_size_button=auto_size_button,
-                  disabled=disabled, button_color=button_color, change_submits=change_submits, font=font, pad=pad,
+                  disabled=disabled, button_color=button_color, change_submits=change_submits, enable_events=enable_events, font=font, pad=pad,
                   key=key)
 
 
 # -------------------------  FILE BROWSE Element lazy function  ------------------------- #
 def FileBrowse(button_text='Browse', target=(ThisRow, -1), file_types=(("ALL Files", "*.*"),), initial_folder=None,
-               tooltip=None, size=(None, None), auto_size_button=None, button_color=None, change_submits=False,
+               tooltip=None, size=(None, None), auto_size_button=None, button_color=None, change_submits=False, enable_events=False,
                font=None, disabled=False,
                pad=None, key=None):
     return Button(button_text=button_text, button_type=BUTTON_TYPE_BROWSE_FILE, target=target, file_types=file_types,
                   initial_folder=initial_folder, tooltip=tooltip, size=size, auto_size_button=auto_size_button,
-                  change_submits=change_submits, disabled=disabled, button_color=button_color, font=font, pad=pad,
+                  change_submits=change_submits, enable_events=enable_events, disabled=disabled, button_color=button_color, font=font, pad=pad,
                   key=key)
 
 
 # -------------------------  FILES BROWSE Element (Multiple file selection) lazy function  ------------------------- #
 def FilesBrowse(button_text='Browse', target=(ThisRow, -1), file_types=(("ALL Files", "*.*"),), disabled=False,
                 initial_folder=None, tooltip=None, size=(None, None), auto_size_button=None, button_color=None,
-                change_submits=False,
+                change_submits=False, enable_events=False,
                 font=None, pad=None, key=None):
     return Button(button_text=button_text, button_type=BUTTON_TYPE_BROWSE_FILES, target=target, file_types=file_types,
-                  initial_folder=initial_folder, change_submits=change_submits, tooltip=tooltip, size=size,
+                  initial_folder=initial_folder, change_submits=change_submits, enable_events=enable_events, tooltip=tooltip, size=size,
                   auto_size_button=auto_size_button,
                   disabled=disabled, button_color=button_color, font=font, pad=pad, key=key)
 
@@ -3607,22 +3615,22 @@ def FilesBrowse(button_text='Browse', target=(ThisRow, -1), file_types=(("ALL Fi
 # -------------------------  FILE BROWSE Element lazy function  ------------------------- #
 def FileSaveAs(button_text='Save As...', target=(ThisRow, -1), file_types=(("ALL Files", "*.*"),), initial_folder=None,
                disabled=False, tooltip=None, size=(None, None), auto_size_button=None, button_color=None,
-               change_submits=False, font=None,
+               change_submits=False, enable_events=False, font=None,
                pad=None, key=None):
     return Button(button_text=button_text, button_type=BUTTON_TYPE_SAVEAS_FILE, target=target, file_types=file_types,
                   initial_folder=initial_folder, tooltip=tooltip, size=size, disabled=disabled,
-                  auto_size_button=auto_size_button, button_color=button_color, change_submits=change_submits,
+                  auto_size_button=auto_size_button, button_color=button_color, change_submits=change_submits, enable_events=enable_events,
                   font=font, pad=pad, key=key)
 
 
 # -------------------------  SAVE AS Element lazy function  ------------------------- #
 def SaveAs(button_text='Save As...', target=(ThisRow, -1), file_types=(("ALL Files", "*.*"),), initial_folder=None,
            disabled=False, tooltip=None, size=(None, None), auto_size_button=None, button_color=None,
-           change_submits=False, font=None,
+           change_submits=False, enable_events=False, font=None,
            pad=None, key=None):
     return Button(button_text=button_text, button_type=BUTTON_TYPE_SAVEAS_FILE, target=target, file_types=file_types,
                   initial_folder=initial_folder, tooltip=tooltip, size=size, disabled=disabled,
-                  auto_size_button=auto_size_button, button_color=button_color, change_submits=change_submits,
+                  auto_size_button=auto_size_button, button_color=button_color, change_submits=change_submits, enable_events=enable_events,
                   font=font, pad=pad, key=key)
 
 
@@ -4342,8 +4350,6 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
                 if element.Margins is not None:
                     m = element.Margins
                     qlabel.setContentsMargins(m[0], m[2], m[1], m[3])  # L T B R
-
-
                 if element.Tooltip:
                     element.QT_Label.setToolTip(element.Tooltip)
                 qt_row_layout.addWidget(element.QT_Label)
@@ -4454,6 +4460,9 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
                     if element_size[1] is not None:
                         element.QT_ComboBox.setFixedHeight(element_size[1])
 
+                if element.Disabled:
+                    element.QT_ComboBox.setDisabled(True)
+
                 element.QT_ComboBox.addItems(element.Values)
                 element.QT_ComboBox.setMaxVisibleItems(element.VisibleItems)
                 element.QT_ComboBox.setVisible(element.VisibleItems)
@@ -4494,6 +4503,9 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
                 elif element.SelectMode == SELECT_MODE_SINGLE:
                     element.QT_ListWidget.setSelectionMode(QAbstractItemView.SingleSelection)
 
+                if element.Disabled:
+                    element.QT_ListWidget.setDisabled(True)
+
                 if element.ChangeSubmits:
                     element.QT_ListWidget.currentRowChanged.connect(element.QtCurrentRowChanged)
 
@@ -4621,6 +4633,8 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
                 ID = element.GroupID
                 qradio = QRadioButton(element.Text)
                 element.QT_Radio_Button = qradio
+                if element.Disabled:
+                    element.QT_Radio_Button.setDisabled(True)
                 if default_value:
                     qradio.setChecked(True)
                 style = create_style_from_font(font)
@@ -4670,6 +4684,8 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
                     if element_size[1] is not None:
                         element.QT_Spinner.setFixedHeight(element_size[1])
 
+                if element.Disabled:
+                    element.QT_Spinner.setDisabled(True)
                 if element.ChangeSubmits:
                     element.QT_Spinner.valueChanged.connect(element.QtCallbackValueChanged)
                 if element.Tooltip:
@@ -4762,7 +4778,11 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
                 for menu_entry in menu_def:
                     # print(f'Adding a Menubar ENTRY {menu_entry}')
                     baritem = QMenu(element.QT_QMenuBar)
-                    baritem.setTitle(menu_entry[0])
+                    if menu_entry[0][0] == MENU_DISABLED_CHARACTER:
+                        baritem.setDisabled(True)
+                        baritem.setTitle(menu_entry[0][1:])
+                    else:
+                        baritem.setTitle(menu_entry[0])
                     element.QT_QMenuBar.addAction(baritem.menuAction())
                     AddMenuItem(baritem, menu_entry[1], element)
 
@@ -4875,7 +4895,8 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
                     element.QT_Slider.setOrientation(Qt.Horizontal)
                 else:
                     element.QT_Slider.setOrientation(Qt.Vertical)
-
+                if element.Disabled:
+                    element.QT_Slider.setDisabled(True)
                 style = create_style_from_font(font)
                 if element.BackgroundColor is not None:
                     style += 'background-color: %s;' % element.BackgroundColor
@@ -4927,6 +4948,8 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
                 style += 'border: {}px solid gray; '.format(border_depth)
                 element.QT_Dial.setStyleSheet(style)
 
+                if element.Disabled:
+                    element.QT_Dial.setDisabled(True)
 
                 element.QT_Dial.setMinimum(element.Range[0])
                 element.QT_Dial.setMaximum(element.Range[1])
@@ -4978,6 +5001,7 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
                 element.QT_TableWidget.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
                 if element.Tooltip:
                     element.QT_TableWidget.setToolTip(element.Tooltip)
+
                 qt_row_layout.addWidget(element.QT_TableWidget)
 
             # -------------------------  Tree element  ------------------------- #
@@ -5030,7 +5054,6 @@ def PackFormIntoFrame(window, containing_frame, toplevel_win):
                 if element.ShowExpanded:
                     element.QT_QTreeWidget.expandAll()
                     element.QT_QTreeWidget.show()
-
                 if element.Tooltip:
                     element.QT_QTreeWidget.setToolTip(element.Tooltip)
                 qt_row_layout.addWidget(element.QT_QTreeWidget)