def finish_widget_creation(self): ManagedBase.finish_widget_creation(self, sel_marker_parent=self.widget) sash_pos_p = self.properties['sash_pos'] if sash_pos_p.is_active(): self.widget.SetSashPosition(sash_pos_p.get()) else: sash_pos_p.set(self.widget.GetSashPosition()) sash_gravity_p = self.properties['sash_gravity'] if sash_gravity_p.is_active(): self.widget.SetSashPosition(sash_gravity_p.get()) min_pane_size_p = self.properties['min_pane_size'] if min_pane_size_p.is_active(): self.widget.SetMinimumPaneSize(min_pane_size_p.get()) else: min_pane_size.set_value(self.widget.GetMinimumPaneSize()) self.widget.Bind(wx.EVT_SPLITTER_SASH_POS_CHANGED, self.on_sash_pos_changed) if self._window_1 and self._window_1.widget: if self.orientation == "wxSPLIT_VERTICAL": compat.SetToolTip(self._window_1.widget, _("Left splitter pane:\nAdd a sizer here")) else: compat.SetToolTip(self._window_1.widget, _("Top splitter pane:\nAdd a sizer here")) if self._window_2 and self._window_2.widget: if self.orientation == "wxSPLIT_VERTICAL": compat.SetToolTip(self._window_2.widget, _("Right splitter pane:\nAdd a sizer here")) else: compat.SetToolTip(self._window_2.widget, _("Bottom splitter pane:\nAdd a sizer here"))
def on_text(self, event): import re validation_re = re.compile(r'^[a-zA-Z_]+[\w:.0-9-]*$') name = event.GetString() OK = bool(validation_re.match(name)) if not OK: self.klass.SetBackgroundColour(wx.RED) compat.SetToolTip(self.klass, "Class name not valid") else: #if name in [c.widget.klass for c in common.root.children or []]: if self.toplevel and name in self.toplevel_names: self.klass.SetBackgroundColour(wx.RED) compat.SetToolTip( self.klass, "Class name already in use for toplevel window") OK = False elif name in self.class_names: # if the class name is in use already, indicate in yellow self.klass.SetBackgroundColour(wx.Colour(255, 255, 0, 255)) compat.SetToolTip(self.klass, "Class name not unique") if self.toplevel and name in self.toplevel_names: OK = False else: self.klass.SetBackgroundColour( compat.wx_SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) compat.SetToolTip(self.klass, "") self.klass.Refresh() self.btnOK.Enable(OK) event.Skip()
def _set_tooltips(self): # set tooltips for c in (self.label_6, self.label): compat.SetToolTip( c, "The menu entry text;\nenter & for access keys (using ALT key)\nappend e.g. \\tCtrl-X for keyboard shortcut" ) for c in (self.label_7, self.event_handler): compat.SetToolTip( c, "Enter the name of an event handler method; this will be created as stub" ) for c in (self.label_8, self.name): compat.SetToolTip( c, "optional: enter a name to store the menu item as attribute of the menu bar" ) for c in (self.label_10, self.id): compat.SetToolTip(c, "optional: enter wx ID") compat.SetToolTip(self.move_up, "Move selected item up (Alt-Up)") compat.SetToolTip(self.move_down, "Move selected item down (Alt-Down)") compat.SetToolTip( self.items, "For navigation use the mouse or the up/down arrows") compat.SetToolTip( self.move_left, "Move the selected item up by one menu level (Alt-Left)") compat.SetToolTip( self.move_right, "Move the selected item down by one menu level (Alt-Right)")
def __do_layout(self): sizer_1 = wx.BoxSizer(wx.VERTICAL) sizer_2 = wx.BoxSizer(wx.HORIZONTAL) sizer_5 = wx.BoxSizer(wx.HORIZONTAL) sizer_6 = wx.BoxSizer(wx.VERTICAL) grid_sizer_2 = wx.FlexGridSizer(5, 2, 0, 0) label_6 = wx.StaticText(self, wx.ID_ANY, "Label:") grid_sizer_2.Add(label_6, 0, wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT, 4) grid_sizer_2.Add(self.label, 1, wx.EXPAND, 0) label_7 = wx.StaticText(self, wx.ID_ANY, "Event Handler:") grid_sizer_2.Add(label_7, 0, wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT, 4) grid_sizer_2.Add(self.event_handler, 1, wx.EXPAND, 0) label_8 = wx.StaticText(self, wx.ID_ANY, "(Attribute) Name:") grid_sizer_2.Add(label_8, 0, wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT, 4) grid_sizer_2.Add(self.name, 1, wx.EXPAND, 0) label_9 = wx.StaticText(self, wx.ID_ANY, "Help String:") grid_sizer_2.Add(label_9, 0, wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT, 4) grid_sizer_2.Add(self.help_str, 1, wx.EXPAND, 0) label_10 = wx.StaticText(self, wx.ID_ANY, "ID:") grid_sizer_2.Add(label_10, 0, wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT, 4) grid_sizer_2.Add(self.id, 0, 0, 0) grid_sizer_2.AddGrowableCol(1) sizer_5.Add(grid_sizer_2, 2, wx.EXPAND, 0) sizer_5.Add(self.check_radio, 0, wx.ALL | wx.EXPAND, 4) sizer_5.Add((20, 20), 1, wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, 0) sizer_6.Add(self.ok, 0, wx.ALL, 5) sizer_6.Add(self.cancel, 0, wx.ALL, 5) sizer_5.Add(sizer_6, 0, wx.EXPAND, 0) sizer_1.Add(sizer_5, 0, wx.EXPAND, 0) sizer_2.Add(self.move_left, 0, wx.BOTTOM | wx.LEFT | wx.TOP, 8) sizer_2.Add(self.move_right, 0, wx.BOTTOM | wx.RIGHT | wx.TOP, 8) sizer_2.Add(self.move_up, 0, wx.BOTTOM | wx.LEFT | wx.TOP, 8) sizer_2.Add(self.move_down, 0, wx.BOTTOM | wx.RIGHT | wx.TOP, 8) sizer_2.Add((20, 20), 1, wx.ALIGN_CENTER_VERTICAL, 0) sizer_2.Add(self.add, 0, wx.BOTTOM | wx.LEFT | wx.TOP, 8) sizer_2.Add(self.remove, 0, wx.BOTTOM | wx.TOP, 8) sizer_2.Add(self.add_sep, 0, wx.ALL, 8) sizer_2.Add((20, 20), 2, wx.ALIGN_CENTER_VERTICAL, 0) sizer_1.Add(sizer_2, 0, wx.EXPAND, 0) sizer_1.Add(self.menu_items, 1, wx.EXPAND, 0) self.SetSizer(sizer_1) sizer_1.Fit(self) sizer_1.SetSizeHints(self) self.Layout() # set tooltips for c in (label_6, self.label): compat.SetToolTip(c, "The menu entry text;\nenter & for access keys (using ALT key)\nappend e.g. \\tCtrl-X for keyboard shortcut") for c in (label_7, self.event_handler): compat.SetToolTip(c, "Enter the name of an event handler method; this will be created as stub") for c in (label_8, self.name): compat.SetToolTip(c, "optional: enter a name to store the menu item as attribute of the menu bar") for c in (label_10, self.id): compat.SetToolTip(c, "optional: enter wx ID") compat.SetToolTip( self.move_up, "Move selected item up" ) compat.SetToolTip( self.move_down, "Move selected item down" ) compat.SetToolTip( self.menu_items, "For navigation use the mouse or the up/down arrows" ) compat.SetToolTip( self.move_left, "Move the selected item up by one menu level" ) compat.SetToolTip( self.move_right, "Move the selected item down by one menu level" )
def _insert_tab(self, index, label): # add tab/page tabs_p = self.properties["tabs"] tabs = tabs_p.get() # the value will be modified in place tabs.insert(index, [ label, ]) tabs_p.set(tabs) self.children.insert(index, None) # adjust pos of the following pages for i, page in enumerate(self.children[index + 1:]): pos_p = page.properties["pos"] pos_p.set(index + 1 + i) # create panel and node, add to tree editor = EditPanel(self.next_pane_name(), self, index) if self.widget: # add to widget editor.create() compat.SetToolTip(editor.widget, _("Notebook page pane:\nAdd a sizer here")) self.vs_insert_tab(index) try: wx.CallAfter(editor.sel_marker.update) except AttributeError: #self._logger.exception(_('Internal Error')) if config.debugging: raise self.widget.SetSelection(index) self.properties["tabs"].update_display() return editor
def insert_tab(self, index, label, add_panel=True, add_sizer=False): # add tab/page; called from GUI self.properties["tabs"].insert(index, [ label, ]) # create panel and node, add to tree self.insert_item(None, index) # placeholder if add_panel: if not isinstance(add_panel, compat.unicode): add_panel = self.next_pane_name() editor = panel.EditPanel(add_panel, self, index) if add_sizer: sizer = edit_sizers._builder(editor, 0) else: # just add a slot editor = edit_base.Slot(self, index) if self.widget: # add to widget editor.create() compat.SetToolTip(editor.widget, _("Notebook page pane:\nAdd a sizer here")) self.vs_insert_tab(index) try: wx.CallAfter(editor.sel_marker.update) except AttributeError: #self._logger.exception(_('Internal Error')) if config.debugging: raise self.widget.SetSelection(index) self.properties["tabs"].update_display() misc.rebuild_tree(self)
def create_widget(self): self._error_message = None if self.show_design and common.root.language == "python" and config.preferences.allow_custom_widgets: # update path import os, sys dirname = os.path.dirname(common.root.filename) if not dirname in sys.path: sys.path.insert(0, dirname) # build code code_gen = common.code_writers["python"] code_gen.new_project(common.root) builder = code_gen.obj_builders["CustomWidget"] # replace e.g. "self.%s"%name with "self.widget" original_widget_access = builder.format_widget_access(self) widget_access = "self.widget" original_parent_access = builder.format_widget_access( self.parent_window) parent_access = "self.parent_window.widget" code_gen.cache(self, "attribute_access", widget_access) code_gen.cache(self.parent_window, "attribute_access", parent_access) lines = [] if self.check_prop_truth("extracode"): lines.append(self.extracode) if self.check_prop_truth("extracode_pre"): lines.append(self.extracode_pre) lines += builder.get_code(self)[0] if self.check_prop_truth("extracode_post"): lines.append(self.extracode_post) if self.check_prop_truth("extraproperties"): lines += code_gen.generate_code_extraproperties(self) code = "\n".join(lines) if self.check_prop_truth("extracode_pre") or self.check_prop_truth( "extracode_post"): # replace widget and parent access in manually entered extra code code = code.replace(original_widget_access, widget_access) code = code.replace(original_parent_access, parent_access) # execute code before = set(sys.modules.keys()) try: exec(code) after = set(sys.modules.keys()) for modulename in (after - before): if modulename in code: print(modulename) return except: exc_type, exc_value, exc_traceback = sys.exc_info() self._error_message = "%s: %s" % (exc_type, exc_value) if self.widget: self.widget.Destroy() # default / fallback in case of exception self.widget = wx.Window(self.parent_window.widget, wx.ID_ANY, style=wx.BORDER_SUNKEN | wx.FULL_REPAINT_ON_RESIZE) self.widget.Bind(wx.EVT_PAINT, self.on_paint) self.widget.Bind(wx.EVT_ERASE_BACKGROUND, self.on_erase_background) if self._error_message: compat.SetToolTip(self.widget, self._error_message)
def _cancel(): if not common.adding_widget: return common.adding_widget = common.adding_sizer = False common.widget_to_add = None if currently_under_mouse is not None: currently_under_mouse.SetCursor(wx.STANDARD_CURSOR) common.app_tree.SetCursor(wx.STANDARD_CURSOR) compat.SetToolTip(common.app_tree, "") common.main.user_message("Canceled")
def __set_properties(self): # begin wxGlade: UIBugDialog.__set_properties self.SetTitle(_("Error Dialog")) self.SetSize((600, 400)) self.SetFocus() self.tc_details.SetFont(wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "")) self.tc_howto_report.SetFont(wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "")) compat.SetToolTip( self.btn_copy, _("Copy error details to clipboard") ) self.btn_ok.SetDefault()
def createBrowseButton( self): "Create the browse-button control" ID = wx.NewId() button =wx.Button(self, ID, misc.wxstr(self.buttonText)) compat.SetToolTip(button, self.toolTip) w = button.GetTextExtent(self.buttonText)[0] + 10 button.SetMinSize((w, -1)) wx.EVT_BUTTON(button, ID, self.OnBrowse) return button
def on_text(self, event): import re validation_re = re.compile(r'^[a-zA-Z_]+[\w-]*(\[\w*\])*$') name = event.GetString() OK = bool( validation_re.match( name ) ) if not OK: self.klass.SetBackgroundColour(wx.RED) compat.SetToolTip(self.klass, "Class name not valid") else: #if name in [c.widget.klass for c in common.app_tree.root.children or []]: if name in self.class_names: # if the class name is in use already, indicate in yellow self.klass.SetBackgroundColour(wx.YELLOW) compat.SetToolTip(self.klass, "Class name not unique") if self.toplevel: OK = False else: self.klass.SetBackgroundColour(wx.WHITE) compat.SetToolTip(self.klass, "") self.klass.Refresh() self.btnOK.Enable(OK) event.Skip()
def _set_tooltips(self): # set tooltips for c in (self.label_6, self.label): compat.SetToolTip(c, "The menu entry text;\nenter & for access keys (using ALT key)\nappend e.g. \\tCtrl-X for keyboard shortcut") for c in (self.label_7, self.handler): compat.SetToolTip(c, "Enter the name of an event handler method; this will be created as stub") for c in (self.label_10, self.id): compat.SetToolTip(c, "optional: enter wx ID") for c in (self.label_9, self.short_help): compat.SetToolTip(c , "This will be displayed as tooltip" ) for c in (self.label_9b, self.long_help): compat.SetToolTip( c, "This will be displayed in the status bar" ) compat.SetToolTip( self.move_up, "Move selected item up" ) compat.SetToolTip( self.move_down, "Move selected item down" ) compat.SetToolTip( self.items, "For navigation use the mouse or the up/down arrows" )
def builder(parent, index, klass=None, base=None, name=None): "factory function for EditFrame objects" global last_choices if klass is None or base is None: import window_dialog base_classes = ['wxFrame', 'wxMDIChildFrame'] klass = 'wxFrame' if common.root.language.lower( ) == 'xrc' else 'MyFrame' dialog = window_dialog.WindowDialog(klass, base_classes, 'Select frame class', True, options, last_choices) compat.SetToolTip(dialog.option_controls[0], _option_help) res = dialog.show() dialog.Destroy() if res is None: return None klass, base = res last_choices[:] = dialog.get_options() # remember for next time if config.debugging and last_choices[1]: XXX # provoke an error name = dialog.get_next_name("frame") interactive = True else: interactive = False # last_choices not to be obeyed if base == "wxFrame": base_class = EditFrame else: base_class = EditMDIChildFrame editor = base_class(name, parent, index, klass, name, "wxDEFAULT_FRAME_STYLE") editor.properties['size'].set((400, 300), activate=True) editor.design.update_label() if interactive and last_choices[0]: # add a default panel and vertical sizer to the frame import edit_sizers, widgets.panel.panel panel_editor = widgets.panel.panel.builder(editor, 0) edit_sizers._builder(panel_editor, 0) else: # just add a slot Slot(editor, 0) editor.create() return editor
def insert_tab(self, index, label): # add tab/page this needs to be done before EditPanel calls self.virtual_sizer.add_item tabs_p = self.properties["tabs"] tabs = tabs_p.get() # the value will be modified in place tabs.insert(index, [ label, ]) tabs_p.set(tabs) self.pages.insert(index, None) # adjust pos of the following pages for i, page in enumerate(self.pages[index + 1:]): pos_p = page.properties["pos"] pos_p.set(index + 2 + i) # create panel and node, add to tree pos = index + 1 window = EditPanel(self.next_pane_name(), self, -1, self.virtual_sizer, pos) window._dont_destroy = True window.node = node = Node(window) #common.app_tree.add(node, self.node, index) self.virtual_sizer.add_item(window, pos) common.app_tree.insert(node, self.node, index) if self.widget: # add to widget window.create() compat.SetToolTip(window.widget, _("Notebook page pane:\nAdd a sizer here")) self.virtual_sizer.insert_tab(index) try: wx.CallAfter(window.sel_marker.update) except AttributeError: #self._logger.exception(_('Internal Error')) if config.debugging: raise self.widget.SetSelection(index) self.properties["tabs"].update_display()
def on_mouse_events(self, event): if not self._drag_ongoing and not event.IsButton(): message = None # set cursor to indicate a possible drop x,y = event.GetPosition() editor = self.find_editor_by_pos(x, y, toplevels_only=False) if editor is not None: if not common.adding_widget: self.SetCursor(wx.STANDARD_CURSOR) else: # check whether the item can be dropped here compatible, message = editor.check_drop_compatibility() if compatible: self.SetCursor(wx.CROSS_CURSOR) # a Cursor instance else: compat.SetCursor(self, wx.CURSOR_NO_ENTRY) else: self.SetCursor(wx.STANDARD_CURSOR) compat.SetToolTip(self, message or "") event.Skip()
def insert_tab(self, index, label): # add tab/page this needs to be done before EditPanel calls self.virtual_sizer.add_item tabs_p = self.properties["tabs"] tabs = tabs_p.get() tabs.insert(index, [ label, ]) tabs_p.set(tabs) self.pages.insert(index, None) # adjust pos of the following pages for i, page in enumerate(self.pages[index + 1:]): pos_p = page.properties["pos"] pos_p.set(index + 2 + i) pos = index + 1 window = EditPanel(self.next_pane_name(suggestion=label), self, -1, self.virtual_sizer, pos) window._dont_destroy = True node = Node(window) window.node = node common.app_tree.add(node, self.node) if self.widget: window.create() compat.SetToolTip(window.widget, _("Notebook page pane:\nAdd a sizer here")) self.virtual_sizer.insert_tab(index) try: wx.CallAfter(window.sel_marker.update) except AttributeError: #self._logger.exception(_('Internal Error')) import os if 'WINGDB_ACTIVE' in os.environ: raise self.properties["tabs"].update_display()
def set_tabs(self, old_names, indices): """tabs: list of strings indices: the current indices of the tabs or None for a new tab; re-ordering is currently not supported""" keep_indices = [i for i in indices if i is not None] if keep_indices != sorted(keep_indices): raise ValueError("Re-ordering is not yet implemented") keep_indices = set(keep_indices) new_names = old_names[:] # set tab labels of existing pages, if modified for (name, ), index in zip(self.tabs, indices): if index is not None and old_names[index] != name: new_names[index] = [ name, ] if self.widget: self.widget.SetPageText(index, name) # remove tabs for index in range(len(old_names) - 1, -1, -1): if not index in keep_indices: self._is_removing_pages = True self.virtual_sizer.remove_tab( index) # remove from sizer; does not delete window self.pages[index].remove(False) # delete the page content del self.pages[index] # delete from page list del new_names[index] # delete from list of names self._is_removing_pages = False # insert/add tabs added = None for i, (name, ) in enumerate(self.tabs): index = indices[i] if index is not None: continue # old tab to be kept # actually add/insert new_names.insert( i, [ name, ] ) # this needs to be done before EditPanel calls self.virtual_sizer.add_item self.pages.insert(i, None) # create panel and node, add to tree pos = i + 1 window = EditPanel(self.next_pane_name(name), self, -1, self.virtual_sizer, pos) window._dont_destroy = True node = window.node = Node(window) # adjust pos of the following pages for p, page in enumerate(self.pages[i + 1:]): pos_p = page.properties["pos"] pos_p.set(i + 2 + p) self.virtual_sizer.add_item(window, pos) common.app_tree.insert(node, self.node, i) # add to widget if self.widget: window.create() compat.SetToolTip(window.widget, _("Notebook page pane:\nAdd a sizer here")) self.virtual_sizer.insert_tab(i) try: wx.CallAfter(window.sel_marker.update) except AttributeError: import os if 'WINGDB_ACTIVE' in os.environ: raise added = i # remember last added index for selection # select the last added tab if added is not None and self.widget: self.widget.SetSelection(added)
def finish_widget_creation(self, *args, **kwds): "Binds the popup menu handler and connects some event handlers to self.widgets; set tooltip string" if not self.widget: return self.widget.Bind(wx.EVT_RIGHT_DOWN, self.popup_menu) if self.WX_CLASS in ("wxStatusBar", ): return compat.SetToolTip(self.widget, self._get_tooltip_string())
def _set_tooltips(self): # set tooltips for c in (self.label_6, self.label): compat.SetToolTip( c, "The menu entry text;\nenter & for access keys (using ALT key)\nappend e.g. \\tCtrl-X for keyboard shortcut" ) for c in (self.label_7, self.event_handler): compat.SetToolTip( c, "Enter the name of an event handler method; this will be created as stub.\n\n" "Alternatively, for Python you may supply a lambda function like e.g.:\n" "lambda evt: self.on_menu_item('item x')") for c in (self.label_8, self.name): compat.SetToolTip( c, "optional: enter a name to store the menu item as attribute of the menu bar" ) for c in (self.label_10, self.id): compat.SetToolTip(c, "optional: enter wx ID") compat.SetToolTip(self.move_up, "Move selected item up (Alt-Up)") compat.SetToolTip(self.move_down, "Move selected item down (Alt-Down)") compat.SetToolTip( self.items, "For navigation use the mouse or the up/down arrows") compat.SetToolTip( self.move_left, "Move the selected item up by one menu level (Alt-Left)") compat.SetToolTip( self.move_right, "Move the selected item down by one menu level (Alt-Right)") compat.SetToolTip(self.ok, "Alt+O or Alt+Enter or Ctrl+Enter") compat.SetToolTip(self.cancel, "Alt+C or Alt+F4") compat.SetToolTip(self.add, "Alt+A") compat.SetToolTip(self.remove, "Alt+R") compat.SetToolTip(self.add_sep, "Alt+S")
def set_tabs(self, old_names, indices): # called from tabs proberty on Apply button """tabs: list of strings indices: the current indices of the tabs or None for a new tab; re-ordering is currently not supported""" keep_indices = [i for i in indices if i is not None] if keep_indices != sorted(keep_indices): raise ValueError("Re-ordering is not yet implemented") keep_indices = set(keep_indices) new_names = old_names[:] # set tab labels of existing pages, if modified for (name, ), index in zip(self.tabs, indices): if index is not None and old_names[index] != name: new_names[index] = [ name, ] if self.widget: self.widget.SetPageText(index, name) # remove tabs for index in range(len(old_names) - 1, -1, -1): if not index in keep_indices: self._is_removing_pages = True self.virtual_sizer.remove_tab( index) # remove from sizer; does not delete window self.pages[index]._remove( ) # delete the page content without setting the focus common.app_tree.remove( self.pages[index].node) # remove from tree del self.pages[index] # delete from page list del new_names[index] # delete from list of names self._is_removing_pages = False # insert/add tabs added = None for i, (name, ) in enumerate(self.tabs): index = indices[i] if index is not None: # old tab to be kept, just ensure that pos is correct pos_p = self.pages[i].properties["pos"] if pos_p.value != i + 1: pos_p.set(i + 1) continue # actually add/insert new_names.insert( i, [ name, ] ) # this needs to be done before EditPanel calls self.virtual_sizer.add_item self.pages.insert(i, None) # create panel and node, add to tree pos = i + 1 suggestion = "%s_%s" % (self.name, name) window = EditPanel(self.next_pane_name(suggestion), self, -1, self.virtual_sizer, pos) window._dont_destroy = True node = window.node = Node(window) # adjust pos of the following pages for p, page in enumerate(self.pages[i + 1:]): pos_p = page.properties["pos"] pos_p.set(i + 2 + p) self.virtual_sizer.add_item(window, pos) common.app_tree.insert(node, self.node, i, select=False) if self.widget: # add to widget window.create() compat.SetToolTip(window.widget, _("Notebook page pane:\nAdd a sizer here")) self.virtual_sizer.insert_tab(i) try: wx.CallAfter(window.sel_marker.update) except AttributeError: if config.debugging: raise added = i # remember last added index for selection # select the last added tab if added is not None and self.widget: self.widget.SetSelection(added) # update tree labels for node in self.node.children: node.refresh(refresh_label=True, refresh_image=False)