第一个 Python/Kivy/KivyMD 应用程序。无法将文本字段中的数据保存到变量 + 数据绑定到 MDList
Posted
技术标签:
【中文标题】第一个 Python/Kivy/KivyMD 应用程序。无法将文本字段中的数据保存到变量 + 数据绑定到 MDList【英文标题】:First Python/Kivy/KivyMD App. Unable to save data from textfield to variable + data binding to MDList 【发布时间】:2021-04-15 08:48:06 【问题描述】:我最近开始在 python/kivy 中开发一个学校上交应用程序。 我处于我在 kivymd 和用户类中创建和 UI 的状态。 我想将信息保存到用户对象列表中,但 我收到 KeyError: 'firstname' 错误消息。 你们知道可能是什么问题吗?
我还想实现的是,我将 MDList 放到第二个屏幕上。使用数据绑定,我想显示列表中用户的名字和姓氏。知道我怎样才能做到这一点吗?我没有在网上找到可用的解决方案。
提前感谢您的帮助!
from kivymd.app import MDApp
from kivy.lang.builder import Builder
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.uix.textinput import _textinput_list
screen_helper = """
ScreenManager:
id: smn
AddUserScreen:
ViewListScreen:
ModifyUser:
<AddUserScreen>:
id: screen1
name: 'adduser'
MDTextField:
id:firstname
hint_text: "First Name"
helper_text: "Please enter your firts name"
helper_text_mode: "on_focus"
pos_hint: 'center_x': 0.5, 'center_y': 0.9
size_hint_x: None
width:300
MDTextField:
id: lastname
hint_text: "Last Name"
helper_text: "Please enter your last name"
helper_text_mode: "on_focus"
pos_hint: 'center_x': 0.5, 'center_y': 0.8
size_hint_x: None
width:300
MDTextField:
id: city
hint_text: "City of Residence"
helper_text: "Please enter your city of residence"
helper_text_mode: "on_focus"
pos_hint: 'center_x': 0.5, 'center_y': 0.7
size_hint_x: None
width:300
MDTextField:
id: year
hint_text: "Birthyear"
helper_text: "Please enter your birthyear"
helper_text_mode: "on_focus"
pos_hint: 'center_x': 0.5, 'center_y': 0.6
size_hint_x: None
width:300
MDRectangleFlatButton:
text: 'View User List'
pos_hint: 'center_x': 0.7, 'center_y': 0.1
on_press: root.manager.current = 'viewlists'
MDRectangleFlatButton:
text: 'Add User'
pos_hint: 'center_x': 0.3, 'center_y': 0.1
on_press: root.addUser()
<ViewListScreen>:
id: screen2
name: 'viewlists'
MDList:
id: container
pos_hint: 'center_x': 0.5, 'center_y': 0.9
MDRectangleFlatButton:
text: 'Add New User'
pos_hint: 'center_x': 0.3, 'center_y': 0.1
on_press: root.manager.current = 'adduser'
MDRectangleFlatButton:
text: 'Modify User'
pos_hint: 'center_x': 0.7, 'center_y': 0.1
on_press: root.manager.current = 'modify'
<ModifyUser>:
id: 'screen3"
name: 'modify'
MDRectangleFlatButton:
text: 'Add New User'
pos_hint: 'center_x': 0.3, 'center_y': 0.1
on_press: root.manager.current = 'adduser'
MDRectangleFlatButton:
text: 'View User'
pos_hint: 'center_x': 0.7, 'center_y': 0.1
on_press: root.manager.current = 'viewlists'
"""
class AddUserScreen(Screen):
def addUser(self):
screen1_instance = sm.get_screen('adduser')
firstname1 = screen1_instance.ids['firstname'].text
lastname1 = screen1_instance.ids['lastname'].text
city1 = screen1_instance.ids['city'].text
year1 = screen1_instance.ids['year'].text
userlist.append(User(firstname1, lastname1, city1, year1))
print('New User Added')
class ViewListScreen(Screen):
pass
class ModifyUser(Screen):
pass
userlist = []
sm = ScreenManager()
sm.add_widget(AddUserScreen(name='adduser'))
sm.add_widget(ViewListScreen(name='viewlists'))
sm.add_widget(ModifyUser(name='modify'))
class App(MDApp):
def build(self):
screen = Builder.load_string(screen_helper)
return screen
App().run()
class User:
def __init__(self, firstname, lastname, country, year):
self.firstname = firstname
self.lastname = lastname
self.country = country
self.year = year
【问题讨论】:
【参考方案1】:您的代码存在一些问题。一、台词:
sm = ScreenManager()
sm.add_widget(AddUserScreen(name='adduser'))
sm.add_widget(ViewListScreen(name='viewlists'))
sm.add_widget(ModifyUser(name='modify'))
正在构建您的App
中未使用的小部件树。这些行可以删除。
其次,User
类定义出现在App().run()
之后,这意味着正在运行的App
没有该类可用。这个类定义应该移到App().run()
之前
第三,addUser()
方法使用上面定义的sm
,它不属于您的App
小部件树,尚未显示,因此没有ids
(导致错误)。对addUser()
方法的更正访问App
的实际小部件树。像这样:
class AddUserScreen(Screen):
def addUser(self):
screen1_instance = self.manager.get_screen('adduser') # get correct Screen
firstname1 = screen1_instance.ids['firstname'].text
lastname1 = screen1_instance.ids['lastname'].text
city1 = screen1_instance.ids['city'].text
year1 = screen1_instance.ids['year'].text
userlist.append(User(firstname1, lastname1, city1, year1))
print('New User Added')
另外,将App
命名为App
可能是个坏主意,因为App
是MDApp
的基类的名称。一个更好的主意是选择一个唯一的名称。
【讨论】:
以上是关于第一个 Python/Kivy/KivyMD 应用程序。无法将文本字段中的数据保存到变量 + 数据绑定到 MDList的主要内容,如果未能解决你的问题,请参考以下文章
Firebase 项目下的两个应用。为啥第一个应用程序的注册用户无需注册就可以登录第二个应用程序?