如何使用 KivyMD 工具栏切换屏幕

Posted

技术标签:

【中文标题】如何使用 KivyMD 工具栏切换屏幕【英文标题】:How do I switch screens with KivyMD toolbar 【发布时间】:2021-10-02 20:17:16 【问题描述】:

我做了一个很基础的App,底部有KivyMD App bar。我在尝试使用工具栏图标切换屏幕时遇到问题。

这是我的 main.py 文件(请多多包涵,我的代码在实施一些我找到的解决方案时有点聚集,但没有奏效)

from kivymd.app import MDApp
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.core.window import Window

Window.size = (300, 500)


class Screen1(Screen):
    pass


class Screen2(Screen):
    pass


class TwoScreenApp(MDApp):
    def build(self):
        self.theme_cls.primary_palette = 'Gray'
        sm = ScreenManager()
        sm.add_widget(Screen1(name='screen1'))
        sm.add_widget(Screen2(name='screen2'))

        return sm

    def callback(self, screen):
        self.current = screen
        # root.manager.transition.direction = 'left'
        # root.manager.current = 'screen2'
        # link icon to screen2



TwoScreenApp().run()

这是我的 .kv 文件

ScreenManager:
    Screen1:
    Screen2:

<Screen1>
    name: 'screen1'
    MDBoxLayout:
    md_bg_color: (255/255, 255/255, 255/255, 1)
    orientation: 'vertical'

    MDLabel:
        halign: 'center'
        text:
            """With the production of the Model T automobile,
            Henry Ford had an unforeseen and tremendous
            impact on American life. He became regarded
            as an apt symbol of the transition from an
            agricultural to an industrial America."""

    MDBottomAppBar:

        MDToolbar:
            icon: "account-circle"
            type: "bottom"
            left_action_items: [["arrow-right", lambda x: root.manager.callback("screen1")]]
            right_action_items: [["arrow-left", lambda x: x]]
            elevation: 10

<Screen2>
    name: 'screen2'
    md_bg_color: (200/255, 200/255, 200/255, 1)

    MDBoxLayout:
        md_bg_color: (255/255, 255/255, 255/255, 1)
        orientation: 'vertical'

    MDLabel:
        halign: 'center'
        text:
            """The development of mass-production techniques, which
            enabled the company eventually to turn out a Model T
            every 24 seconds; the frequent reductions in the price
            of the car made possible by economies of scale; and
            the payment of a living wage that raised workers
            above subsistence and made them potential customers
            for, among other things, automobiles—these innovations
            changed the very structure of society."""

    MDBottomAppBar:

        MDToolbar:
            title: "Title"
            icon: "account-circle"
            type: "bottom"
            left_action_items: [["menu", lambda x: x]]

我将不胜感激,谢谢!

【问题讨论】:

【参考方案1】:

您的代码:

left_action_items: [["arrow-right", lambda x: root.manager.callback("screen1")]]

正在尝试调用root.managercallback() 方法,即ScreenManager。但是ScreenManager 没有callback() 方法。我想你想调用你的TwoScreenAppcallback() 方法,你会这样做:

left_action_items: [["arrow-right", lambda x: app.callback("screen2")]]

它使用app 关键字来引用App 实例。

【讨论】:

我已经像你说的那样调用了回调方法。我还在我的 main.py 文件中创建了一个“def callback(self)”,但我仍然得到一个“NameError:name” callback' 未定义”错误,我认为问题出在我的 main,py 文件中,即带有“def callback(self)”的文件,所以请我的问题是我的 main.py 文件会是什么样子?提前致谢! app.callback() 正在调用您的callback() 方法App (TwoScreenApp)。你的TwoScreenApp 类中应该仍然有这个方法。 非常感谢我终于明白了,我现在的问题是我希望底部的应用程序栏出现在多个屏幕上。我知道我需要创建一个主类并让它继承它,如果你能给我看一个样品,我会很高兴,提前谢谢! 我认为这应该是一个单独发布的问题。 约翰感谢您的贡献。我已经发布了这个问题,我希望收到你的来信..

以上是关于如何使用 KivyMD 工具栏切换屏幕的主要内容,如果未能解决你的问题,请参考以下文章

如何从屏幕管理器在 kivymd 工具栏中进行回调?

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

如何在 KivyMD (Python) 中结合导航抽屉和多个屏幕?

如何使用 on_enter 函数在第一个屏幕中更新 KivyMD 标签?

如何在 kivymd 功能开始时显示加载屏幕?

如何在 kivymd 中添加多个屏幕?