kivymd MDbottomnavigation on_tab_press

Posted

技术标签:

【中文标题】kivymd MDbottomnavigation on_tab_press【英文标题】: 【发布时间】:2021-05-11 19:16:22 【问题描述】:

这是我第一次尝试 KivyMD。我有以下 kivymd 底部导航选项卡。 我正在尝试获取按下的选项卡的名称,以便我想在其中一个选项卡中显示数据表等,在另一个选项卡中显示一些配置文件功能等。 但是,当我尝试在MDBottomNavigation 中使用on_tab_press 事件时,它可以工作。但是,它给了我一个对象而不是实际值(按下的选项卡名称)。 在下面的main.py 中,on_tab_press 函数给了我以下信息。如何从on_tab_press 事件中获取名称?

print(type(args[0])) - <class 'kivymd.uix.bottomnavigation.MDBottomNavigationItem'>
print(*args) - <MDTab name='screen1', text='tab1'>

main.py

from kivymd.theming import ThemeManager

class MainApp(MDApp):

    def build(self):
        theme_cls = ThemeManager()
        self.root = Builder.load_file("main.kv")
        return self.root

    def on_tab_press(self, *args):
        print(type(args[0]))
        print(*args)
        # returns 
        # <class 'kivymd.uix.bottomnavigation.MDBottomNavigationItem'>
        # <MDTab name='screen1', text='tab1'>

main.kv

<BottomNav>:
    #name: 'hello'
    BoxLayout:
        orientation:'vertical'
        MDToolbar:
            title: 'folio'
            md_bg_color: .2, .2, .2, 1
            specific_text_color: 1, 1, 1, 1
        MDBottomNavigation:
            panel_color: 1,1,1,1
            MDBottomNavigationItem:
                name: 'screen1'
                text: 'tab1'
                #icon: 'language-python'
                on_tab_press: app.on_tab_press(*args)
                #on_tab_press: app.current = 'home_screen'
                #MDLabel:
                #    text: 'tab1'
                #    halign: 'center'
            MDBottomNavigationItem:
                name: 'screen2'
                text: 'tab2'
                on_tab_press: app.on_tab_press(*args)
                #icon: 'language-cpp'
                #MDLabel:
                #    text: 'I programming of C++'
                #    halign: 'center'
            MDBottomNavigationItem:
                name: 'screen3'
                text: 'tab3'
                on_tab_press: app.on_tab_press(*args)
                #icon: 'language-javascript'
                MDLabel:
                    text: 'JS'
                    halign: 'center'

【问题讨论】:

【参考方案1】:

问题

您在 def on_tab_press 方法中使用 *args 作为参数。据我所知* 解包传递的数据并返回一个元组,这里的数据是 args 这是你的BottomNavigationItem

但是,您传递了一个对象 kivymd.uix.bottomnavigation.MDBottomNavigationItem 并试图通过使用 print(*args) 将其视为可迭代对象,这会造成一些麻烦

解决方案

将您的方法更改为类似def on_press_method(self, args) 并使用print(args.name)print(args.text) 访问对象的名称文本

示例代码

from kivy.lang import Builder

from kivymd.uix.screen import Screen
from kivymd.app import MDApp
from kivymd.theming import ThemeManager
from kivymd.uix.button import MDRectangleFlatButton

Builder.load_string("""
<MainScreen>:
    BoxLayout:
        orientation:'vertical'
        MDToolbar:
            title: 'folio'
            md_bg_color: .2, .2, .2, 1
            specific_text_color: 1, 1, 1, 1
        MDBottomNavigation:
            panel_color: 1,1,1,1
            MDBottomNavigationItem:
                name: 'screen1'
                text: 'tab1'
                icon: 'language-python'
                on_tab_press: app.on_tab_press(*args)
                #on_tab_press: app.current = 'home_screen'
                #MDLabel:
                #    text: 'tab1'
                #    halign: 'center'
            MDBottomNavigationItem:
                name: 'screen2'
                text: 'tab2'
                on_tab_press: app.on_tab_press(*args)
                #icon: 'language-cpp'
                #MDLabel:
                #    text: 'I programming of C++'
                #    halign: 'center'
            MDBottomNavigationItem:
                name: 'screen3'
                text: 'tab3'
                on_tab_press: app.on_tab_press(*args)
                #icon: 'language-javascript'
                MDLabel:
                    text: 'JS'
                    halign: 'center'

""")

class MainScreen(Screen):
    pass

class MainApp(MDApp):
    def on_tab_press(self, args):
        
        print(type(args))
        print(args.name)
        print(args.text)


    def build(self):
        return MainScreen()
MainApp().run()

【讨论】:

以上是关于kivymd MDbottomnavigation on_tab_press的主要内容,如果未能解决你的问题,请参考以下文章

使用 KivyMD 库运行应用程序时出现错误 No module named 'kivymd.app'

KivyMD 错误:ValueError:KivyMD:App 对象必须在加载根小部件之前进行初始化

KivyMD - 如何使用 KivyMD BottomNavigationItems 和屏幕本身内的按钮在屏幕上导航?

禁用全屏 kivymd

如何在 kivymd 中制作网格布局?

.spec 文件中的“ModuleNotFoundError:没有名为 'kivymd' 的模块”