Kivy TabbedPanel自动对焦

时间:2016-05-14 10:32:47

标签: python kivy

我有一个基于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()

1 个答案:

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