#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'