docs: def destroy(self):
          """Recursively destroy all Controllers
  
          The method remove all controllers, which calls the destroy method of the child controllers. Then,
          all registered models are relieved and and the widget hand by the initial view argument is destroyed.
          """
          self.disconnect_all_signals()
          controller_names = [key for key in self.__child_controllers]
          for controller_name in controller_names:
              self.remove_controller(controller_name)
          self.relieve_all_models()
          if self.parent:
              self.__parent = None
          if self._view_initialized:
              # print(self.__class__.__name__, "destroy view", self.view, self)
              self.view.get_top_widget().destroy()
              self.view = None
              self._Observer__PROP_TO_METHS.clear()  # prop name --> set of observing methods
              self._Observer__METH_TO_PROPS.clear()  # method --> set of observed properties
              self._Observer__PAT_TO_METHS.clear() # like __PROP_TO_METHS but only for pattern names (to optimize search)
              self._Observer__METH_TO_PAT.clear()  # method --> pattern
              self._Observer__PAT_METH_TO_KWARGS.clear()  # (pattern, method) --> info
              self.observe = None
          else:
              logger.warning("The controller {0} seems to be destroyed before the view was fully initialized. {1} "
                             "Check if you maybe do not call {2} or there exist most likely threading problems."
                             "".format(self.__class__.__name__, self.model, ExtendedController.register_view))