  
      def get_all_children_config(self, widget, child_list):
          """ Return all children, recursively, of given widget """
          for child in widget.winfo_children():
              if child.winfo_ismapped():
                  id_ = str(child)
                  if child.__class__.__name__ == "MultiOption":
                      # MultiOption checkbox groups are a custom object with additional parameter
                      # requirements.
                      custom_kwargs = dict(
                          value=child._value,  # pylint:disable=protected-access
                          variable=child._master_variable)  # pylint:disable=protected-access
                  else:
                      custom_kwargs = dict()
  
                  child_list.append({
                      "class": child.__class__,
                      "id": id_,
                      "tooltip": _RECREATE_OBJECTS["tooltips"].get(id_, None),
 
</s> remove         """ Return all children, recursively, of given widget """
 </s> add         """ Return all children, recursively, of given widget.

        Parameters
        ----------
        widget: tkinter widget
            The widget to recursively obtain the configurations of each child
        child_list: list
            The list of child configurations already collected

        Returns
        -------
        list
            The list of configurations for all recursive children of the given widget
         """
        unpack = set() </s> remove                     "id": id_,
                    "tooltip": _RECREATE_OBJECTS["tooltips"].get(id_, None),
                    "rc_menu": _RECREATE_OBJECTS["contextmenus"].get(str(id_), None),
 </s> add                     "id": str(child),
                    "tooltip": _RECREATE_OBJECTS["tooltips"].get(str(child), None),
                    "rc_menu": _RECREATE_OBJECTS["contextmenus"].get(str(child), None), </s> remove                                 "custom_kwargs": dict()}
 </s> add                                 "custom_kwargs": self._custom_kwargs(child)} </s> remove         """ Compile all children recursively in correct order if not already compiled """
 </s> add         """ Compile all children recursively in correct order if not already compiled and add
        to :attr:`_widget_config` """
            # Hidden Toggle Frame boxes need to be mapped
            if child.winfo_ismapped() or "toggledframe_subframe" in str(child):
                not_mapped = not child.winfo_ismapped()
                # ToggleFrame is a custom widget that creates it's own children and handles
                # bindings on the headers, to auto-hide the contents. To ensure that all child
                # information (specifically pack information) can be collected, we need to pack
                # any hidden sub-frames. These are then hidden again once collected.
                if not_mapped and (child.winfo_name() == "toggledframe_subframe" or
                                   child.winfo_name() == "chkbuttons"):
                    child.pack(fill=tk.X, expand=True)
                    child.update_idletasks()  # Updates the packing info of children
                    unpack.add(child)

                if child.winfo_name().startswith("toggledframe_header"):
                    # Headers should be entirely handled by parent widget
                    continue
  
      def get_all_children_config(self, widget, child_list):
          """ Return all children, recursively, of given widget """
          for child in widget.winfo_children():
            # Hidden Toggle Frame boxes need to be mapped
            if child.winfo_ismapped() or "toggledframe_subframe" in str(child):
                not_mapped = not child.winfo_ismapped()
                # ToggleFrame is a custom widget that creates it's own children and handles
                # bindings on the headers, to auto-hide the contents. To ensure that all child
                # information (specifically pack information) can be collected, we need to pack
                # any hidden sub-frames. These are then hidden again once collected.
                if not_mapped and (child.winfo_name() == "toggledframe_subframe" or
                                   child.winfo_name() == "chkbuttons"):
                    child.pack(fill=tk.X, expand=True)
                    child.update_idletasks()  # Updates the packing info of children
                    unpack.add(child)

                if child.winfo_name().startswith("toggledframe_header"):
                    # Headers should be entirely handled by parent widget
                    continue
            # Hidden Toggle Frame boxes need to be mapped
            if child.winfo_ismapped() or "toggledframe_subframe" in str(child):
                not_mapped = not child.winfo_ismapped()
                # ToggleFrame is a custom widget that creates it's own children and handles
                # bindings on the headers, to auto-hide the contents. To ensure that all child
                # information (specifically pack information) can be collected, we need to pack
                # any hidden sub-frames. These are then hidden again once collected.
                if not_mapped and (child.winfo_name() == "toggledframe_subframe" or
                                   child.winfo_name() == "chkbuttons"):
                    child.pack(fill=tk.X, expand=True)
                    child.update_idletasks()  # Updates the packing info of children
                    unpack.add(child)

                if child.winfo_name().startswith("toggledframe_header"):
                    # Headers should be entirely handled by parent widget
                    continue
            # Hidden Toggle Frame boxes need to be mapped
            if child.winfo_ismapped() or "toggledframe_subframe" in str(child):
                not_mapped = not child.winfo_ismapped()
                # ToggleFrame is a custom widget that creates it's own children and handles
                # bindings on the headers, to auto-hide the contents. To ensure that all child
                # information (specifically pack information) can be collected, we need to pack
                # any hidden sub-frames. These are then hidden again once collected.
                if not_mapped and (child.winfo_name() == "toggledframe_subframe" or
                                   child.winfo_name() == "chkbuttons"):
                    child.pack(fill=tk.X, expand=True)
                    child.update_idletasks()  # Updates the packing info of children
                    unpack.add(child)

                if child.winfo_name().startswith("toggledframe_header"):
                    # Headers should be entirely handled by parent widget
                    continue
            # Hidden Toggle Frame boxes need to be mapped
            if child.winfo_ismapped() or "toggledframe_subframe" in str(child):
                not_mapped = not child.winfo_ismapped()
                # ToggleFrame is a custom widget that creates it's own children and handles
                # bindings on the headers, to auto-hide the contents. To ensure that all child
                # information (specifically pack information) can be collected, we need to pack
                # any hidden sub-frames. These are then hidden again once collected.
                if not_mapped and (child.winfo_name() == "toggledframe_subframe" or
                                   child.winfo_name() == "chkbuttons"):
                    child.pack(fill=tk.X, expand=True)
                    child.update_idletasks()  # Updates the packing info of children
                    unpack.add(child)

                if child.winfo_name().startswith("toggledframe_header"):
                    # Headers should be entirely handled by parent widget
                    continue
            # Hidden Toggle Frame boxes need to be mapped
            if child.winfo_ismapped() or "toggledframe_subframe" in str(child):
                not_mapped = not child.winfo_ismapped()
                # ToggleFrame is a custom widget that creates it's own children and handles
                # bindings on the headers, to auto-hide the contents. To ensure that all child
                # information (specifically pack information) can be collected, we need to pack
                # any hidden sub-frames. These are then hidden again once collected.
                if not_mapped and (child.winfo_name() == "toggledframe_subframe" or
                                   child.winfo_name() == "chkbuttons"):
                    child.pack(fill=tk.X, expand=True)
                    child.update_idletasks()  # Updates the packing info of children
                    unpack.add(child)

                if child.winfo_name().startswith("toggledframe_header"):
                    # Headers should be entirely handled by parent widget
                    continue
            # Hidden Toggle Frame boxes need to be mapped
            if child.winfo_ismapped() or "toggledframe_subframe" in str(child):
                not_mapped = not child.winfo_ismapped()
                # ToggleFrame is a custom widget that creates it's own children and handles
                # bindings on the headers, to auto-hide the contents. To ensure that all child
                # information (specifically pack information) can be collected, we need to pack
                # any hidden sub-frames. These are then hidden again once collected.
                if not_mapped and (child.winfo_name() == "toggledframe_subframe" or
                                   child.winfo_name() == "chkbuttons"):
                    child.pack(fill=tk.X, expand=True)
                    child.update_idletasks()  # Updates the packing info of children
                    unpack.add(child)

                if child.winfo_name().startswith("toggledframe_header"):
                    # Headers should be entirely handled by parent widget
                    continue
            # Hidden Toggle Frame boxes need to be mapped
            if child.winfo_ismapped() or "toggledframe_subframe" in str(child):
                not_mapped = not child.winfo_ismapped()
                # ToggleFrame is a custom widget that creates it's own children and handles
                # bindings on the headers, to auto-hide the contents. To ensure that all child
                # information (specifically pack information) can be collected, we need to pack
                # any hidden sub-frames. These are then hidden again once collected.
                if not_mapped and (child.winfo_name() == "toggledframe_subframe" or
                                   child.winfo_name() == "chkbuttons"):
                    child.pack(fill=tk.X, expand=True)
                    child.update_idletasks()  # Updates the packing info of children
                    unpack.add(child)

                if child.winfo_name().startswith("toggledframe_header"):
                    # Headers should be entirely handled by parent widget
                    continue
            # Hidden Toggle Frame boxes need to be mapped
            if child.winfo_ismapped() or "toggledframe_subframe" in str(child):
                not_mapped = not child.winfo_ismapped()
                # ToggleFrame is a custom widget that creates it's own children and handles
                # bindings on the headers, to auto-hide the contents. To ensure that all child
                # information (specifically pack information) can be collected, we need to pack
                # any hidden sub-frames. These are then hidden again once collected.
                if not_mapped and (child.winfo_name() == "toggledframe_subframe" or
                                   child.winfo_name() == "chkbuttons"):
                    child.pack(fill=tk.X, expand=True)
                    child.update_idletasks()  # Updates the packing info of children
                    unpack.add(child)

                if child.winfo_name().startswith("toggledframe_header"):
                    # Headers should be entirely handled by parent widget
                    continue
            # Hidden Toggle Frame boxes need to be mapped
            if child.winfo_ismapped() or "toggledframe_subframe" in str(child):
                not_mapped = not child.winfo_ismapped()
                # ToggleFrame is a custom widget that creates it's own children and handles
                # bindings on the headers, to auto-hide the contents. To ensure that all child
                # information (specifically pack information) can be collected, we need to pack
                # any hidden sub-frames. These are then hidden again once collected.
                if not_mapped and (child.winfo_name() == "toggledframe_subframe" or
                                   child.winfo_name() == "chkbuttons"):
                    child.pack(fill=tk.X, expand=True)
                    child.update_idletasks()  # Updates the packing info of children
                    unpack.add(child)

                if child.winfo_name().startswith("toggledframe_header"):
                    # Headers should be entirely handled by parent widget
                    continue
            # Hidden Toggle Frame boxes need to be mapped
            if child.winfo_ismapped() or "toggledframe_subframe" in str(child):
                not_mapped = not child.winfo_ismapped()
                # ToggleFrame is a custom widget that creates it's own children and handles
                # bindings on the headers, to auto-hide the contents. To ensure that all child
                # information (specifically pack information) can be collected, we need to pack
                # any hidden sub-frames. These are then hidden again once collected.
                if not_mapped and (child.winfo_name() == "toggledframe_subframe" or
                                   child.winfo_name() == "chkbuttons"):
                    child.pack(fill=tk.X, expand=True)
                    child.update_idletasks()  # Updates the packing info of children
                    unpack.add(child)

                if child.winfo_name().startswith("toggledframe_header"):
                    # Headers should be entirely handled by parent widget
                    continue
  
                  child_list.append({
                      "class": child.__class__,
                      "id": id_,
                      "tooltip": _RECREATE_OBJECTS["tooltips"].get(id_, None),
keep keep keep keep replace replace replace replace replace replace replace replace replace replace keep keep keep keep keep
 GUI - Make groups collapsible 
lib/gui/control_helper.py