Kivy报错:SignupScreen出现'str' object has no attribute 'text'求解
问题根因
AttributeError: 'str' object has no attribute 'text'是因为Kivy的Screen类本身就有内置的name属性,用于标识页面路由名称。你在Python代码里自定义了同名的ObjectProperty,同时在KV代码里给SignupScreen的内置name属性赋值为字符串"signup",导致自定义的绑定逻辑被覆盖,self.name变成了字符串类型,自然没有text属性。- 你后续修改
submit方法增加text参数的操作本身不符合问题场景,KV代码里调用root.submit()没有传入参数,自然会触发TypeError: submit() missing 1 required positional argument: 'text'报错,这个修改无需保留。
修复步骤
1. 修改Python代码的SignupScreen类
将自定义的姓名输入框绑定属性重命名,避免和Screen内置属性冲突:
class SignupScreen(Screen): # 把原来的name = ObjectProperty(None)改成full_name,避免和内置name属性冲突 full_name = ObjectProperty(None) username = ObjectProperty(None) password = ObjectProperty(None) def submit(self): # 把self.name.text替换为self.full_name.text if self.full_name.text != "" and self.username.text != "" and self.password.text != "": # 参数里的self.name.text也替换为self.full_name.text added = db.add_user(self.username.text, self.password.text, self.full_name.text) if added == 1: self.reset() wm.current = "login" elif added == 2: PassTooShort() else: AccAlreadyExists() else: invalidForm() def login(self): self.reset() wm.current = "login" def reset(self): self.username.text = "" self.password.text = "" # 清空操作也替换为self.full_name.text self.full_name.text = ""
2. 修改KV代码的SignupScreen属性绑定
把姓名输入框的绑定对象改成你重命名后的full_name属性:
<SignupScreen>: name: "signup" # 这里是Screen内置的路由name属性,保留不动 full_name: name # 把原来的n: name改成full_name,绑定到id为name的输入框 username: username password: passw # 剩余KV代码无需改动
修改完成后两个报错都会消失,输入校验逻辑可以正常运行。
内容的提问来源于stack exchange,提问作者Jolin
相关产品推荐
相关产品推荐

