如何使用 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 获取数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何正确使用.kv文件和.py? - 从 .kv 调用函数如何构建 .py