我需要从一个 KivyMD 屏幕(EntryScreen)获取 MDTextField 输入,并将其插入另一个 KivyMD 屏幕,作为另一个 KivyMD 屏幕(ConfirmationScreen)中的 MDLabel 文本。我在互联网上搜索了答案但找不到。我该如何实现这个目标?这是我拥有的两个 KivyMD 屏幕代码:
进入屏幕
<EntryScreen>
name: 'entry_screen'
MDCard:
size_hint: None, None
size: 500, 750
pos_hint: {"center_x": 0.5, "center_y": 0.5}
elevation: 10
padding: 25
spacing: 25
orientation: 'vertical'
MDLabel:
id: number_label
text: "3 Digit Number"
font_size: 25
halign: 'center'
size_hint_y: None
height: self.texture_size[1]
#padding_y: 15
MDTextField:
mode: "round"
id: number
input_filter: 'int'
max_text_length: 3
hint_text: "3 Digit Number"
valign: 'center'
icon_right: "apps"
size_hint_x: None
width: 250
font_size: 18
pos_hint: {"center_x": 0.5}
确认画面
<ConfirmationScreen>
name: 'confirm_screen'
MDCard:
size_hint: None, None
size: 500, 750
pos_hint: {"center_x": 0.5, "center_y": 0.5}
elevation: 10
padding: 25
spacing: 25
orientation: 'vertical'
MDLabel:
id: confirm_label
text: input from EntryScreen
font_size: 30
halign: 'center'
size_hint_y: None
height: self.texture_size[1]
#padding_y: 15
有很多不同的方法可以实现你的目标。
一种方法是在进入确认屏幕之前更改标签文本。这将是我的解决方案(最少的代码):
main.py
from kivy.properties import ObjectProperty
from kivymd.uix.screen import MDScreen
from kivy.lang import Builder
from kivymd.app import MDApp
class EntryScreen(MDScreen):
num_field = ObjectProperty(None)
class ConfirmationScreen(MDScreen):
def on_pre_enter(self):
self.ids.confirm_label.text = self.manager.get_screen("entry_screen").num_field.text
class Test(MDApp):
def build(self):
return Builder.load_file("main.kv")
Test().run()
主.kv
<EntryScreen>
name: 'entry_screen'
num_field: num_field
MDCard:
MDLabel:
MDTextField:
id: num_field
...
<ConfirmationScreen>
name: 'confirm_screen'
MDCard:
MDLabel:
id: confirm_label
...
MDScreenManager:
id: main_screen_manager
EntryScreen:
ConfirmationScreen:
我已将 num_field 作为 ObjectProperty 添加到 EntryScreen 类,以使文本字段可从 py 文件访问。
def on_pre_enter(self): #在进入屏幕之前触发
self.ids.confirm_label #从ConfirmationScreen中获取标签。(可以用另一个对象属性替换)
要从另一个屏幕获取对象属性,您需要获取屏幕管理器。例如,如果屏幕位于同一管理器中,则使用 self.manager。
使用 .get_screen(screen:str) 您可以获取屏幕,从中可以获取对象属性。
如果您不知道 ObjectProperties 是什么以及如何使用它们,我建议您阅读文档和以下问题: