首页 > 解决方案 > 如果我在另一个屏幕中,我如何获取屏幕的 MDTextField(或数据“登录”)的文本。(基维/基维MD/Python)

问题描述

我是使用类和 kivy/kivyMD 的新手,我遇到了麻烦,如果我从类定义工作,我想获取属于 AScreen 的 MDTextFied(或我的查询的数据“登录”)的文本屏幕?

我的最小代码是ScreenManager File

 <AScreen>:
    name:'ascreen'
    MDBoxLayout:
        orientation: 'vertical'
    MDTextField:
        id: user
        hint_text: 'User'
    MDRectangleFlatButton:
        text:'Login'
        on_release: root.login_button()

<BScreen>:
    name:'bscreen'     
    MDRectangleFlatButton:
        text:'Registrar Equipo'
        on_release: root.show_login_data()

我的屏幕的类文件是:

class AScreen(Screen):
    def login_button(self):
    ...
    login = #User DB info
    """Here i do a query to the DB with the text of my MDTextField on AScreen
    i use self.ids.user.text to get the text of the AScreen MDTextField
    if the user exist in the DB i save the user's data on a variable named "login" """
    
class BScreen(Screen):
    def show_login_data(self):
        print()

现在我只是想从 AScreen.ids.user.text 打印文本,或者也获取登录变量,但我没有得到其中任何一个。

我的主要文件是:

sm = ScreenManager()
sm.add_widget(screensfile.AScreen(name='ascreen'))
sm.add_widget(screensfile.BScreen(name='bscreen'))

class MainApp(MDApp):
    def build(self):
        self.screen = Builder.load_string(screen_helper)
        return self.screen
MainApp().run()

我尝试了以下方法(我为我可怕的新手错误道歉): print(AScreen.login_button().login) print(Acreen.ids.user.text)

我知道这里有类似的情况,但它对我的screens.py文件没有帮助: Kivy - Use text from TextInput of a screen in another screen in another screen in .py file

从不同的屏幕获取值(kivy)

我知道最可能的事情是我对类的工作有一个不好的解释,但是屏幕在 kivy 中的工作方式(屏幕寻找同名类的定义)我不知道如何去做吧。有人可以帮我吗?

标签: pythonoopkivykivy-languagekivymd

解决方案


假设您screen_helper将 a 定义为带有和作为其子ScreenManager级的 Apps 根小部件。在这种情况下,您可以将in引用为:AScreenBScreenMDTextFieldAScreen

App.get_running_app().root.get_screen('ascreen').ids.user

返回正在运行的App.get_running_app()实例App。引用根root小部件(我假设它是 a ScreenManager)。的get_screen()方法ScreenManager返回 的实例AScreen,并ids.user获得对 的引用MDTextField。尝试使用类访问 idAScreen将不起作用,因为 id 是在AScreen.

在不相关的说明中,如果您的build()方法返回 的结果Builder.load_string,则以下行:

sm = ScreenManager()
sm.add_widget(screensfile.AScreen(name='ascreen'))
sm.add_widget(screensfile.BScreen(name='bscreen'))

正在构建一个未使用的sm,并且可以删除。


推荐阅读