Kivy/md - 如何使用 ScreenManager 更改屏幕,我可以这样做吗...?

Kivy/md - How to change Screens with ScreenManager, can I do it this way...?

我有这个简单的代码来改变屏幕。我只是想知道在 callback() 中更改的正确变量是调用屏幕更改。我已经看到以其他方式完成此操作,但想确保我有一个静态的 MDToolbar,因此当屏幕发生变化时,工具栏不会移动。 下面的代码不会在 callback() 中更改屏幕 .py代码:

from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivymd.app import MDApp
from kivy.loader import Loader
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import Screen, ScreenManager
from kivymd.uix.label import MDLabel
from kivymd.uix.floatlayout import MDFloatLayout

class TCalc(MDApp):

    def callback(self,obj):
    
        self.root.current = "tipscreen2"


    def build(self):
        return Builder.load_file('dip.kv')

TCalc().run()

dip.kv:

MDNavigationLayout:
    orientation: 'vertical'

    MDToolbar:
        id: toolbar
        right_action_items: [["cog", lambda x: app.callback(x)]]

    ScreenManager:
        id: screen_manager

        Screen:
            name: "tipscreen1"
            MDFloatLayout:
                MDLabel:
                    text: "Screen 1"

        Screen:
            name: "tipscreen2"
            MDFloatLayout:
                MDLabel:
                    text: "Screen 2"

    MDNavigationDrawer:
        id: nav_drawer
        MDNavigationDrawerMenu:

The code below does does not change screen in callback()in...

那是因为在方法 callback 中你做了 self.root.current。如果您的 self.root 是一个 ScreenManager 实例,这应该是适用的,但这里确实不是这种情况。

现在,通过执行 lambda x: app.callback(x),您实际上是在传递实例本身(此处为 MDActionTopAppBarButton)。所以如果你想传递一些变量。通过回调方法改变屏幕,其中一种不同的方法可以简单地传递 ScreenManager 对象(这里实际上是一个弱引用)。或者,您可以直接从 python 通过 id(同样是弱引用)访问 ScreenManager。两种方式的解决方案都可能是这样的,

在kvlang,

        right_action_items: [["cog", lambda x: app.callback(x)]]
# or,       right_action_items: [["cog", app.callback]]

在python,

    def callback(self,sm):
# or,   def callback(self, *args):

        sm.current = "tipscreen2"
# or,       self.root.ids.screen_manager.current = "tipscreen2"