Python Kivy-如何从带/不带修改器的按键中获得正确的字符?

Python Kivy-如何从带/不带修改器的按键中获得正确的字符?,python,kivy,Python,Kivy,使用Kivy和Python,如何从带有/不带修饰符的按键中获得正确的字符 我不想使用kivy.uix.textinput.textinput。我只想知道用户试图输入的字符 我可以使用从返回的键盘获取当前按下键的扫描码,但这不考虑修改器,即shift键 显然,我可以自己写一些东西来检查是否同时按下了shift键,如果是的话,将其转换为相应的字符。但是,除非每个人的键盘都和我的一样,否则这个解决方案是不可移植的 有没有办法根据系统键图获得正确的字符 我快速查看了,但看不到对request_keybo

使用Kivy和Python,如何从带有/不带修饰符的按键中获得正确的字符

我不想使用kivy.uix.textinput.textinput。我只想知道用户试图输入的字符

我可以使用从返回的键盘获取当前按下键的扫描码,但这不考虑修改器,即shift键

显然,我可以自己写一些东西来检查是否同时按下了shift键,如果是的话,将其转换为相应的字符。但是,除非每个人的键盘都和我的一样,否则这个解决方案是不可移植的

有没有办法根据系统键图获得正确的字符

我快速查看了,但看不到对request_keyboard()的任何调用

不要告诉我使用文本输入。

你可以试试这个。它按名称(Shift、Alt、Crtl等)提供修改器

如果您想让您的小部件侦听所有输入,而不管另一个小部件是否有焦点,只需更改以下内容:

def _keyboard_closed(self):
        print('My keyboard have been closed!')
        self._keyboard.unbind(on_key_down=self._on_keyboard_down)
        self._keyboard = None
致:

这将避免小部件释放键盘,因此它将一直监听所有内容

TextInput在每次焦点变为true时调用的焦点行为方法的
\u sure\u keyboard()
中调用
request\u keyboard()

def _on_focus(self, instance, value, *largs):
        if self.keyboard_mode == 'auto':
            if value:
                self._bind_keyboard()
        ....

def _bind_keyboard(self):
        self._ensure_keyboard()
        ....

def _ensure_keyboard(self):
        if self._keyboard is None:
            self._requested_keyboard = True
            keyboard = self._keyboard =\
                EventLoop.window.request_keyboard(
                    self._keyboard_released, self, input_type=self.input_type)
        ....

我希望这对您有所帮助。

这里是一个工作示例,如何处理修改后的字符。我知道这不是正确的解决办法,但它确实有效。如果你知道正确的方法,请把它贴在下面

代码:


我能看到请求键盘的电话,谢谢你指出这一点。我想找到它的原因是,这样我就可以看到它是如何处理按键的(即,在键盘上下),这样我就可以看到它是如何返回输入的字符的。不幸的是,FocusBehavior似乎不是处理按键的地方。谢谢。你没有试过链接中的代码吗?。我试过了,它给了我钥匙,钥匙代码和修饰符。如果需要实际字符(即用户按“a”和“shift”使字符为“a”),可以绑定到键盘上的_textinput()方法。如果你真的,真的想要扫描代码,我想你唯一的选择就是编辑键盘源代码中的_on_window _key _down(),同时将扫描代码传递给on_key _down()(很糟糕,但很有效)。或者类似的。
def _on_focus(self, instance, value, *largs):
        if self.keyboard_mode == 'auto':
            if value:
                self._bind_keyboard()
        ....

def _bind_keyboard(self):
        self._ensure_keyboard()
        ....

def _ensure_keyboard(self):
        if self._keyboard is None:
            self._requested_keyboard = True
            keyboard = self._keyboard =\
                EventLoop.window.request_keyboard(
                    self._keyboard_released, self, input_type=self.input_type)
        ....
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import StringProperty
from kivy.core.window import Window, Keyboard
from kivy.logger import Logger

class textInsert(FloatLayout):
    def __init__(self, **kwargs):
        super(textInsert, self).__init__(**kwargs)
        self.super = []

        text = StringProperty()

        ########################################
        keyboard = Window.request_keyboard(self._keyboard_released, self)
        keyboard.bind(on_key_down=self._keyboard_on_key_down, on_key_up=self._keyboard_released)

        ########################################
    #end def __init__

    def _keyboard_released(self, window, keycode):
        self.super = []

    def _keyboard_on_key_down(self, window, keycode, text, super):
        if 'lctrl' in self.super and keycode[1] == 's':
            Logger.info("Item saved, {}".format(self.super))
            self.super = []
            return False
        elif 'lctrl' not in self.super and keycode[1] in ["lctrl"]:
            self.super.append(keycode[1])
            return False
        else:
            Logger.info("key {} pressed.".format(keycode))
            return False


class ROOT(App):
   def build(self):
      return textInsert()

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