(self)
Ok, so let me explain what is going on, this generator/coroutine
            changes the width of the line continuosly using the width_gen
            generator. We use it by calling it 20 times per second. The tricky
            part is stopping the scheduled calls. The way to tell Kivy to stop
            calling is to return a False value, and to do that we need to call
            this coroutine itself, which may be executing or not at that
            precise moment.

            That is where throw comes in, allowing for exceptions to be thrown
            on during the execution, hijacking the current execution (like a
            fast interruption), we need to return from this exception, in which
            we do not care about the value, and then return False on the
            regular execution in order to stop the calls.
Ok, so let me explain what is going on, this generator/coroutine
            changes the width of the line continuosly using the width_gen
            generator. We use it by calling it 20 times per second. The tricky
            part is stopping the scheduled calls. The way to tell Kivy to stop
            calling is to return a False value, and to do that we need to call
            this coroutine itself, which may be executing or not at that
            precise moment.
Ok so let me explain what is going on this generator / coroutine changes the width of the line continuosly using the width_gen generator . We use it by calling it 20 times per second . The tricky part is stopping the scheduled calls . The way to tell Kivy to stop calling is to return a False value and to do that we need to call this coroutine itself which may be executing or not at that precise moment .
def _change_width(self):
        """ Ok, so let me explain what is going on, this generator/coroutine
            changes the width of the line continuosly using the width_gen
            generator. We use it by calling it 20 times per second. The tricky
            part is stopping the scheduled calls. The way to tell Kivy to stop
            calling is to return a False value, and to do that we need to call
            this coroutine itself, which may be executing or not at that
            precise moment.

            That is where throw comes in, allowing for exceptions to be thrown
            on during the execution, hijacking the current execution (like a
            fast interruption), we need to return from this exception, in which
            we do not care about the value, and then return False on the
            regular execution in order to stop the calls."""
        try:
            for value in self._width_gen():
                self.lin.width = value
                yield
        except StopIteration:
            self.lin.width = 2
            yield
            yield False
def _change_width ( self ) : try : for value in self . _width_gen ( ) : self . lin . width = value yield except StopIteration : self . lin . width = 2 yield yield False