Kivy 更改不同文本输入的键盘布局

问题描述 投票:0回答:1

我很难在应用程序中更改键盘布局。在下面的示例中,我有两个文本字段,我希望一个使用常规键盘,另一个使用数字键盘。当我在一个文本字段中单击时,键盘会发生变化,但焦点会丢失。

是否有更好的方法根据当前焦点所在的字段来更改键盘?

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()

python kivy kivy-language kivymd
1个回答
0
投票

以下是我如何使用专门的 TextInput 类让它为我工作:

主.py

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()

en_US.json

{
    "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]
    ]
    
}

数字.json

{
"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]]
}

© www.soinside.com 2019 - 2024. All rights reserved.