【问题标题】:How to require a button to be clicked on the first tab before going to other tabs in Kivy/KivyMD在转到 Kivy/KivyMD 中的其他选项卡之前,如何要求在第一个选项卡上单击按钮
【发布时间】:2022-01-07 05:22:23
【问题描述】:

下面的代码是我写的一个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()

【问题讨论】:

    标签: python kivy kivy-language kivymd


    【解决方案1】:

    在搜索了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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多