    def __init__(self, screen, height, width, data=None, on_load=None,
                 has_border=True, hover_focus=False, name=None, title=None,
                 x=None, y=None, has_shadow=False, reduce_cpu=False, is_modal=False,
                 can_scroll=True):
        """
        :param screen: The Screen that owns this Frame.
        :param width: The desired width of the Frame.
        :param height: The desired height of the Frame.
        :param data: optional data dict to initialize any widgets in the frame.
        :param on_load: optional function to call whenever the Frame reloads.
        :param has_border: Whether the frame has a border box. Defaults to True.
        :param hover_focus: Whether hovering a mouse over a widget (i.e. mouse move events)
            should change the input focus.  Defaults to false.
        :param name: Optional name to identify this Frame.  This is used to reset data as needed
            from on old copy after the screen resizes.
        :param title: Optional title to display if has_border is True.
        :param x: Optional x position for the top left corner of the Frame.
        :param y: Optional y position for the top left corner of the Frame.
        :param has_shadow: Optional flag to indicate if this Frame should have a shadow when
            drawn.
        :param reduce_cpu: Whether to minimize CPU usage (for use on low spec systems).
        :param is_modal: Whether this Frame is "modal" - i.e. will stop all other Effects from
            receiving input events.
        :param can_scroll: Whether a scrollbar should be available on the border, or not.
        """
        super().__init__(screen)
        self._focus = 0
        self._max_height = 0
        self._layouts = []
        self._effects = []
        self._canvas = Canvas(screen, height, width, x, y)
        self._data = None
        self._on_load = on_load
        self._hover_focus = hover_focus
        self._initial_data = data if data else {}
        self._title = None
        self.title = title  # Use property to re-format text as required.
        self._has_shadow = has_shadow
        self._reduce_cpu = reduce_cpu
        self._is_modal = is_modal
        self._has_focus = False
        self._border_mgr = _BorderManager(self, has_border, can_scroll)

        # A unique name is needed for cloning.  Try our best to get one!
        self._name = title if name is None else name

        # Flag to catch recursive calls inside the data setting.  This is
        # typically caused by callbacks subsequently trying to re-use functions.
        self._in_call = False

        # Now set up any passed data - use the public property to trigger any
        # necessary updates.
        self.data = deepcopy(self._initial_data)

        # Ensure that we have the default palette in place
        self._theme = None
        self.set_theme("default")
:param screen: The Screen that owns this Frame.
:param width: The desired width of the Frame.
:param height: The desired height of the Frame.
:param data: optional data dict to initialize any widgets in the frame.
:param on_load: optional function to call whenever the Frame reloads.
:param has_border: Whether the frame has a border box. Defaults to True.
:param hover_focus: Whether hovering a mouse over a widget (i.e. mouse move events)
should change the input focus.  Defaults to false.
:param name: Optional name to identify this Frame.  This is used to reset data as needed
from on old copy after the screen resizes.
:param title: Optional title to display if has_border is True.
:param x: Optional x position for the top left corner of the Frame.
:param y: Optional y position for the top left corner of the Frame.
:param has_shadow: Optional flag to indicate if this Frame should have a shadow when
drawn.
:param reduce_cpu: Whether to minimize CPU usage (for use on low spec systems).
:param is_modal: Whether this Frame is "modal" - i.e. will stop all other Effects from
receiving input events.
:param can_scroll: Whether a scrollbar should be available on the border, or not.
asciimatics/widgets/frame.py