Kivy 管理多个页面和小部件

Kivy manages multiple pages and widgets

大家早上好。我在使用 kivy 开发的应用程序中管理小部件时遇到问题。如果我只使用一页 (window),一切正常。如果我添加一个页面,如您从代码中看到的那样,我会收到此类错误。我无法解决它们,你能帮帮我吗?

self.root.ids["mdlabel"].text = "Hello"
 KeyError: 'mdlabel'

我使用的代码如下:

from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivymd.app import MDApp

KV="""

ScreenManager:
    MainWindow:
        name: "screen1"
    SecondWindow:
        name: "screen2"
    
<MainWindow>:
    id: screen1
    RelativeLayout:
        
    MDTextField:
        id: mdtext
        hint_text: "No helper text"
        pos: (120,120)
        
    MDLabel:
        id: mdlabel
        text: "No helper text"
        pos: (0,120)
                    
    MDRectangleFlatIconButton:
        id: mdbu
        text: "Invia"
        on_press: app.fun()
        pos: (0, 10)
            
    MDRectangleFlatIconButton:
        id: mdbu_cambia1
        text: "Order"
        on_press: app.root.current = "screen2"
        pos: (250, 10)      
        
<SecondWindow>:
    id: screen2
    RelativeLayout:
    MDTextField:
        id: testo_2
        hint_text: "Testo2"
        pos: (10,150)
    
    MDRectangleFlatIconButton:
        id: mdbu_cambia
        text: "Back"
        on_press: app.root.current = "screen1"
        pos: (250, 10)   

"""

class MainWindow(Screen):
    pass

class SecondWindow(Screen):
    pass

class ScreenManager(ScreenManager):
    pass

class MyApp(MDApp):

    def build(self):
        self.title = "Ciao Mondo"
        self.theme_cls.theme_style = "Dark"
        self.theme_cls.primary_palette = "Green"
        return Builder.load_string(KV)

    def fun(self):
        self.root.ids["mdlabel"].text = "Hello"


MyApp().run()

问题是您尝试访问的 id (mdlabel) 是在 MainWindow 规则中定义的,但您尝试访问它时就好像它是在应用根目录中定义。应用根目录是 ScreenManager.

您可以通过以下任一方法修复它:

  1. fun()方法移动到MainWindow并将按钮on_press:更改为on_press: root.fun()
  2. 或更改 fun() 方法以访问 MainWindow Screen 作为 self.root.get_screen("screen1").ids["mdlabel"].text = "Hello"