Small Kivy application
Your code is very nice! There is almost nothing for me to fault.

However, your try except statement is far too large in the try and is a bare except. Let's say, for whatever reason, your .format raises an error. You could have put the correct answer, however for reason beyond your control, the program failed. And you the user gets '1 x 3 = 3', when they put 3.

To amend this you can use the else part of the try except else finally:

try:
    user_input = int(user_input)
except ValueError:
    self.feedback = "invalid answer. Please enter numbers."
else:
    if user_input == self.answer:
        self.points += 1
        self.feedback = "right"
    else:
        self.feedback = "{} {}".format(self.question, self.answer)
    self.set_question()
    self.attempts += 1


You could say that you don't want to do user_input = int(user_input).
If this were the case then you can have the try as just int(user_input),
and have the else as your old try.



If I were to improve this more:


Better class names.

MyApp is not descriptive and is definitely not my app. TimesTabelsApp could be an alternate, unless you wish to add more to it. The same as above goes for MyWidget. You could likewise call this TimesTabelsWiget.
Put almost everything in the Python 'main'.

Window.size = (200, 100), should be in the main. It will still be global!
Try to avoid large library's when python comes built in with things you need.

I don't think I should need to install NumPy, when CPython already has randint. Sure, it's not as convenient, but asking an end user to install an entire library for something so small is kinda annoying. I know numpy is pip install numpy away, but Python can do this.

from random import randint
a, b = randint(1, 11), randint(1, 11)

A single line at the begging of each function, class and module is enough to document your code entirely.

def set_question(self):
"""Set the internal question and answer."""


Sure it's something that can be understood from the code, but what if I don't want to read the code, or can't.
Finally, I don't know why you need self.attempts = 1e-10. It seems kinda strange. And gives a large answer in set_score. I think it's to not get a ZeroDivisionError in set_score.

So you could try this:

try:
    score = self.points / self.attempts
except ZeroDivisionError:
    self.feedback = "You didn't attempt any answers"
else:
    self.feedback = "{:3.0f}% of right answers".format(score * 100)