    def draw(self):
        """
        Draws the border and/or scroll bars onto the frame managed by this
        object.
        """
        frame = self._frame

        if self.has_border:
            # Draw the basic border first.
            (colour, attr, bg) = frame.palette["borders"]
            for dy in range(frame.canvas.height):
                y = frame.canvas.start_line + dy
                if dy == 0:
                    frame.canvas.print_at(
                        self.box.box_top(frame.canvas.width), 0, y, colour, attr, bg
                    )
                elif dy == frame.canvas.height - 1:
                    frame.canvas.print_at(
                        self.box.box_bottom(frame.canvas.width), 0, y, colour, attr, bg
                    )
                else:
                    frame.canvas.print_at(self.box.v, 0, y, colour, attr, bg)
                    frame.canvas.print_at(self.box.v, frame.canvas.width - 1, y, colour, attr, bg)

            # Now the title
            (colour, attr, bg) = frame.palette["title"]
            title_width = self.string_len(frame.title)
            frame.canvas.print_at(
                frame.title, (frame.canvas.width - title_width) // 2, frame.canvas.start_line,
                colour, attr, bg
            )

        if self.can_scroll and frame.canvas.height > 5:
            self.scroll_bar.update()
Draws the border and/or scroll bars onto the frame managed by this
object.
asciimatics/widgets/frame.py