diff --git a/PySimpleGUI.py b/PySimpleGUI.py index 5b1e8f7c..09babe76 100644 --- a/PySimpleGUI.py +++ b/PySimpleGUI.py @@ -366,6 +366,24 @@ class Element(): self.ParentForm.FormRemainedOpen = True self.ParentForm.TKroot.quit() # kick the users out of the mainloop + def CheckboxHandler(self): + MyForm = self.ParentForm + if self.Key is not None: + self.ParentForm.LastButtonClicked = self.Key + else: + self.ParentForm.LastButtonClicked = '' + self.ParentForm.FormRemainedOpen = True + self.ParentForm.TKroot.quit() + + def TabGroupSelectHandler(self, event): + MyForm = self.ParentForm + if self.Key is not None: + self.ParentForm.LastButtonClicked = self.Key + else: + self.ParentForm.LastButtonClicked = '' + self.ParentForm.FormRemainedOpen = True + self.ParentForm.TKroot.quit() + def __del__(self): try: self.TKStringVar.__del__() @@ -646,7 +664,7 @@ class Radio(Element): # Checkbox # # ---------------------------------------------------------------------- # class Checkbox(Element): - def __init__(self, text, default=False, size=(None, None), auto_size_text=None, font=None, background_color=None, text_color=None, key=None, pad=None, tooltip=None): + def __init__(self, text, default=False, size=(None, None), auto_size_text=None, font=None, background_color=None, text_color=None, change_submits=False, key=None, pad=None, tooltip=None): ''' Check Box Element :param text: @@ -661,6 +679,7 @@ class Checkbox(Element): self.Value = None self.TKCheckbutton = None self.TextColor = text_color if text_color else DEFAULT_TEXT_COLOR + self.ChangeSubmits = change_submits 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, tooltip=tooltip) @@ -1514,7 +1533,7 @@ class Tab(Element): # TabGroup # # ---------------------------------------------------------------------- # class TabGroup(Element): - def __init__(self, layout, title_color=None, background_color=None, font=None, pad=None, border_width=None, key=None, tooltip=None): + def __init__(self, layout, title_color=None, background_color=None, font=None, change_submits=False, pad=None, border_width=None, key=None, tooltip=None): self.UseDictionary = False self.ReturnValues = None @@ -1526,6 +1545,7 @@ class TabGroup(Element): self.TKNotebook = None self.BorderWidth = border_width self.BackgroundColor = background_color if background_color is not None else DEFAULT_BACKGROUND_COLOR + self.ChangeSubmits = change_submits self.Layout(layout) @@ -2628,13 +2648,18 @@ def BuildResultsForSubform(form, initialize_only, top_level_form): element.TKText.delete('1.0', tk.END) except: value = None + elif element.Type == ELEM_TYPE_TAB_GROUP: + try: + value=element.TKNotebook.tab(element.TKNotebook.index('current'))['text'] + except: + value = None else: value = None # if an input type element, update the results if element.Type != ELEM_TYPE_BUTTON and element.Type != ELEM_TYPE_TEXT and element.Type != ELEM_TYPE_IMAGE and\ element.Type != ELEM_TYPE_OUTPUT and element.Type != ELEM_TYPE_PROGRESS_BAR and \ - element.Type!= ELEM_TYPE_COLUMN and element.Type != ELEM_TYPE_FRAME and element.Type != ELEM_TYPE_TAB_GROUP \ + element.Type!= ELEM_TYPE_COLUMN and element.Type != ELEM_TYPE_FRAME \ and element.Type != ELEM_TYPE_TAB: AddToReturnList(form, value) AddToReturnDictionary(top_level_form, element, value) @@ -2729,7 +2754,18 @@ def AddMenuItem(top_menu, sub_menu_info, element, is_sub_menu=False, skip=False) if type(sub_menu_info) is str: if not is_sub_menu and not skip: # print(f'Adding command {sub_menu_info}') - top_menu.add_command(label=sub_menu_info, command=lambda: Menu.MenuItemChosenCallback(element, sub_menu_info)) + pos = sub_menu_info.find('_&') + if pos != -1: + _ = sub_menu_info[:pos] + try: + _ += sub_menu_info[pos+2:] + except Exception as e: + print(e) + sub_menu_info = _ + if sub_menu_info == '---': + top_menu.add('separator') + else: + top_menu.add_command(label=sub_menu_info, underline=pos-1, command=lambda: Menu.MenuItemChosenCallback(element, sub_menu_info)) else: i = 0 while i < (len(sub_menu_info)): @@ -2892,7 +2928,7 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form): tkbutton.bind('', element.ButtonReleaseCallBack) tkbutton.bind('', element.ButtonPressCallBack) if bc != (None, None) and bc != COLOR_SYSTEM_DEFAULT: - tkbutton.config(foreground=bc[0], background=bc[1]) + tkbutton.config(foreground=bc[0], background=bc[1], activebackground=bc[1]) element.TKButton = tkbutton # not used yet but save the TK button in case wraplen = tkbutton.winfo_reqwidth() # width of widget in Pixels if element.ImageFilename: # if button has an image on it @@ -3064,12 +3100,19 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form): default_value = element.InitialState element.TKIntVar = tk.IntVar() element.TKIntVar.set(default_value if default_value is not None else 0) - element.TKCheckbutton = tk.Checkbutton(tk_row_frame, anchor=tk.NW, text=element.Text, width=width, variable=element.TKIntVar, bd=border_depth, font=font) + if element.ChangeSubmits: + element.TKCheckbutton = tk.Checkbutton(tk_row_frame, anchor=tk.NW, text=element.Text, width=width, + variable=element.TKIntVar, bd=border_depth, font=font, + command=element.CheckboxHandler) + else: + element.TKCheckbutton = tk.Checkbutton(tk_row_frame, anchor=tk.NW, text=element.Text, width=width, + variable=element.TKIntVar, bd=border_depth, font=font) if default_value is None: 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.BackgroundColor) + element.TKCheckbutton.configure(activebackground=element.BackgroundColor) if text_color is not None and text_color != COLOR_SYSTEM_DEFAULT: element.TKCheckbutton.configure(fg=text_color) element.TKCheckbutton.pack(side=tk.LEFT,padx=element.Pad[0], pady=element.Pad[1]) @@ -3193,21 +3236,23 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form): element.TooltipObject = ToolTip(element._TKCanvas, text=element.Tooltip, timeout=DEFAULT_TOOLTIP_TIME) # ------------------------- MENUBAR element ------------------------- # elif element_type == ELEM_TYPE_MENUBAR: - menu_def = (('File', ('Open', 'Save')), - ('Help', 'About...'),) - # ('Help',)) - menu_def = element.MenuDefinition - element.TKMenu = tk.Menu(toplevel_form.TKroot, tearoff=element.Tearoff) # create the menubar menubar = element.TKMenu for menu_entry in menu_def: # print(f'Adding a Menubar ENTRY') baritem = tk.Menu(menubar, tearoff=element.Tearoff) - menubar.add_cascade(label=menu_entry[0], menu=baritem) + pos = menu_entry[0].find('_&') + if pos != -1: + _ = menu_entry[0][:pos] + try: + _ += menu_entry[0][pos+2:] + except: + pass + menu_entry[0] = _ + menubar.add_cascade(label=menu_entry[0], menu=baritem, underline = pos-1) if len(menu_entry) > 1: AddMenuItem(baritem, menu_entry[1], element) - toplevel_form.TKroot.configure(menu=element.TKMenu) # ------------------------- Frame element ------------------------- # elif element_type == ELEM_TYPE_FRAME: @@ -3256,6 +3301,8 @@ def PackFormIntoFrame(form, containing_frame, toplevel_form): # highlightcolor=element.BackgroundColor) # if element.TextColor != COLOR_SYSTEM_DEFAULT and element.TextColor is not None: # element.TKNotebook.configure(foreground=element.TextColor) + if element.ChangeSubmits: + element.TKNotebook.bind('<>', element.TabGroupSelectHandler) if element.BorderWidth is not None: element.TKNotebook.configure(borderwidth=element.BorderWidth) if element.Tooltip is not None: