Как потребовать, чтобы на первой вкладке была нажата кнопка, прежде чем переходить на другие вкладки в Kivy/KivyMD

#python #kivy #kivy-language #kivymd

Вопрос:

Приведенный ниже код-это демо — версия, которую я написал. Чего я хочу добиться, так это того, что я должен нажать кнопку на первой вкладке, прежде чем использовать другие вкладки. Если кнопка не нажата, и я попытаюсь перейти на другие вкладки, появится сообщение, и я перейду на первую вкладку. Проблема в том, что сообщение будет показано, но мне нужно нажать еще раз, чтобы вернуться на первую вкладку. Есть идеи, как это исправить? Заранее спасибо!

введите описание изображения здесь

 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)   lt;Tabgt;   MDLabel:  id: label  text: "Tab 0"  halign: "center"  lt;Tab4testgt;  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: lt;kivymd.uix.tab.MDTabs objectgt;;  :param instance_tab: lt;__main__.Tab objectgt;;  :param instance_tab_label: lt;kivymd.uix.tab.MDTabsLabel objectgt;;  :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()  

Ответ №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()  

тест.кв:

 lt;SMgt;:  S1:  name: 'p1' lt;S1gt;:  mdtabs:mdtabs  MDTabs:  id: mdtabs  Tab:  title: 'Tab1'  Button:  text: 'Click me'  on_release: root.fu()  Tab:  title: 'Tab2'