Python и Kivy - клавиатура on_key_down срабатывает дважды и ведет себя странно - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть простое приложение kivy в python с ScreenManager и Screen с именем MainWindow.
У меня есть файл main.kv, в котором у меня есть только FloatLayout с идентификатором mainLayout
В моем классе MainWindow я есть этот простой код:

import kivy
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.properties import ObjectProperty
from kivy.core.window import Window


class WindowManager(ScreenManager):
    pass


class MainWindow(Screen):

    def __init__(self, **kw):
        super().__init__(**kw)
        self.keyboard = Window.request_keyboard(None, self)
        self.keyboard.bind(on_key_down=self.key_pressed)
        self.quit_requests = 0

    def key_pressed(self, keyboard, keycode, text, modifiers):
        print(keycode[1])
        key = keycode[1]

        if key == "q":
            print("Pressed q")
            self.quit_requests += 1
            if self.quit_requests == 3:
                exit()
        else:
            print("Pressed something")
            self.quit_requests = 0
        print("End of method")


kv = Builder.load_file("GUI/main.kv")


class MainApp(App):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def build(self):
        self.title = "Neural Network"
        return kv

Файл main.kv:

WindowManager:
    MainWindow:

:
    FloatLayout:
        size_hint: None, None
        id: mainLayout
        pos: 0, 0
        width: root.width
        height: root.height
        canvas:
            Color:
                rgba: .1, .1, .1, 1
            Rectangle:
                pos: mainLayout.pos
                size: mainLayout.size

Затем из основного скрипта я вызываю

Config.set('graphics', 'width', '400')
Config.set('graphics', 'height', '400')
Config.set('graphics', 'resizable', True)
Config.set('kivy', 'exit_on_escape', '0')
Config.set('input', 'mouse', 'mouse,multitouch_on_demand')
Config.set('graphics', 'window_state', 'normal')
Config.set('graphics', 'fullscreen', False)
Config.write()

MainApp().run()

Что я пытаюсь Достигнутое здесь заключается в том, что когда пользователь нажимает кнопку на клавиатуре, я делаю что-то, а когда пользователь нажимает клавишу «q» 3 раза подряд, я закрываю приложение.
Что происходит с кодом выше:
каждый раз, когда я нажимаю кнопку, я вижу соответствующие напечатанные сообщения дважды , поэтому, если я нажимаю "e" один раз в консоли, я вижу:

e
Pressed something
End of method
e
Pressed something
End of method

Если я нажимаю qi, см .:

q
Pressed q
End of method
q
Pressed q
End of method

В этот момент я предполагаю, что метод "key_pressed" вызывается дважды по какой-то причине, и поэтому я вижу двойные отпечатки, но в то же время , если это так, я должен также предположить, что приложение sh может выйти после того, как я нажал "q" только 2 раза, но это не так. Приложение корректно завершает работу сразу после 3 раз, когда я нажал "q"
Почему и как предотвратить этот двойной вызов метода от kivy?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...