我很难在应用程序中更改键盘布局。在下面的示例中,我有两个文本字段,我希望一个使用常规键盘,另一个使用数字键盘。当我在一个文本字段中单击时,键盘会发生变化,但焦点会丢失。
是否有更好的方法根据当前焦点所在的字段来更改键盘?
from kivy.config import Config
Config.set('kivy', 'keyboard_mode', 'dock')
from kivy.app import App
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.core.window import Window
from kivy.clock import Clock
from kivy.properties import ObjectProperty
Window.size = (480, 600)
Window.borderless = False
KV = '''
AnchorLayout:
anchor_x: "center"
anchor_y: "center"
BoxLayout:
orientation: "vertical"
size_hint: 0.9, 0.5
MDTextField:
id: textField
hint_text: "Text field"
mode: "rectangle"
on_focus: app.changeKeyboard(textField, 'keyboard_text.json')
MDTextField:
id: numberField
hint_text: "Number field"
mode: "rectangle"
on_focus: app.changeKeyboard(textField, 'keyboard_number.json')
'''
class MyApp(MDApp):
textField = ObjectProperty()
numberField = ObjectProperty()
def build(self):
return Builder.load_string(KV)
def changeKeyboard(self, widget, layout):
self._keyboard = Window.request_keyboard(self._keyboard_closed, widget)
if self._keyboard.widget:
vkeyboard = self._keyboard.widget
vkeyboard.layout = layout
def _keyboard_closed(self):
print('My keyboard has been closed!')
self._keyboard = None
if __name__ == "__main__":
app = MyApp()
app.run()
以下是我如何使用专门的 TextInput 类让它为我工作:
from kivy.config import Config
Config.set('kivy', 'keyboard_mode', 'dock')
from kivy.app import App
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.core.window import Window
from kivy.uix.textinput import TextInput
from kivy.properties import StringProperty
import interface.paths as paths
import os
Window.size = (480, 600)
Window.borderless = False
KV = '''
AnchorLayout:
anchor_x: "center"
anchor_y: "center"
BoxLayout:
orientation: "vertical"
size_hint: 0.9, 0.5
NumericInput:
id: numberField
hint_text: "50"
AlphaNumericInput:
id: textField
hint_text: "Number field"
'''
class NumericInput(TextInput):
def __init__(self, **kwargs):
super(NumericInput, self).__init__(**kwargs)
def on_focus(self, instance, value):
app = App.get_running_app()
app.changeKeyboard(self, 'numeric')
class AlphaNumericInput(TextInput):
def __init__(self, **kwargs):
super(AlphaNumericInput, self).__init__(**kwargs)
def on_focus(self, instance, value):
app = App.get_running_app()
app.changeKeyboard(self, 'alphanumeric')
class MyApp(MDApp):
def build(self):
return Builder.load_string(KV)
def changeKeyboard(self, widget, layout):
print(f'Changing keyboard layout to: {layout}')
self._keyboard = Window.request_keyboard(self._keyboard_closed, widget)
layout_mapping = {'numeric': os.path.join('config', 'keyboards', 'numeric.json'),
'alphanumeric': os.path.join('config', 'keyboards', 'en_US.json')}
if self._keyboard.widget:
vkeyboard = self._keyboard.widget
vkeyboard.layout = layout_mapping[layout]
def _keyboard_closed(self):
print('My keyboard has been closed!')
if self._keyboard:
self._keyboard = None
Window.release_keyboard()
if __name__ == "__main__":
app = MyApp()
app.run()
{
"title": "en_US",
"description": "A US Keyboard, touch optimized (no shift+caps lock)",
"cols": 10,
"rows": 5,
"normal_1" : [
["1", "1", "1", 1],
["2", "2", "2", 1],
["3", "3", "3", 1],
["4", "4", "4", 1],
["5", "5", "5", 1],
["6", "6", "6", 1],
["7", "7", "7", 1],
["8", "8", "8", 1],
["9", "9", "9", 1],
["0", "0", "0", 1]
],
"normal_2" : [
["q", "q", "q", 1],
["w", "w", "w", 1],
["e", "e", "e", 1],
["r", "r", "r", 1],
["t", "t", "t", 1],
["y", "y", "y", 1],
["u", "u", "u", 1],
["i", "i", "i", 1],
["o", "o", "o", 1],
["p", "p", "p", 1]
],
"normal_3" : [
["a", "a", "a", 1.11],
["s", "s", "s", 1.11],
["d", "d", "d", 1.11],
["f", "f", "f", 1.11],
["g", "g", "g", 1.11],
["h", "h", "h", 1.11],
["j", "j", "j", 1.11],
["k", "k", "k", 1.11],
["l", "l", "l", 1.11]
],
"normal_4" : [
["\u21e7", null, "capslock", 1.5],
["z", "z", "z", 1],
["x", "x", "x", 1],
["c", "c", "c", 1],
["v", "v", "v", 1],
["b", "b", "b", 1],
["n", "n", "n", 1],
["m", "m", "m", 1],
["\u232b", null, "backspace", 1.5]
],
"normal_5" : [
["#+=", null, "special", 2],
[" ", " ", " ", 6],
["done", "done", "done", 2]
],
"shift_1" : [
["1", "1", "1", 1],
["2", "2", "2", 1],
["3", "3", "3", 1],
["4", "4", "4", 1],
["5", "5", "5", 1],
["6", "6", "6", 1],
["7", "7", "7", 1],
["8", "8", "8", 1],
["9", "9", "9", 1],
["0", "0", "0", 1]
],
"shift_2" : [
["Q", "Q", "Q", 1],
["W", "W", "W", 1],
["E", "E", "E", 1],
["R", "R", "R", 1],
["T", "T", "T", 1],
["Y", "Y", "Y", 1],
["U", "U", "U", 1],
["I", "I", "I", 1],
["O", "O", "O", 1],
["P", "P", "P", 1]
],
"shift_3" : [
["A", "A", "A", 1],
["S", "S", "S", 1],
["D", "D", "D", 1],
["F", "F", "F", 1],
["G", "G", "G", 1],
["H", "H", "H", 1],
["J", "J", "J", 1],
["K", "K", "K", 1],
["L", "L", "L", 1]
],
"shift_4" : [
["\u21e7", null, "capslock", 2],
["Z", "Z", "Z", 1],
["X", "X", "X", 1],
["C", "C", "C", 1],
["V", "V", "V", 1],
["B", "B", "B", 1],
["N", "N", "N", 1],
["M", "M", "M", 1],
["\u232b", null, "backspace", 2]
],
"shift_5" : [
["#+=", null, "special", 2],
[" ", " ", " ", 8],
["done", "done", "done", 2]
],
"special_1": [
["@", "@", "@", 1],
["?", "?", "?", 1],
["!", "!", "!", 1],
[";", ";", ";", 1],
["•", "•", "•", 1],
["|", "|", "|", 1],
["\\", "\\", "\\", 1],
["˘", "˘", "˘", 1],
["-", "-", "-", 1],
["|", "|", "|", 1]
],
"special_2": [
["(", "(", "(", 1],
[")", ")", ")", 1],
["{", "{", "{", 1],
["}", "}", "}", 1],
["[", "[", "[", 1],
["]", "]", "]", 1],
["€", "€", "€", 1],
["$", "$", "$", 1],
["£", "£", "£", 1],
["¥", "¥", "¥", 1]
],
"special_3": [
["“", "“", "“", 1],
["`", "`", "`", 1],
["«", "«", "«", 1],
["»", "»", "»", 1],
["#", "#", "#", 1],
["%", "%", "%", 1],
["^", "^", "^", 1],
["°", "°", "°", 1],
["&", "&", "&", 1]
],
"special_4": [
["+", "+", "+", 1],
["=", "=", "=", 1],
["<", "<", "<", 1],
[">", ">", ">", 1],
["*", "*", "*", 1],
["~", "~", "~", 1],
[":", ":", ":", 1],
["_", "_", "_", 1],
["-", "-", "-", 1]
],
"special_5": [
["#+=", null, "special", 2],
[" ", " ", " ", 11],
["done", "done", "done", 2]
]
}
{
"title" : "Numeric",
"description" : "A numeric keypad",
"cols" : 3,
"rows": 4,
"normal_1": [
["7", "7", "7", 1],
["8", "8", "8", 1],
["9", "9", "9", 1]],
"normal_2": [
["4", "4", "4", 1],
["5", "5", "5", 1],
["6", "6", "6", 1]],
"normal_3": [
["1", "1", "1", 1],
["2", "2", "2", 1],
["3", "3", "3", 1]],
"normal_4": [
["0", "0", "0", 1],
[".", ".", ".", 1],
["\u232b", null, "backspace", 1]],
"shift_1": [
["7", "7", "7", 1],
["8", "8", "8", 1],
["9", "9", "9", 1]],
"shift_2": [
["4", "4", "4", 1],
["5", "5", "5", 1],
["6", "6", "6", 1]],
"shift_3": [
["1", "1", "1", 1],
["2", "2", "2", 1],
["3", "3", "3", 1]],
"shift_4": [
["0", "0", "0", 1],
[".", ".", ".", 1],
["\u232b", null, "backspace", 1]]
}