У меня есть простое приложение 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?