Example #1
0
class SpellingWidget(BoxLayout):
    N = 60
    K = 50
    font_size = 40
    total_errors = NumericProperty(0)
    current_errors = NumericProperty(0)
    correct = NumericProperty(0)
    lesson_time = NumericProperty(0)
    index = NumericProperty(0)

    def __init__(self, **kwargs):
        super(SpellingWidget, self).__init__(**kwargs)
        self._keyboard = Window.request_keyboard(self._keyboard_closed, self)
        self._keyboard.bind(on_key_down=self._on_keyboard_down)

        for i in range(self.N):
            self.ids['input'].add_widget(
                Label(font_name='arial', font_size=self.font_size))
            self.ids['reference'].add_widget(
                Label(font_name='arial', font_size=self.font_size))
        self.input = self.ids['input'].children
        self.reference = self.ids['reference'].children

        self.sound_right = sa.WaveObject.from_wave_file('resources/pop1.wav')
        self.sound_wrong = sa.WaveObject.from_wave_file(
            'resources/incorrect1.wav')
        self.sound_finished = sa.WaveObject.from_wave_file(
            'resources/kolhakavod_noomi.wav')

        self.course = Course('hebrew')
        self.lesson_number = 0
        self.index = 1
        self.index = 0
        self.reference_length = 0

        self._reset_lesson()

    def _set_reference_text(self, text):
        text = text.replace(' ', '_')
        for i in range(self.N):
            self.reference[i].text = ''
            self.input[i].text = ''
        for i, letter in enumerate(text):
            self.reference[i].text = letter
        self.reference_length = len(text)

    def _keyboard_closed(self):
        self._keyboard.unbind(on_key_down=self._on_keyboard_down)
        self._keyboard = None

    def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
        print(f'keycode = {keycode}')

        if len(keycode[1]) > 1:
            if keycode[1] not in ['backspace', 'spacebar']:
                return True

        if text == ' ':
            text = '_'

        if keycode[1] == 'backspace':
            if self.index > 0:
                self.index -= 1
                if self.input[self.index].text == self.reference[
                        self.index].text:
                    self.correct -= 1
                else:
                    self.current_errors -= 1
                self.input[self.index].text = ''
        else:
            self.index += 1
            self.input[self.index - 1].text = text
            if text == self.reference[self.index - 1].text:
                self.correct += 1
                self.sound_right.play()
            else:
                self.total_errors += 1
                self.current_errors += 1
                self.sound_wrong.play()

        if self.index == self.reference_length:
            if self.current_errors == 0:
                self.sound_finished.play()
            self.course.update(self.current_errors, self.total_errors,
                               self.correct)
            self._reset_lesson()

        return True

    def _reset_lesson(self):
        self._set_reference_text(self.course.generate(self.K))
        self.current_errors = 0
        self.total_errors = 0
        self.correct = 0
        while self.index > 0:
            self.index -= 1

    def on_index(self, *args):
        height = self.font_size
        width = self.font_size / 2
        with self.canvas:
            if self.index > 0:
                Color(0, 0, 0, 1)
                p = self.input[self.index - 1].center
                Rectangle(pos=[p[0] - width / 2, p[1] - 1.1 * height],
                          size=[width, height / 2])
            Color(0, 0, 1, 1)
            p = self.input[self.index].center
            Rectangle(pos=[p[0] - width / 2, p[1] - 1.1 * height],
                      size=[width, height / 2])
            Color(0, 0, 0, 1)
            p = self.input[self.index + 1].center
            Rectangle(pos=[p[0] - width / 2, p[1] - 1.1 * height],
                      size=[width, height / 2])