在 KivyMd.Kivy 中将文本输入从一个屏幕传递到另一个屏幕

Passing a text input from one screen to another in KivyMd.Kivy

我一直在阅读如何执行此操作,但我无法理解给出的答案。我对 kivy 还是个新手,通常在 python 的数据方面工作。我正在尝试将 ID 为 client_name 的文本输入传递到标记为 Second 的第二个屏幕,并将其传递给 ID 为 client_label 的 MDlabel。我可能走错了方向,我认为我的问题是我混淆了 class 和实例,但不确定如何纠正这个问题。 当按下第一个屏幕上的按钮时,它应该保存客户端名称的值,然后转换到第二个屏幕。我需要以某种方式在我的第二个屏幕上访问该值。

我的py文件是main.py

from funct import *
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty, StringProperty
from kivymd.app import MDApp
import os

#Define our different Screens
class FirstWindow(Screen):
    def press(self):
        client_name = self.ids.client_name.text
        print(client_name)
        #test()
        if client_name == '':
            pass
        else:
            if not os.path.exists("clients/" + client_name):
                os.makedirs("clients/" + client_name)
            if not os.path.exists("clients/" + client_name+"/LoanAgreement/"):
                os.makedirs("clients/" + client_name+"/LoanAgreement/")
            if not os.path.exists("clients/" + client_name+"/MortgageBond/"):    
                os.makedirs("clients/" + client_name+"/MortgageBond/")
            if not os.path.exists("clients/" + client_name+"/CertificateOfBalance/"):  
                os.makedirs("clients/" + client_name+"/CertificateOfBalance/")

class SecondWindow(Screen):
    client_name_label = StringProperty()

    def label_name(self):
        select_screen = self.manager.get_screen("First")
        client_name_label = select_screen.ids.client_name.text
        print(client_name_label)

class WindowManager(ScreenManager):
    pass

#Designate our .kv design file
#kv = Builder.load_file('law.kv')

class MainApp(MDApp):
    def build(self):
        self.theme_cls.primary_palette = "Green"
        self.theme_cls.theme_style = "Light"
        self.theme_cls.primary_hue = "700"
        return Builder.load_file('law.kv')

我的 .kv 文件是

WindowManager:
    FirstWindow:
    SecondWindow:

<FirstWindow>:
    name: "First"
    canvas.before:
        Color:
            rgba: (202/255, 231/255,193/255,0.4)
        Rectangle:
            pos: self.pos
            size: self.size

    MDCard:
        size_hint: None, None
        size: "400", "150"
        padding: 10
        pos_hint: {"center_x": .5, "center_y": .5}
        orientation: "vertical"
        
        MDTextField:
            id: client_name
            padding: 20, 20, 50, 20
            hint_text: "Type a client name"
            helper_text: "This will create a file for the client"
            #mode: "rectangle"
            size_hint_x: None
            width: 350
            helper_text_mode: "on_focus"
            pos_hint: {"center_x": 0.5, "center_y": 1.0}
            on_text_validate: root.press()
            on_text_validate: app.root.current = "Second"
        MDRaisedButton:
            text: "Create"
            pos_hint: {"center_x": .8}
            #md_bg_color: app.theme_cls.primary_light
            on_release: 
                root.press()
                app.root.transition.direction = 'left'
                app.root.current = "Second"
                root.manager.current_screen.label_name()

<SecondWindow>:
    name: "Second"

    canvas.before:
        Color:
            rgba: (202/255, 231/255,193/255,0.4)
        Rectangle:
            pos: self.pos
            size: self.size

    MDLabel:
        id: client_label
        text: root.client_name_label
        halign: "center"
        background_color: (1, 1, 1, 1)
        pos_hint: {"center_x": .5, "center_y": 0.9}

为了从任何地方访问 SecondWindow 或 FirstWindow,请在您的 .kv 文件中尝试以下操作:

  1. 为每个屏幕添加 id 引用:
