Kivy - 如何通过带/不带修饰符的按键获得正确的角色?

时间:2016-02-27 12:25:12

标签: python kivy

使用Kivy和Python,如何使用/不使用修饰符从keypress获取正确的字符?

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

我可以使用从kivy.core.window.Window.request_keyboard()返回的键盘来获取当前按下的键的扫描码,但这并不考虑修饰符,即移位键。

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

是否有某种方法可以根据系统键映射获取正确的字符?

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

不要告诉我使用TextInput。

2 个答案:

答案 0 :(得分:2)

您可以试试code。它按名称为您提供修饰符( 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

为:

def _keyboard_closed(self):
        pass

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

每次焦点变为true时,TextInput都会在FocusBehaviour的request_keyboard()方法中调用_ensure_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)
        ....

我希望这对你有所帮助。

答案 1 :(得分:0)

这是一个工作示例,如何处理修改后的字符。我知道这不是正确的解决方案,但它是有效的。如果您知道正确的方法,请在下面发布...

代码:

self.indices_client.indices.put_mapping(
    doc_type='child',
    index=child_index,
    body= {
             doc_type: {
               '_parent': {"type": "surveys"},
               'properties': upload_models.Survey._meta.es_mapping
             }
          }
    index=child_index
   )