我有一个基于TabbedPanel的Kivy应用程序。现在,我想在更改为选项卡时自动对焦其中一个TextInput。
初始化应用程序时,这有效:
class FocusedTextInput(TextInput):
def on_parent(self, widget, parent):
self.focus = True
但是当更改到另一个选项卡并返回到第一个选项卡时,FocusedTextInput已经在其父级上,因此不会抛出回调。每当我想处理其他事件(例如TabbedPanelItem的click事件或它的on_parent)时,FocusedTextInput的实例都是None,即使我安排了一个回调(例如10s之后),并且Input是可见的并且可以通过其他函数(例如输入的focus_out处理程序)。
用户更改标签后,有没有办法自动对焦一个TextInput?
我期待着您的回答,并希望您的kivy专家在那里。 ; - )
我的应用程序的这些部分可能对您有意义: 此类初始化选项卡(此示例中的一个选项卡)并从kv文件加载内容。
class Applikation(App):
bezahlungProp = ObjectProperty(None)
#[...]
def build(self):
rootNode = TabbedPanel(do_default_tab=False)
rootNode.bind(current_tab=self.tabChanged)
bezahlungitem = TabbedPanelItem(text="Bezahlung")
self.bezahlungitem = bezahlungitem
self.bezahlung = Bezahlung()
rootNode.add_widget(bezahlungitem)
bezahlungitem.add_widget(self.bezahlung)
self.bezahlungProp = ObjectProperty(self.bezahlung)
self.bezahlung.add_widget(Builder.load_file("bezahlung.kv"))
# [...]
return rootNode
def tabChanged(self, instance, value):
Builder.sync()
value.content.init()
这代表一个标签:
class Bezahlung(BoxLayout):
ticketIDInp = ObjectProperty(None)
def on_parent(self, a, b):
Clock.schedule_once(self.on_parent_callback,10)
def on_parent_callback(self,b):
#this throws an error -> self.ticketIDInp is None
self.ticketIDInp.focus = True
def init(self):
#Application also fails here:
self.ticketIDInp.focus = True
def ticketIDInp_focus_out(self):
#I can use self.ticketIDInp.text here without problems
response = self.server.request("hookStatFromTicket",{"ticketID":self.ticketIDInp.text})
[...]
bezahlung.kv的相关部分:
Bezahlung:
ticketIDInp: ticketIDInp
BoxLayout:
BoxLayout:
FocusedTextInput:
id: ticketIDInp
on_text_validate: root.ticketIDInp_focus_out()
答案 0 :(得分:1)
执行所需操作的一种方法是绑定 current_tab 属性。 这是一个工作示例(第二个选项卡是具有所需行为的选项)
from kivy.app import App
from kivy.uix.tabbedpanel import TabbedPanel
from kivy.lang import Builder
Builder.load_string("""
<Test>:
size_hint: .5, .5
pos_hint: {'center_x': .5, 'center_y': .5}
do_default_tab: False
TabbedPanelItem:
text: 'first tab'
Label:
text: 'First tab content area'
TabbedPanelItem:
id: tab2
text: 'tab2'
BoxLayout:
Label:
text: 'Second tab content area'
TextInput:
text: 'Button that does nothing'
focus: root.current_tab == tab2 # <--- this is it! also can be changed to "== self.parent.parent"
""")
class Test(TabbedPanel):
pass
class TabbedPanelApp(App):
def build(self):
t = Test()
return t
if __name__ == '__main__':
TabbedPanelApp().run()