WindowManager:
    FirstWindow:
        id: screen1
    SecondWindow:
        id: screen2      
  1. 在您的构建方法中引用根目录:
class MainApp(MDApp):
    def build(self):
        self.theme_cls.primary_palette = "Green"
        self.theme_cls.theme_style = "Light"
        self.theme_cls.primary_hue = "700"
        self.root = Builder.load_file('law.kv')
        return self.root

现在您可以从任何地方访问您的 Windows:

App.get_running_app().root.ids.screen1 #To acces FirstWindow
App.get_running_app().root.ids.screen2 #To acces SecondWindow

最后,要从 .py 文件修改 client_label 的文本:

App.get_running_app().root.ids.screen2.name = 'Changed!'

基于上述答案只是为了扩展我粘贴了有效的完整解决方案: py

from funct import *
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty, StringProperty
from kivymd.app import MDApp
import os

#Define our different Screens
class FirstWindow(Screen):
    def press(self):
        client_name = self.ids.client_name.text
        print(client_name)
        #test()
        if client_name == '':
            pass
        else:
            if not os.path.exists("clients/" + client_name):
                os.makedirs("clients/" + client_name)
            if not os.path.exists("clients/" + client_name+"/LoanAgreement/"):
                os.makedirs("clients/" + client_name+"/LoanAgreement/")
            if not os.path.exists("clients/" + client_name+"/MortgageBond/"):    
                os.makedirs("clients/" + client_name+"/MortgageBond/")
            if not os.path.exists("clients/" + client_name+"/CertificateOfBalance/"):  
                os.makedirs("clients/" + client_name+"/CertificateOfBalance/")
            MDApp.get_running_app().root.ids.screen2.ids.client_label.text = self.ids.client_name.text # This updates screen2 label
            

class SecondWindow(Screen):
    pass

       

class WindowManager(ScreenManager):
    pass

#Designate our .kv design file
#kv = Builder.load_file('law.kv')

class MainApp(MDApp):
    def build(self):
        self.theme_cls.primary_palette = "Green"
        self.theme_cls.theme_style = "Light"
        self.theme_cls.primary_hue = "700"
        self.root = Builder.load_file('law.kv')
        return self.root



if __name__ == '__main__':
    MainApp().run()

kv 文件

WindowManager:
    FirstWindow:
        id: scrren1
    SecondWindow:
        id: screen2

<FirstWindow>:
    name: "First"
    canvas.before:
        Color:
            rgba: (202/255, 231/255,193/255,0.4)
        Rectangle:
            pos: self.pos
            size: self.size

    MDCard:
        size_hint: None, None
        size: "400", "150"
        padding: 10
        pos_hint: {"center_x": .5, "center_y": .5}
        orientation: "vertical"
        
        MDTextField:
            id: client_name
            padding: 20, 20, 50, 20
            hint_text: "Type a client name"
            helper_text: "This will create a file for the client"
            #mode: "rectangle"
            size_hint_x: None
            width: 350
            helper_text_mode: "on_focus"
            pos_hint: {"center_x": 0.5, "center_y": 1.0}
            on_text_validate: root.press()
            on_text_validate: app.root.current = "Second"
        MDRaisedButton:
            text: "Create"
            pos_hint: {"center_x": .8}
            #md_bg_color: app.theme_cls.primary_light
            on_release: 
                root.press() # this function will update screen 2s label
                app.root.transition.direction = 'left'
                app.root.current = "Second"

<SecondWindow>:
    name: "Second"

    canvas.before:
        Color:
            rgba: (202/255, 231/255,193/255,0.4)
        Rectangle:
            pos: self.pos
            size: self.size

    MDLabel:
        id: client_label
        text: '' # This will change when the previous screens button is pressed
        halign: "center"
        background_color: (1, 1, 1, 1)
        pos_hint: {"center_x": .5, "center_y": 0.9}