KivyMD如何通过标签页内按钮校验输入后切换到指定标签页
问题原因
- 你在criarLista方法中创建了新的空MDTabs实例,并非界面上已渲染的tabs组件,调用该实例的切换方法完全不会生效
- MDTabs的switch_tab方法接收的参数是标签的显示文本或者已实例化的标签对象,你直接传入CalculaCompra类无法匹配到已存在的标签
- 你之前写的irpracalcula方法逻辑错误,直接覆盖了on_tab_switch事件回调函数,不会触发标签切换操作
修复代码
直接替换你的Python代码即可,Kv代码无需修改:
from kivymd.app import MDApp from kivymd.uix.floatlayout import MDFloatLayout from kivymd.uix.picker import MDDatePicker from kivymd.uix.tab import MDTabsBase, MDTabs from datetime import datetime from locale import setlocale, LC_ALL import sqlite3 class VamosComprar(MDApp): def build(self): pass def on_start(self): self.root.ids.tabs.add_widget(MenuApp(tab_label_text='Inicio')) self.root.ids.tabs.add_widget(CalculaCompra(tab_label_text='Calculadora')) self.root.ids.tabs.add_widget(VerListaCompra(tab_label_text='Listas')) def on_tab_switch(self, instance_tabs, instance_tab, instance_tab_label, tab_text): pass class MenuApp(MDFloatLayout, MDTabsBase): def __init__(self, **kwargs): super().__init__(**kwargs) def criarLista(self): self.nomedalista = self.ids.nomedalista.text.strip() self.ondevaicomprar = self.ids.ondevaicomprar.text self.datalabel = self.ids.datamenu.text # 校验逻辑 valid = True if len(self.nomedalista) <= 0: self.ids.nomedalista.error = True self.ids.nomedalista.text = ' ' valid = False if self.datalabel == 'Insira a data': self.ids.datamenu.theme_text_color = 'Error' valid = False # 校验通过切换标签 if valid: # 直接获取全局app实例里的tabs组件,调用切换方法传标签文本 MDApp.get_running_app().root.ids.tabs.switch_tab('Calculadora') # 你之前注释的数据库操作逻辑可以放在这里 # self.nomedalistadb = self.nomedalista.replace(" ", "_") # banco = sqlite3.connect('listComp.db') # cursor = banco.cursor() # cursor.execute('CREATE TABLE IF NOT EXISTS ' + self.nomedalistadb + ' (' # 'id INTEGER PRIMARY KEY AUTOINCREMENT,' # 'mercado TEXT,' # 'data TEXT,' # 'produto TEXT,' # 'quantidade REAL,' # 'precounit REAL,' # 'qtdatac REAL,' # 'precoatac REAL,' # 'total REAL' # ')') # banco.close() def abrir_data(self): setlocale(LC_ALL, 'pt_BR.utf-8') date_dialog = MDDatePicker() date_dialog.bind(on_save=self.on_save, on_cancel=self.on_cancel) date_dialog.open() # 选择日期后更新标签显示 def on_save(self, instance, value, date_range): self.dtlabelpos = f'{str(value.day)}/{str(value.month)}/{str(value.year)}' self.ids.datamenu.text = self.dtlabelpos # 选择日期后恢复正常文本颜色 self.ids.datamenu.theme_text_color = 'Primary' def on_cancel(self, instance, value): pass class CalculaCompra(MDFloatLayout, MDTabsBase): def __init__(self, **kwargs): super().__init__(**kwargs) class VerListaCompra(MDFloatLayout, MDTabsBase): def __init__(self, **kwargs): super().__init__(**kwargs) VamosComprar().run()
调整说明
- 删掉了逻辑错误的irpracalcula方法
- 优化了校验逻辑,新增valid变量统一判断校验结果
- 校验通过后通过
MDApp.get_running_app()获取当前运行的app实例,直接调用界面上已渲染的tabs组件的switch_tab方法,传入要切换的标签文本Calculadora即可完成切换 - 新增了选择日期后自动恢复文本为正常颜色的逻辑,避免选完日期还显示错误色
内容的提问来源于stack exchange,提问作者patrick.genova
相关产品推荐
相关产品推荐

