Как создать экран входа в систему с помощью Kivy - PullRequest
2 голосов
/ 30 января 2020

Желаемый результат

В настоящее время мой код выглядит следующим образом:

class KeypadButton(Factory.Button):
    def on_touch_down(self, touch):
        if self.collide_point(*touch.pos):
            FocusBehavior.ignored_touch.append(touch)
        return super(KeypadButton, self).on_touch_down(touch)

class Keypad(Factory.GridLayout):
    target = Factory.ObjectProperty(None, allownone=True)

    def __init__(self, **kwargs):
        super(Keypad, self).__init__(**kwargs)
        self.cols = 3
        for x in list(range(1, 10)) + ['<-', 0, 'Enter']:
            btn = KeypadButton(text=str(x), on_release=self._on_release)
            self.add_widget(btn)

    def _on_focus(self, ti, value):
        self.target = value and ti

    def _on_release(self, instance, *largs):
        if self.target:
            if instance.text == 'Enter':
                print("Enter: {}".format(self.target.text))
                self.target.text = ''
            elif instance.text == '<-':
                if self.target.text:
                    self.target.text = self.target.text[:-1]
            else:
                self.target.text += str(instance.text)

runTouchApp(Builder.load_string('''
<KeypadTextInput@TextInput>:
    keypad: None
    on_focus: root.keypad._on_focus(*args)

BoxLayout:
    orientation: 'vertical'
    KeypadTextInput:
        keypad: keypad
    Keypad:
        id: keypad
        size_hint_x: 0.5
        pos_hint: {'center_x': 0.5}
'''))

Чего я хочу добиться, так это того, чтобы при нажатии 12345 экран входа в систему исчезал и новые всплывающие окна. У меня есть изображение в формате, который дает следующее, чего я хочу достичь.

РЕДАКТИРОВАТЬ:

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Во-первых, когда речь заходит о фокусе, я думаю, это зависит от того, как вы загружаете экран. Это ваш root виджет или экран, который вы загружаете? Поскольку ваш виджет виджет root, вы, вероятно, захотите сделать это при запуске своего приложения. Вы можете использовать событие 'on_start' для этого

class MyApp(App):
    def on_start(self,*args):
        self.ids.mytextinput.focus = True   #replace mytextinput with whatever id name you give to your text input in the kv string

Для ввода текста, запускающего события, когда вы набираете определенное количество цифр, которые вы можете использовать on_text. Для этого я думаю, что лучше всего создать экземпляр своего собственного класса, если вы только начинаете.

class KeyPadTextInput(TextInput):
    def on_text(self,*args):
        if len(self.text)==3:
            #put your python code here
            #you can launch MyApp functions by using app.function_name()

Еще одна вещь, которую я заметил, это то, что вы используете on_focus для запуска вашего собственного события '_on_focus' с тем же * арг. Вы могли бы добиться того же, удалив on_focus из вашей строки kv и отрегулировав событие on_focus класса, вызвав super (). On_focus (* args), чтобы унаследованная функция также запускалась следующим образом:

class KeyPadTextInput(TextInput):
    def on_focus(self,*args):
        #your code either before the super call
        super().on_focus(*args)
        #or your code after the super call

Hope это помогает направить вас в правильном направлении.

PS. TextInputs имеет несколько встроенных фильтров ввода, таких как фильтр, так что вы можете вводить только цифры! Это удобно, если клавиатура пользователя подходит или у нее есть доступ к ней. в строке kv просто добавьте

input_filter: 'int'
0 голосов
/ 30 января 2020

Не уверен, насколько точно вы хотите приблизиться к желаемому результату, но вы можете стать намного ближе, просто изменив «kv» на:

<KeypadTextInput@TextInput>:
    keypad: None
    on_focus: root.keypad._on_focus(*args)

BoxLayout:
    orientation: 'vertical'
    KeypadTextInput:
        keypad: keypad
    Keypad:
        id: keypad
        size_hint_x: 0.5
        pos_hint: {'center_x': 0.5}
...