KivyMDscanner_manager.current 多个返回值

Posted

技术标签:

【中文标题】KivyMDscanner_manager.current 多个返回值【英文标题】:KivyMD scanner_manager.current multiple return values 【发布时间】:2021-11-30 04:28:18 【问题描述】:

我在python kivyMD中做一个应用,遇到了一个我无法解释的奇怪现象。一定是对这个API缺乏了解或者有什么我不理解的地方。

当我打印变量scanner_manager.current 时,问题就开始了。我想知道scanner_manager.current == "home" 的时间,以便我可以做出一个条件,即当您在导航栏中单击主页时,什么都不会发生。这可以防止应用在您单击主页并且您已经在主屏幕时重复重新加载。

下面是python文件。

import kivy
from kivy.app import App
from kivy.lang import Builder
from kivymd.app import MDApp
from kivy.uix.screenmanager import ScreenManager
from kivymd.uix.screen import MDScreen
from kivy.properties import ObjectProperty

class HomeScreen(MDScreen):
    pass
class AboutScreen(MDScreen):
    pass
class DeveloperScreen(MDScreen):
    pass

class WindowManager(ScreenManager):
    screen_manager = ObjectProperty(None)

class MyApp(MDApp):
    def build(self):
        self.root_widget = Builder.load_file("style.kv")
        return self.root_widget

if __name__ == "__main__":
    MyApp().run() 

style.kv

Screen:
    MDToolbar:
        id: toolbar
        pos_hint: "top": 1
        elevation: 10
        title: "My application"
        left_action_items: [["menu", lambda x: nav_drawer.set_state("toggle")]]
    MDNavigationLayout:
        WindowManager:
            id:screen_manager
            HomeScreen:
            AboutScreen:
            DeveloperScreen:
    MDNavigationDrawer:
        id: nav_drawer
        BoxLayout:
            orientation: "vertical"
            ScrollView:
                MDList:
                    OneLineListItem:
                        text:"Home"
                        on_touch_down:
                            screen_manager.current = "home"
                            print(screen_manager.current)
                    OneLineListItem:
                        text: "About"
                        on_touch_down:
                            screen_manager.current = "about"
                            print(screen_manager.current)
                    OneLineListItem:
                        text: "Developer options"
                        on_touch_down:

                            screen_manager.current = "dev"
                            print(screen_manager.current)
                            nav_drawer.set_state("close")


<HomeScreen>:
    name: "home"
    BoxLayout:
        orientation: "vertical"
        MDLabel:
            text: "Welcome to the Home Screen!"
            halign: "center"
<AboutScreen>:
    name: "about"
    BoxLayout:
        orientation: "vertical"
        MDLabel:
            text: "Welcome to the About Screen!"
            halign: "center"
<DeveloperScreen>:
    name: "dev"
    BoxLayout:
        orientation: "vertical"
        MDLabel:
            text: "Welcome to the Developer Screen!"
            halign: "center"

当点击主页按钮时,输出是:

dev
about
home
 

点击时:

dev
about

点击开发者选项时:

dev

问题是,这是怎么回事?为什么scanner_manager.current 在转到正确的屏幕之前会跳转到多个屏幕?当一次又一次地点击同一个屏幕时,如何禁止应用程序重新加载?感谢您的帮助。

【问题讨论】:

【参考方案1】:

您正在使用on_touch_down 作为事件来触发您的Screen 更改和您的print。但是on_touch_down 事件会在每次Button 点击时发送到每个小部件。解决方法是改用on_press,它只有在点击特定的OneLineListItem 时才会触发。因此,只需将 kv 中的 on_touch_down 更改为 on_press

【讨论】:

谢谢!!这清楚地回答了我的问题。

以上是关于KivyMDscanner_manager.current 多个返回值的主要内容,如果未能解决你的问题,请参考以下文章