      return Tooltip(widget, text=text, wraplength=wraplength)
  
  
  def add_command(name, func):
      """ For controls that execute commands, the command must be added to the _COMMAND list so that
          it can be added back to the widget during cloning """
      logger.debug("Adding to commands: %s - %s", name, func)
      _RECREATE_OBJECTS["commands"][name] = func
  
 
</s> remove     _COMMANDS[name] = func
 </s> add     _RECREATE_OBJECTS["commands"][name] = func </s> remove     def __init__(self, parent, options, label_width=20, columns=1, option_columns=4,
                 header_text=None, blank_nones=True):
 </s> add     Parameters
    ----------
    parent: tk object
        Parent widget that should hold this control panel
    options: list of  ControlPanelOptions objects
        The list of controls that are to be built into this control panel
    label_width: int, optional
        The width that labels for controls should be set to.
        Defaults to 20
    columns: int, optional
        The maximum number of columns that this control panel should be able
        to accomodate. Setting to 1 means that there will only be 1 column
        regardless of how wide the control panel is. Higher numbers will
        dynamically fill extra columns if space permits. Defaults to 1
    option_columns: int, optional
        For checkbutton and radiobutton containers, how many options should
        be displayed on each row. Defaults to 4
    header_text: str, optional
        If provided, will place an information box at the top of the control
        panel with these contents.
    blank_nones: bool, optional
        How the control panel should handle Nones. If set to True then Nones
        will be converted to empty strings. Default: False
    """

    def __init__(self, parent, options,  # pylint:disable=too-many-arguments
                 label_width=20, columns=1, option_columns=4, header_text=None, blank_nones=True): </s> remove     _TOOLTIPS[str(widget)] = {"text": text,
                              "wraplength": wraplength}
 </s> add     _RECREATE_OBJECTS["tooltips"][str(widget)] = {"text": text,
                                                  "wraplength": wraplength} </s> remove     """ A Panel for holding controls
        Also keeps tally if groups passed in, so that any options with special
        processing needs are processed in the correct group frame """
 </s> add     """
    A Control Panel to hold control panel options.
    This class handles all of the formatting, placing and TK_Variables
    in a consistent manner.

    It can also provide dynamic columns for resizing widgets </s> remove     def slider_control(self, dtype, rounding, min_max):
 </s> add     def slider_control(self):
def get_contextmenu(widget):
    """ Create a context menu, store its mapping and return """
    rc_menu = ContextMenu(widget)
    _RECREATE_OBJECTS["contextmenus"][str(widget)] = rc_menu
    logger.debug("Adding to Context menu: (widget: %s. rc_menu: %s)",
                 widget, rc_menu)
    return rc_menu


      return Tooltip(widget, text=text, wraplength=wraplength)
  
  
def get_contextmenu(widget):
    """ Create a context menu, store its mapping and return """
    rc_menu = ContextMenu(widget)
    _RECREATE_OBJECTS["contextmenus"][str(widget)] = rc_menu
    logger.debug("Adding to Context menu: (widget: %s. rc_menu: %s)",
                 widget, rc_menu)
    return rc_menu


  def add_command(name, func):
      """ For controls that execute commands, the command must be added to the _COMMAND list so that
          it can be added back to the widget during cloning """
      logger.debug("Adding to commands: %s - %s", name, func)
      _RECREATE_OBJECTS["commands"][name] = func
  
keep keep add keep keep keep keep keep keep
 GUI Fixups

- GUI Bugfix: Startup options - fix min/max thresholds
- GUI Bugfix: Make console read-only
- GUI Bugfix: Rightclick menu for recreated widgets
- Enhancement: Create ControlPanelOptions Class + migrate options 
lib/gui/control_helper.py