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

Posted

技术标签:

【中文标题】如果我在另一个屏幕中,我如何获取屏幕的 MDTextField(或数据“登录”)的文本。 (基维/基维MD/Python)【英文标题】:How can i get the text of an MDTextField (Or Data "Login") of an screen if im in another Screen. (Kivy / KivyMD / Python) 【发布时间】:2021-07-17 04:34:00 【问题描述】:

我是新的使用类和 kivy/kivyMD,我有一个问题,如果我在课堂上工作,我想获取属于 AScreen 的 MDTextFied(或我的查询的数据“登录”)的文本BScreen的定义?

我的最小代码是 ScreenManager 文件

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

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

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

get values from a different screen (kivy)

我知道最可能的事情是我对类的工作有一个不好的解释,但是对于屏幕在 kivy 中的工作方式(屏幕寻找同名类的定义),我会不知道该怎么做。 谁能帮帮我?

【问题讨论】:

【参考方案1】:

假设您的 screen_helperScreenManager 定义为 Apps 根小部件,AScreenBScreen 作为其子级。在这种情况下,您可以将AScreen 中的MDTextField 引用为:

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

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

另外,如果您的build() 方法返回Builder.load_string 的结果,则以下行:

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

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

【讨论】:

非常感谢您花时间阅读我的问题并给出答案,这对我的代码帮助很大,因为它是一个很好的解决方案,我什至仍然不知道很多有用的方法尽管我总是尝试去查看文档。我不确定我所做的是否是多余的,因为在 ScreenManagerFile 中我这样做了:screen_helper = """ ScreenManager: AScreen: BScreen: 现在我明白它们是做同样事情的两种不同方式。谢谢你!

以上是关于如果我在另一个屏幕中,我如何获取屏幕的 MDTextField(或数据“登录”)的文本。 (基维/基维MD/Python)的主要内容,如果未能解决你的问题,请参考以下文章

如何在另一个 python 文件中导入屏幕类?

具有相同动作的减速器会影响多个屏幕

如何在另一个屏幕上制作 MDDataTable?

如何在屏幕中选择图像并使用 kivy 将其显示在另一个屏幕上?

Python / Kivy - 在另一个调用函数的屏幕中替换标签的值

我将视图膨胀了 5 次,膨胀的视图有一个 EditText,现在我在屏幕上有 5 个 EditText,如何从这些 EditTexts 中获取文本