Python: как освободить ключ `enter` в python - PullRequest
0 голосов
/ 19 мая 2018

Я использую python-2.7 и kivy. Когда я запускаю test.py, тогда отображается форма с 2 TextInput.Я перехожу из одного TextInput в другой TextInput с помощью клавиши Enter. Когда я не заполняю оба поля TextInput и перехожу с помощью клавиши ввода. После этого я нажимаю кнопку focused ok и нажимаю клавишу Enter, затем я вызываюinsert и убедитесь, что оно пустое или нет. Если оно пустое, тогда я устанавливаю focus на Name TextInput с помощью этой функции.

def insert(self):
    if self.name.text == "":
        self.name.focus = True

После фокуса name TextInput вызывает root.on_enter_text_input()по умолчанию. Так что переходите к следующему TextInput. Но я хочу сосредоточиться на name TextInput.Может кто-нибудь сказать мне, как остановить функцию root.on_enter_text_input() в это время, когда я вызываю функцию insert?[! [введите описание изображения здесь] [1]] [1]

test.py

from kivy.uix.screenmanager import Screen
from kivy.app import App
from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty, ObjectProperty
from kivy.clock import Clock

Window.clearcolor = (0.5, 0.5, 0.5, 1)
Window.size = (500, 300)


class User(Screen):
    name = ObjectProperty(None)
    class1 = ObjectProperty(None)
    #cls = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(User, self).__init__(**kwargs)
        Window.bind(on_key_down=self._on_keyboard_down)
        Clock.schedule_once(self.name_focus, 1)

    def name_focus(self, *args):
        self.name.focus = True

    def on_enter_text_input(self):
        self.class1.focus = True

    def on_enter_text_input1(self):
        self.postUser.focus = True
        self.postUser.background_color = [0.5, 0.5, 0.5, 1]

    def _on_keyboard_down(self, instance, keyboard, keycode, text, modifiers):
        if (hasattr(self.postUser, 'focus') and self.postUser.focus) and keycode == 40:  # 40 - Enter key pressed
            self.postUser.focus = False
            self.postUser.background_color = [0, 0, 1, 0.5]
            self.insert()


    def insert(self):
        if self.name.text == "":
            self.name.focus = True

class Test(App):

    def build(self):
        return self.root


if __name__ == '__main__':
    Test().run()

test.kv

#:kivy 1.10.0

User:
    name: name
    class1:class1
    postUser : postUser
    BoxLayout:
        orientation: "vertical"
        GridLayout:
            cols: 2
            padding: 20, 20
            spacing: 10, 10

            Label:
                text: "Name"
                text_size: self.size
                valign: 'middle'
            TextInput:
                id:name
                multiline: False
                text_size: self.size
                on_text_validate: root.on_enter_text_input()
            Label:
                text: "Class"
                text_size: self.size
                valign: 'middle'
            TextInput:
                id:class1
                multiline: False
                text_size: self.size
                on_text_validate: root.on_enter_text_input1()

        GridLayout:
            cols: 2
            padding: 0, 0
            spacing: 5, 0
            size_hint: .5, .35
            pos_hint: {'x': .25, 'y': 0}

            Button:
                id:postUser
                size_hint_x: .5
                text: "Ok"
                focus: False
                on_release:
                    root.insert()
                    root.dismiss()

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Решением является добавление return True, указывающее, что мы нажали клавишу Enter и не хотим, чтобы она распространялась дальше.Пожалуйста, обратитесь к фрагментам ниже.

Фрагменты

def _on_keyboard_down(self, instance, keyboard, keycode, text, modifiers):
    if (hasattr(self.postUser, 'focus') and self.postUser.focus) and keycode == 40:  # 40 - Enter key pressed
        self.postUser.focus = False
        self.postUser.background_color = [0, 0, 1, 0.5]
        self.insert()
        return True

Выход

enter image description here

0 голосов
/ 21 мая 2018

Вы можете сделать это, как показано ниже

class User(Screen):
    name = ObjectProperty(None)
    class1 = ObjectProperty(None)
    #cls = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(User, self).__init__(**kwargs)
        self.initial_focusing = False
        Window.bind(on_key_down=self._on_keyboard_down)
        Clock.schedule_once(self.name_focus, 1)

    def name_focus(self, *args):
        self.name.focus = True

    def on_enter_text_input(self):
        if self.initial_focusing:
           self.initial_focusing = False
        else:
           self.class1.focus = True

    def on_enter_text_input1(self):
        self.postUser.focus = True
        self.postUser.background_color = [0.5, 0.5, 0.5, 1]

    def _on_keyboard_down(self, instance, keyboard, keycode, text, modifiers):
        if (hasattr(self.postUser, 'focus') and self.postUser.focus) and keycode == 40:  # 40 - Enter key pressed
            self.postUser.focus = False
            self.postUser.background_color = [0, 0, 1, 0.5]
            self.insert()


    def insert(self):
        if self.name.text == "":
            self.initial_focusing = True
            self.name.focus = True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...