You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 13:24:04