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

时间:2021-08-01 22:14:07

标签: python python-3.x kivy kivy-language kivymd

我正在尝试在 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 个答案:

答案 0 :(得分:1)

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

ScreenManager.current = "FileScreen"

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

更好的 switch_button() 方法编码:

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

self.manager 是对管理 ScreenManagerMainScreen 的引用,后者也管理 FileScreen

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

MainScreen.switch_button(self)

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

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

此代码使用get_screen()的{​​{1}}方法访问ScreenManager的实例,然后调用实例方法MainScreen

更直接的方法是用以下内容替换该行:

switch_button()