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
我在创建一个移动到下一个带有箭头的 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