def insert(self, index=None, *nodes): properties = [node.get_altered_options() for node in nodes] nodes = super().insert(index, *nodes) index = len(self.nodes) if index is None else index for i, node in enumerate(nodes): node._menu = self._menu self._menu.insert(index, node.type) menu_config(self._menu, index, **properties[i]) index += 1
def insert(self, index=None, *nodes): for node in nodes: # cache previous config which may be unobtainable after insert node._prev_options = node.get_altered_options() nodes = super().insert(index, *nodes) index = len(self.nodes) if index is None else index for i, node in enumerate(nodes, index): node._menu = self._menu self._menu.insert(i, node.type) menu_config(self._menu, i, **node._prev_options)
def insert(self, index=None, *nodes): for node in nodes: # cache previous config which may be unobtainable after insert node._prev_options = node.get_altered_options() # get the nodes that have been inserted whether cloned or otherwise nodes = super().insert(index, *nodes) index = len(self.nodes) if index is None else index for i, node in enumerate(nodes, index): node._menu = self.sub_menu self.sub_menu.insert(i, node.type) # apply node properties from backup menu_config(self.sub_menu, i, **node._prev_options)
def insert(self, index=None, *nodes): # create a backup of node properties in case cloning takes place properties = [node.get_altered_options() for node in nodes] # get the nodes that have actually been inserted whether cloned or otherwise nodes = super().insert(index, *nodes) index = len(self.nodes) if index is None else index for i, node in enumerate(nodes): node._menu = self.sub_menu # apply node properties from backup try: self.sub_menu.insert(index, node.type) menu_config(self.sub_menu, self.get_index(), **properties[i]) except tk.TclError: logging.error("Menu item insert failed") finally: index += 1
def get_item_options(menu, index): keys = menu_config(menu, index) if 'menu' in keys: keys.pop('menu') return { key: keys[key][-1] for key in keys if keys[key][-1] != keys[key][-2] }
def _menu_from_xml(cls, node, menu=None, widget=None): for sub_node in node: attrib = cls.attrib(sub_node) if sub_node.tag in MenuConverter._types and menu is not None: menu.add(sub_node.tag) menu_config(menu, menu.index(tk.END), **attrib.get("menu", {})) continue obj_class = cls._get_class(sub_node) if obj_class == legacy.Menu: menu_obj = obj_class(widget, **attrib.get("attr", {})) if widget: widget.configure(menu=menu_obj) elif menu: menu.add(tk.CASCADE, menu=menu_obj) menu_config(menu, menu.index(tk.END), **attrib.get("menu", {})) cls._menu_from_xml(sub_node, menu_obj)
def get_options(self): keys = menu_config(self._menu, self.get_index()) return {key: keys[key][-1] for key in keys}
def get_altered_options(self): keys = menu_config(self._menu, self.get_index()) return {key: keys[key][-1] for key in keys if keys[key][-1] != keys[key][-2]}
def get_option(self, key): return menu_config(self._menu, self.get_index(), key)
def _on_item_change(self, prop, value): # Called when the style of a menu item changes for node in self._tree.get(): menu_config(node._menu, node.get_index(), **{prop: value}) # For changes in label we need to change the label on the node as well node node.label = node._menu.entrycget(node.get_index(), 'label')