kivy 中的函数聚焦错误的输入

Function in kivy focuses wrong input

我在创建一个移动到下一个带有箭头的 TextInput 的机制时遇到了问题。这段代码有效,但它没有把我放在正确的容器中。当我单击右、左、右时,我应该在第二个容器中,但我在带有 id3 的容器中。我发现应该更改 self.focused 属性的函数有时不起作用,但我不知道为什么以及如何修复它。

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.textinput import TextInput
from kivy.uix.widget import Widget
from kivy.properties import StringProperty

Builder.load_file("keyboardreader.kv")

class MyTextInput(TextInput):
    focused=StringProperty('id1')
       
    def change_focus(self, *args):
        app = App.get_running_app()
        if app.root is not None:
            # Now access the container.
            layout = app.root.ids["layout"]
            # Access the required widget and set its focus.
            print("Changefocus",self.focused)
            layout.ids[self.focused].focus = True
            
    def keyboard_on_key_down(self, window, keycode, text, modifiers):
        print(keycode, text, modifiers)
        focusedid=int(self.focused[2])
        if keycode[1]=="backspace":
            self.text=self.text[:-1]
        if keycode[1]=="right":            
            if int(self.focused[2])<5:
                focusedid+=1
                self.focused="id"+str(focusedid)
        elif keycode[1]=="left":
            if int(self.focused[2])>1:
                self.text=""
                focusedid-=1
                self.focused="id"+str(focusedid)
        self.change_focus()
        print("After changing",self.focused)
        return True

        #TextInput.keyboard_on_key_down(self, window, keycode, text, modifiers)            

class MainScreen(Widget):
    pass
    
                 
class TestingappApp(App):
    def build(self):
        return MainScreen()
    
TestingappApp().run()
<MainScreen>:
    CustomBox:
        id: layout
        size: root.size


<CustomBox@BoxLayout>:
    MyTextInput:
        id: id1
        focused: "id1"
    MyTextInput:
        id: id2
        focused: "id2"
    MyTextInput:
        id: id3
        focused: "id3"
    MyTextInput:
        id: id4
        focused: "id4"
    MyTextInput:
        id: id5
        focused: "id5"

问题是您将 focused 创建为 StringProperty,这意味着 MyTextInput 的每个实例都将拥有自己的 focused 实例,因此一个人的改变不会被其他人知道。解决方法是使 focused 成为 class 级别变量,并让代码中的所有引用都引用那个 class 级别变量。像这样:

class MyTextInput(TextInput):
    focused = 'id1'

    def change_focus(self, *args):
        app = App.get_running_app()
        if app.root is not None:
            # Now access the container.
            layout = app.root.ids["layout"]
            # Access the required widget and set its focus.
            print("Changefocus", MyTextInput.focused)
            layout.ids[MyTextInput.focused].focus = True

    def keyboard_on_key_down(self, window, keycode, text, modifiers):
        focusedid = int(MyTextInput.focused[2])
        if keycode[1] == "backspace":
            self.text = self.text[:-1]
        if keycode[1] == "right":
            if int(MyTextInput.focused[2]) < 5:
                focusedid += 1
                MyTextInput.focused = "id" + str(focusedid)
        elif keycode[1] == "left":
            if int(MyTextInput.focused[2]) > 1:
                self.text = ""
                focusedid -= 1
                MyTextInput.focused = "id" + str(focusedid)
        self.change_focus()
        print("After changing", MyTextInput.focused)
        return True