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
.
您可以通过以下任一方法修复它:
- 将
fun()
方法移动到MainWindow
并将按钮on_press:
更改为on_press: root.fun()
- 或更改
fun()
方法以访问 MainWindow
Screen
作为 self.root.get_screen("screen1").ids["mdlabel"].text = "Hello"
大家早上好。我在使用 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
.
您可以通过以下任一方法修复它:
- 将
fun()
方法移动到MainWindow
并将按钮on_press:
更改为on_press: root.fun()
- 或更改
fun()
方法以访问MainWindow
Screen
作为self.root.get_screen("screen1").ids["mdlabel"].text = "Hello"