为啥切换屏幕在 kivy 中不起作用?

Posted

技术标签:

【中文标题】为啥切换屏幕在 kivy 中不起作用?【英文标题】:Why is switching screens not working in kivy?为什么切换屏幕在 kivy 中不起作用? 【发布时间】:2021-10-07 09:39:47 【问题描述】:

我正在尝试在 kivy 中切换屏幕,但我已经坚持了一段时间,所以我不知道发生了什么。 正在打印文本,但屏幕仍未更改。 如果有人可以帮助我,这是python代码:

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout
from kivymd.theming import ThemableBehavior
from kivymd.uix.list import MDList
from kivy.uix.screenmanager import ScreenManager, Screen, SlideTransition
from kivymd.uix.button import MDFloatingBottomButton



Window.size = (300, 500)

class MainScreen(Screen):
    def switch_button(self):
        print("switching")
        ScreenManager.current = "FileScreen"  
        

class FileScreen(Screen):
    pass


class app(MDApp):
    data = 
        'Create': 'file-document',
        'Open': 'folder-open'
        
    
    def btn(self, instance):
        print('callback')
        icon = instance.icon
        # if you want check button, use
        if isinstance(instance, MDFloatingBottomButton):

            if icon == 'file-document':
                print('Create')
                MainScreen.switch_button(self)
                
                
                
            elif icon == 'folder-open':
                print('Open')

    class ContentNavigationDrawer(BoxLayout):
        pass

    class DrawerList(ThemableBehavior, MDList):
        pass

        sm = ScreenManager()
        sm.add_widget(MainScreen(name='MainScreen'))
        sm.add_widget(FileScreen(name='FileScreen'))
        
    def build(self):
        self.theme_cls.primary_palette = "Red"
        #self.theme_cls.accent_palette = "Teal"
        screen = Builder.load_file("main.kv")
        return screen
        
        

    

app().run()

这里是.KV 代码:

ScreenManager:
    MainScreen:
    FileScreen:
    
<MainScreen>:
    name: "MainScreen"
    MDFloatingActionButtonSpeedDial:
        bg_hint_color: app.theme_cls.primary_light
        data: app.data
        root_button_anim: True
        callback: app.btn

<FileScreen>:
    name: "FileScreen"
    MDBoxLayout:
        MDLabel:
            text: "test"

我希望社区可以尽快帮助我,因为如果我已经在此问题上停留了一段时间。

【问题讨论】:

【参考方案1】:

您似乎混淆了类和实例。在您的 switch_button() 方法中,您的代码:

ScreenManager.current = "FileScreen"

正在设置ScreenManager 类的current 属性,但current 属性是实例属性,必须在ScreenManager 的实例上设置。它必须是管理FileScreen Screen 的实例。

switch_button() 方法的更好编码:

class MainScreen(Screen):
    def switch_button(self):
        print("switching")
        self.manager.current = "FileScreen"

self.manager 是对管理MainScreenScreenManager 的引用,MainScreen 也在管理FileScreen

在其他地方,您也在类和实例之间产生类似的混淆:

MainScreen.switch_button(self)

同样,您需要MainScreen 的实例,而不是MainScreen 类。此行可以替换为:

self.root.get_screen('MainScreen').switch_button()

这段代码使用ScreenManagerget_screen()方法访问MainScreen的实例,然后调用实例方法switch_button()

更直接的方法是将该行替换为:

self.root.current = 'FileScreen'

【讨论】:

以上是关于为啥切换屏幕在 kivy 中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在模式内部切换在 laravel 中不起作用?

我的 sm.current(sm 是 WindowManager 的对象)似乎在 Kivy 中不起作用

Python Kivy - 下划线在标签中不起作用

为啥我的媒体查询代码在 CSS 中不起作用?

为啥 flexbox 代码在 Safari 5 和 6 中不起作用?

kivy如何切换屏幕?