Kivy/PyMongo:TextInput按回车键提交笔记到数据库报参数错误如何解决
问题原因
Kivy的on_text_validate事件触发时,会默认将触发该事件的TextInput控件实例作为额外的位置参数传递给绑定的回调函数,你当前定义的keyboard_down方法仅预留了self参数,没有接收事件传递的控件参数,因此参数数量不匹配抛出TypeError。
修复方案
以下两种方案二选一即可:
方案1:调整回调函数参数定义,接收事件传递的控件参数
直接修改keyboard_down方法的参数列表,添加参数接收传入的TextInput实例,同时可以直接通过该参数获取输入内容,避免多输入框场景下self.note_text被覆盖导致的取值错误:
def keyboard_down(self, instance, **kwargs): # instance为触发回车事件的TextInput对象,直接读取它的text属性更可靠 entry = {'_id': (self.note_num + 1), 'Note': instance.text} self.collection.insert_one(entry) # 可选扩展:保存完成后清空输入框 instance.text = ''
方案2:用可变参数接收多余位置参数
如果你不需要用到事件传递的控件实例,可以用*args占位接收所有多余的位置参数,无需修改方法内部逻辑:
def keyboard_down(self, *args, **kwargs): entry = {'_id': (self.note_num + 1), 'Note': self.note_text.text} self.collection.insert_one(entry)
额外优化提示
你当前的note_num是类初始化时一次性统计的数据库文档数量,后续多次新增笔记时不会自动更新,会出现_id重复的插入报错。建议要么插入前动态统计文档数量,要么直接使用MongoDB默认自动生成的唯一_id,无需自己维护序号:
# 不自定义_id的写法,MongoDB会自动生成全局唯一的_id字段 entry = {'Note': self.note_text.text} self.collection.insert_one(entry)
内容的提问来源于stack exchange,提问作者Jayanti
相关产品推荐
相关产品推荐

