如何要求在转到 Kivy/KivyMD 中的其他选项卡之前先单击第一个选项卡上的按钮

How to require a button to be clicked on the first tab before going to other tabs in Kivy/KivyMD

下面的代码是我写的一个demo。我想要完成的是,在使用其他选项卡之前,我必须单击第一个选项卡中的按钮。如果未单击该按钮而我尝试转到其他选项卡,则会显示一条消息,我将被引导至第一个选项卡。问题是消息会显示,但我必须再单击一次才能返回到第一个选项卡。知道如何解决吗?提前致谢!

from kivy.lang import Builder

from kivymd.app import MDApp
from kivymd.uix.floatlayout import MDFloatLayout
from kivymd.uix.button import MDRaisedButton
from kivymd.uix.tab import MDTabsBase
from kivymd.toast import toast


KV = '''
MDBoxLayout:
    orientation: "vertical"

    MDToolbar:
        title: "Example Tabs"

    MDTabs:
        id: tabs
        on_tab_switch: app.on_tab_switch(*args)


<Tab>

    MDLabel:
        id: label
        text: "Tab 0"
        halign: "center"

<Tab4test>
    MDLabel:
        id: label
        text: "Tab 0"
        halign: "center"        
    MDRaisedButton: 
        text: "Click me!!!"
        on_release: root.change_flag()
'''


class Tab(MDFloatLayout, MDTabsBase):
    '''Class implementing content for a tab.'''

class Tab4test(MDFloatLayout, MDTabsBase):
    '''Class implementing content for a tab.'''
    def change_flag(self):
        MDApp.get_running_app().flag =1
        toast("flag value changed to 1!")

class Example(MDApp):
    flag = 0
    def build(self):
        return Builder.load_string(KV)

    def on_start(self):
        self.root.ids.tabs.add_widget(Tab4test(title=f"Tab 0"))
        for i in range(1, 3):
            self.root.ids.tabs.add_widget(Tab(title=f"Tab {i}"))
        print(self.flag)

    def on_tab_switch(
        self, instance_tabs, instance_tab, instance_tab_label, tab_text
    ):
        '''Called when switching tabs.

        :type instance_tabs: <kivymd.uix.tab.MDTabs object>;
        :param instance_tab: <__main__.Tab object>;
        :param instance_tab_label: <kivymd.uix.tab.MDTabsLabel object>;
        :param tab_text: text or name icon of tab;
        '''

        instance_tab.ids.label.text = tab_text
        print(self.flag)
        title = instance_tab.title

        if title != f"Tab 0" and self.flag == 0:
            toast("Please click the button in Tab 0 first!", duration=3)
            #print(instance_tabs.carousel.slides)
            #instance_tabs.carousel.load_slide(instance_tabs.carousel.slides[0])
            instance_tabs.switch_tab("Tab 0", search_by="title")

Example().run()

在搜索 MDTabs 里面的内容后,我找到了 MDTabsBar 并决定在打开时禁用它。单击第一个选项卡上的按钮后,我将其激活:

test.py:

from kivymd.app import MDApp
from kivymd.uix.floatlayout import MDFloatLayout
from kivymd.uix.tab import MDTabsBase
from kivy.uix.screenmanager import Screen,ScreenManager
from kivy.properties import StringProperty,ObjectProperty
from kivy.clock import Clock
class S1(Screen):
    mdtabs= ObjectProperty()
    def on_enter(self, *args):
        Clock.schedule_once(self.settings)
    def settings(self,*args):
        print(self.mdtabs.children[0])
        self.mdtabs.children[0].disabled = True
    def fu(self):
        self.mdtabs.children[0].disabled = False
class SM(ScreenManager):
    pass
class Tab(MDFloatLayout, MDTabsBase):
    pass
class test(MDApp):
    def build(self):
        return SM()
if __name__ == '__main__':
    test().run()

test.kv:

<SM>:
    S1:
        name: 'p1'
<S1>:
    mdtabs:mdtabs
    MDTabs:
        id: mdtabs
        Tab:
            title: 'Tab1'
            Button:
                text: 'Click me'
                on_release: root.fu()
        Tab:
            title: 'Tab2'