如何要求在转到 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'
下面的代码是我写的一个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'