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

问题描述 投票:0回答:1

我有这个简单的代码来更改屏幕。我只是想知道在回调()中更改的正确变量是调用屏幕更改。 我见过其他方式完成此操作,但想确保我有一个静态 MDToolbar,这样当屏幕更改时,工具栏不会移动。 下面的代码不会在回调()中改变屏幕 .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:
python python-3.x kivy screen kivymd
1个回答
1
投票

下面的代码不会在回调()中改变屏幕...

那是因为在方法

callback
中你做了
self.root.current
。如果您的
self.root
ScreenManager
实例,这应该适用,但这里确实不是这种情况。

现在,通过执行

lambda x: app.callback(x)
,您实际上正在传递实例本身(此处为
MDActionTopAppBarButton
)。所以如果你想传递一些变量。通过回调方法来更改屏幕,其中一种不同的方法可以简单地传递
ScreenManager
对象(这里实际上是一个弱引用)。或者,您可以直接从 python 通过 ids(同样是弱引用)访问
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"
© www.soinside.com 2019 - 2024. All rights reserved.