如何处理在Kivy同时按下的几个键?

时间:2014-03-23 02:27:01

标签: python-2.7 keyboard-events kivy

我打算用kivy做一个小型的跨平台游戏,当我测试从PC上的键盘输入的方式时,我有点意外。

Kivy似乎没有处理与on_keyboard_down事件同时按下的几个键,当你在kivy中同时按下多个键时,官方文档中使用的键盘类通过最后一个按下的键来改变所有钥匙被按下了。

看起来键盘类的目的是让用户输入应用程序,因为当您按下某个键几秒钟时,第一个键事件和其他键事件之间会有一点延迟(最后每个步骤一个) ,就像打字时可以注意到的那样。

这是我为键盘交互式hello世界编写的代码。

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.scatter import Scatter
from kivy.core.window import Window

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

    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 str(keyboard)+' '+str(keycode[1])+' '+str(text)+' '+str(modifiers)
        if keycode[1] == 'w':
            self.moveable.y += 1

        if keycode[1] == 's':
            self.moveable.y -= 1

        if keycode[1] == 'd':
            self.moveable.x += 1

        if keycode[1] == 'a':
            self.moveable.x -= 1 


    def build(self):
        self.moveable = Scatter()
        self.moveable.add_widget( Label(text = 'Hello moving world!') )
        return self.moveable

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

由于我之前写过的内容,这似乎不是我用于视频游戏的那种键盘输入,而且我还没有找到任何地方如何更好地实现这一目的。

很抱歉,如果这个问题由于某些原因而不合适,我试图找到答案,但我不能,所以现在就是。

如果你能提供帮助,请提前多多谢谢你。

1 个答案:

答案 0 :(得分:3)

  

看起来键盘类的设计是让用户输入应用程序,因为当您按键几秒钟时,第一个键事件和其他键事件之间会有一点延迟

(编辑:重新阅读您的帖子后,我认为您根本不想改变这一点,并且误解了如何使用键盘输入,请参阅本文的第二部分)

我非常确定这取决于操作系统设置,与Kivy无关。关于如果你想在网上改变这个价值的讨论很多,例如你可以在linux上做xset r rate [delay] [rate],例如xset r rate 200 25,或者在各种桌面环境中,有一个gui设置。在Windows上也是如此。该关键字似乎是重复延迟'。

那就是说,我不确定为什么这实际上很重要。 Kivy会告诉您何时按下按键以及按下按键时,如果您愿意,可以在此期间执行您喜欢的事件。为什么操作系统会不断向你发送额外的按键呢?

  

Kivy似乎没有处理与其on_keyboard_down事件同时按下的几个键,当你在kivy中同时按下多个键时,官方文档中使用的键盘类通过最后一次按下键入当前所有按键的更改。

我想你可能会误解Kivy如何向你提供这些信息。当按下某个键时,kivy会为您传递该键的on_key_down事件。当它被释放时,kivy会为该密钥传递on_key_up事件(您的程序不会对此做任何事情)。在这些事件之间,你知道按键仍然按下,系统是否一直给你假装按键并不重要。

编辑:这是您的程序的修改版本,它也打印on_key_up事件信息:

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.scatter import Scatter
from kivy.core.window import Window

class MyApp(App):
    def __init__(self, **kwargs):
        super(MyApp, self).__init__(**kwargs)
        self._keyboard = Window.request_keyboard(self._keyboard_closed, self)
        self._keyboard.bind(on_key_down = self._on_keyboard_down)
        self._keyboard.bind(on_key_up = self._on_keyboard_up)

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

    def _on_keyboard_down(self, *args):
        print 'down', args

    def _on_keyboard_up(self, *args):
        print 'up', args


    def build(self):
        self.moveable = Scatter()
        self.moveable.add_widget( Label(text = 'Hello moving world!') )
        return self.moveable

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