python - 我不知道为什么,但我收到错误消息:“AttributeError: 'super' object has no attribute '__getattr__'”
问题描述
我有一些代码:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
import json
Builder.load_file('design.kv')
class AttrGetter:
def __getattr__(self, item):
raise AttributeError(item)
class WelcomePage(Screen):
def go_to_sign_up(self):
self.manager.current = "register_page"
def go_to_login(self):
self.manager.current = "login_screen"
class RegisterPage(Screen, AttrGetter):
def add_user(self, schoolname, contactname, jobtitle, schoolemailaddress, phonenumber, numberofyeargroupstoberegistered, numberofregisteringchildren, whichyeargroupsbeingregistered):
with open("register_details.json") as file:
register_details = json.load(file)
register_details[schoolname] = {'school_name': schoolname, 'contact_name': contactname, 'job_title': jobtitle,
'school_email_address': schoolemailaddress, 'phone_number': phonenumber, 'number_of_year_groups_to_be_registered':numberofyeargroupstoberegistered, 'number_of_registering_children': numberofregisteringchildren, 'which_year_groups_being_registered': whichyeargroupsbeingregistered}
with open("register_details.json", "w") as file:
json.dump(register_details, file)
self.manager.current = 'register_page_success'
def go_to_login(self):
self.manager.current = "login_screen"
class LoginScreen(Screen, AttrGetter):
def login(self, emailID, password):
with open("register_details.json", encoding = 'utf-8') as file:
register = json.load(file)
if emailID.values() == emailID and password.values() == password:#emailID in register and password in register:
print('hi!')#self.manager.current = 'login_screeen_success'
else:
print('bye!')#self.ids.login_wrong.text = "Wrong username or password!"
class RegisterPageSuccess(Screen):
pass
class RootWidget(ScreenManager):
pass
class MainApp(App):
def build(self):
return RootWidget()
if __name__ == "__main__":
MainApp().run()
然后我还有一个 kivy 文件:
<WelcomePage>:
GridLayout:
cols: 1
GridLayout:
cols: 1
Label:
text: "Welcome"
Button:
text: "register"
on_press: root.go_to_sign_up
Button:
text: "login"
on_press: root.go_to_login
<RegisterPage>:
GridLayout:
cols: 1
GridLayout:
cols: 1
Label:
text: "Register Page"
font_size: "20sp"
TextInput:
id: schoolname
hint_text: "School Name"
TextInput:
id: contactname
hint_text: "Contact Name"
TextInput:
id: jobtitle
hint_text: "Job Title"
TextInput:
hint_text: "emailID"
TextInput:
id: phonenumber
hint_text: "Phone number"
TextInput:
id: numberofyeargroupstoberegistered
hint_text: "Number of Year group to be registered"
TextInput:
id: numberofregisteringchildren
hint_text: "Nummber of registering children"
TextInput:
id: whichyeargroupsbeingregistered
hint_text: "Which yeargroups being registered"
TextInput:
id: password
hint_text: "Password"
Button:
text: "Submit"
on_press: root.add_user(root.ids.schoolname.text, root.ids.contactname.text, root.ids.jobtitle.text, root.ids.schoolemailaddress.text, root.ids.phonenumber.text, root.ids.numberofyeargroupstoberegistered.text, root.ids.numberofregisteringchildren.text, root.ids.whichyeargroupsbeingregistered.text)
Button:
text: "Already have an account? Click here to log in"
on_press: root.go_to_login()
<LoginScreen>:
GridLayout:
cols: 1
GridLayout:
cols: 1
Label:
text: "Login Page"
font_size: "20sp"
TextInput:
id: emailID
hint_text: "emailID"
TextInput:
id: password
password: True
hint_text: "Password"
Button:
text: "Login"
on_press: root.login(emailID, password)
Button:
text: "Don't have an account? Click here to sign up"
on_press: root.go_to_sign_up()
<RegisterPageSuccess>:
GridLayout:
cols: 1
GridLayout:
cols: 1
Label:
text: "You have logged in!"
<RootWidget>:
# WelcomePage:
# name: "welcome_page"
RegisterPage:
name: "register_page"
LoginScreen:
name: "login_screen"
RegisterPageSuccess:
name: "register_page_success"
出于某种原因,我收到错误消息:“AttributeError: 'super' object has no attribute ' getattr '” 当我输入登录页面 textinput 和 registerpage 的值时,会出现此错误。我已经尝试寻找解决方案,但找不到。当我在代码的 register_page 部分中输入值时,我需要程序将我提供的数据存储到一个名为“register_details.json”的某个空 json 文件中。然后,很明显,当我将 emailID 和密码输入 login_screen 时,它需要从 json 文件中检查 emailID 和密码是否正确。
解决方案
您正在尝试访问一个不存在的id
: schoolemailaddress
。您可以通过简单地定义它来解决这个问题:
TextInput:
id: schoolemailaddress
hint_text: "emailID"
此外,在您的 中kv
,您可以直接使用它们的id
. 您不需要root.ids
前缀:
Button:
text: "Submit"
on_press: root.add_user(schoolname.text, contactname.text, jobtitle.text, schoolemailaddress, phonenumber.text, numberofyeargroupstoberegistered.text, numberofregisteringchildren.text, whichyeargroupsbeingregistered.text)
推荐阅读
- flutter - 在图像上手动设置 firebaseStorageDownloadTokens 使用 Flutter 上传到 Firebase 存储
- powerbi - Power BI - 日期切片器不适用于合并查询
- css - 升级后 JSX 样式不适用于 Storybook
- winapi - WIN32:有没有办法让按钮图标(BM_SETIMAGE)出现在文字的右侧
- c# - 继承具有不同基类的多个类的通用功能
- css - 扩大 rmarkdown html 中代码的输出
- c++ - 在没有参数列表的情况下无效使用模板名称'boost::asio::strand'
- javascript - 如何将用户生成的 svg 上传到服务器?
- java - 如果 logger.error() 在 try 块中命中/显示,则执行 catch 块
- node.js - Node.js 应用架构设计并行处理