Python Kivy-如何从带/不带修改器的按键中获得正确的字符?
使用Kivy和Python,如何从带有/不带修饰符的按键中获得正确的字符 我不想使用kivy.uix.textinput.textinput。我只想知道用户试图输入的字符 我可以使用从返回的键盘获取当前按下键的扫描码,但这不考虑修改器,即shift键 显然,我可以自己写一些东西来检查是否同时按下了shift键,如果是的话,将其转换为相应的字符。但是,除非每个人的键盘都和我的一样,否则这个解决方案是不可移植的 有没有办法根据系统键图获得正确的字符 我快速查看了,但看不到对request_keyboard()的任何调用 不要告诉我使用文本输入。你可以试试这个。它按名称(Shift、Alt、Crtl等)提供修改器 如果您想让您的小部件侦听所有输入,而不管另一个小部件是否有焦点,只需更改以下内容:Python Kivy-如何从带/不带修改器的按键中获得正确的字符?,python,kivy,Python,Kivy,使用Kivy和Python,如何从带有/不带修饰符的按键中获得正确的字符 我不想使用kivy.uix.textinput.textinput。我只想知道用户试图输入的字符 我可以使用从返回的键盘获取当前按下键的扫描码,但这不考虑修改器,即shift键 显然,我可以自己写一些东西来检查是否同时按下了shift键,如果是的话,将其转换为相应的字符。但是,除非每个人的键盘都和我的一样,否则这个解决方案是不可移植的 有没有办法根据系统键图获得正确的字符 我快速查看了,但看不到对request_keybo
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()