【问题标题】:Kivy manages multiple pages and widgetsKivy 管理多个页面和小部件
【发布时间】:2020-12-12 14:26:26
【问题描述】:

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

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()

【问题讨论】:

    标签: python-3.x kivy kivymd


    【解决方案1】:

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

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

    1. fun()方法移入MainWindow,将按钮on_press:改为on_press: root.fun()
    2. 或者更改fun()方法访问MainWindowScreenself.root.get_screen("screen1").ids["mdlabel"].text = "Hello"

    【讨论】:

      猜你喜欢
      • 2013-07-08
      • 2014-05-11
      • 2019-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-13
      • 1970-01-01
      相关资源
      最近更新 更多