第一个 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 可能是个坏主意,因为AppMDApp 的基类的名称。一个更好的主意是选择一个唯一的名称。

【讨论】:

以上是关于第一个 Python/Kivy/KivyMD 应用程序。无法将文本字段中的数据保存到变量 + 数据绑定到 MDList的主要内容,如果未能解决你的问题,请参考以下文章

从第一个应用程序启动第二个应用程序,然后关闭第一个应用程序

Firebase 项目下的两个应用。为啥第一个应用程序的注册用户无需注册就可以登录第二个应用程序?

搭建第一个Dapp应用——存证签证(DAPP开发)——2021.5.4

2编写第一个django应用(投票应用),第二部分简要过程

第一个 go web 应用

第一个django应用