如何使用 Python 代码从 kv 文件中的 TextField 获取数据?

Posted

技术标签:

【中文标题】如何使用 Python 代码从 kv 文件中的 TextField 获取数据?【英文标题】:How to get data from TextField inside a kv file using Python code? 【发布时间】:2021-07-30 08:03:09 【问题描述】:

我是 KivyMD 的新手,目前遇到一个问题。问题是如何从 kv 字符串中的文本字段获取数据。我正在使用 Builder 来加载字符串。代码如下。

from kivy.uix.screenmanager import Screen, ScreenManager
from kivymd.app import MDApp
from kivy.lang import Builder
from kivymd.uix.button import MDRaisedButton
from kivymd.uix.label import MDLabel
from kivy.core.window import Window
from kivymd.uix.snackbar import Snackbar
from kivymd.toast import toast

Window.size = (300, 500)

kv = '''
ScreenManager:
    HomeScreen:

<HomeScreen>:
    BoxLayout:
        orientation : 'vertical'
        MDToolbar:
            title : 'Feed'
            right_action_items : [['magnify', lambda x:x]]

        MDBottomNavigation:
            MDBottomNavigationItem:
                name : 'home'
                icon : 'home'
                ScrollView:
                    MDList:
                        OneLineListItem:
                            text : 'feed no: 1'
                        OneLineListItem:
                            text : 'feed no: 2'
                        OneLineListItem:
                            text : 'feed no: 3'
                        OneLineListItem:
                            text : 'feed no: 4' 

            MDBottomNavigationItem:
                id : 'create'
                name : 'create'
                icon : 'pen'
                MDTextField:
                    id : title
                    hint_text : 'Document Title'
                    size_hint_x : None
                    width : 200
                    pos_hint : 'center_x' : 0.5, 'center_y' : 0.7
                MDTextField:
                    id : body
                    mode : 'rectangle'
                    hint_text : 'Document Body'
                    size_hint_x : 0.7
                    pos_hint : 'center_x' : 0.5, 'center_y' : 0.3
                    width : 250
                    multiline : True
                MDIconButton:
                    pos_hint : 'center_x' : 0.92, 'center_y' : 0.05
                    icon : 'sticker-check-outline'
                    
            MDBottomNavigationItem:
                name : 'saved'
                icon : 'upload'

            MDBottomNavigationItem:
                icon : 'account'
                name : 'profile'
'''

class HomeScreen(Screen):
    pass

class Feed(MDApp):
    def build(self):
        self.theme_cls.primary_palette = 'Cyan'
        self.theme_cls.primary_hue = '200'
        screen = Screen()
        main_screen = Builder.load_string(kv)
        screen.add_widget(main_screen)
        return screen

    def show_popup(self):
        toast('Published successfully')
        pass

Feed().run()

我想在按下 IconButton 时从 TexFields 中获取带有 ID、'title' 和 'body' 的数据。有人可以帮我解决这个问题吗!

【问题讨论】:

【参考方案1】:

首先,我不确定您为什么使用 Screen 作为 root,然后将 ScreenManager 放入其中,您也可以将 ScreenManagaer 作为 root 使用,或者将其放入另一个布局中,虽然使用没有问题这样的Screen,说明对Screen的作用有误解,要在ScreenManager里面使用。

进入重点:

您没有显示按下 IconButton 时要运行的代码,但您说您希望此代码访问这些 id,并且我假设您要调用应用程序的 show_data 方法。

最简单的方法就是让 MDIconButton 将值传递给函数,因为在规则中,它可以通过它们的 id 访问它们。

…
        MDIconButton:
            ...
            on_press: app.show_popup(title.text, body.text)

另一种方式,如果您的代码无法访问这些 id,因为处于不同的规则中,将是从应用程序访问它们,为此,我们必须考虑:

您使用 Builder.load_string 加载您的 kv,它会返回一个包含 HomeScreen 的 ScreenManager HomeScreen 的内容在其规则中定义 您将 ScreenManager 添加到您的根小部件中 您想访问 HomeScreen 规则中的 ID

所以在show_popup 中,您可以从屏幕管理器获取您的屏幕,并从屏幕获取 ID。

def show_popup(self):
    sm = self.root.children[0] # because you put the screenmanager in your root screen
    home_screen = sm.get_screen('home')
    title = home_screen.ids.title.text
    body = home_screen.ids.body.text
    ...

这有点多,但有时走这条路会很方便。

【讨论】:

我将该代码添加到我的文件中,但出现错误:- AttributeError: 'super' object has no attribute 'getattr'

以上是关于如何使用 Python 代码从 kv 文件中的 TextField 获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

Python / Kivy:.kv 文件中的条件设计

python中的kivy小部件到kv文件,如何控制它

如何正确使用.kv文件和.py? - 从 .kv 调用函数如何构建 .py

在 kv 文件中从 python 导入值

将 kv 文件中的标签文本绑定到 python 文件中的方法

从 python 代码而不是 KV 在屏幕之间切换