python - 无法访问我的 kivy 类中的对象,无法使用“app.root”和“self.ids”
问题描述
我想调用一个函数,但该函数有两个参数,没有参数就无法调用该函数,导致 python 显示有关两个缺少参数的错误。我通常使用 'app.root' 'self.ids' 访问我的对象,在这种情况下,由于某些原因我不能使用这些对象。我想调用 'MyFirebase().sign_up(email=, password=)' 但我需要将它与我的 kivy 类中的对象相等。如果有人知道如何访问这些对象,我试图与之相等的对象存储在“app.root.ids.signup.ids.email.text”和“approot.ids.signup.ids.password.text”中我将不胜感激。这是我的代码的最小可重现示例,我试图将函数归入“thefirebase = MyFirebase()”</p>
from kivy.app import App
import requests
import json
class MyFireBase():
def __init__(self):
# initialize localId to None, just to be sure it always exists
self.localId = None
def sign_up(self, email, password):
app = App.get_running_app()
email = email.replace("\n","")
password = password.replace("\n","")
# Send email and password to Firebase
# Firebase will return localId, authToken (idToken), refreshToken
signup_url = "https://www.googleapis.com/identitytoolkit/v3/relyingparty/signupNewUser?key=" + self.wak
signup_payload = {"email": email, "password": password, "returnSecureToken": True}
sign_up_request = requests.post(signup_url, data=signup_payload)
sign_up_data = json.loads(sign_up_request.content.decode())
print(sign_up_request.ok)
print(sign_up_request.content.decode())
if sign_up_request.ok == True:
print(sign_up_data)
refresh_token = sign_up_data['refreshToken']
self.localId = sign_up_data['localId']
idToken = sign_up_data['idToken']
# Save refreshToken to a file
with open(app.refresh_token_file, "w") as f:
f.write(refresh_token)
app.local_id = self.localId
app.id_token = idToken
my_data = '{"avatar": "profilepic.png", "jobs_done": "", "jobs_posted": ""}'
post_request = requests.patch("https://moonlighting-bb8ab.firebaseio.com/users/" + self.localId + ".json?auth=" + idToken, data=my_data)
print(post_request.ok)
print(post_request.content.decode())
app.root.current = "create"
elif sign_up_request.ok == False:
error_data = json.loads(sign_up_request.content.decode())
error_message = error_data["error"]['message']
app.root.ids.signup.ids.signup_message.text = error_message.replace("_", " ")
def send_user_details(self):
app = App.get_running_app()
my_data ={"first name": app.root.ids.create.ids.first_name.text, "last name": app.root.ids.create.ids.last_name.text,
"phone number": app.root.ids.create.ids.phone_number.text, "job1": app.root.ids.create.ids.job1.text, "job2": app.root.ids.create.ids.job2.text,
"job3": app.root.ids.create.ids.job3.text, "date of birth": app.root.ids.create.ids.date_of_birth.text, "state": app.root.ids.create.ids.state1.text}
user_details = requests.patch("https://moonlighting-bb8ab.firebaseio.com/users/" + app.local_id + ".json?auth=" + app.id_token, json.dumps(my_data))
print(user_details.ok)
print(user_details.content.decode())
app.root.current = "main"
def sign_in_existing_user(self, email, password):
signin_url = "https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=" + self.wak
signin_payload = {"email": email, "password": password, "returnSecureToken": True}
signin_request = requests.post(signin_url, data=signin_payload)
sign_up_data = json.loads(signin_request.content.decode())
app = App.get_running_app()
print(signin_request.ok)
print(signin_request.content.decode())
if signin_request.ok == True:
refresh_token = sign_up_data['refreshToken']
self.localId = sign_up_data['localId']
idToken = sign_up_data['idToken']
# Save refreshToken to a file
with open(app.refresh_token_file, "w") as f:
f.write(refresh_token)
# Save localId to a variable in main app class
# Save idToken to a variable in main app class
app.local_id = self.localId
app.id_token = idToken
# Create new key in database from localId
# Get friend ID
# Get request on firebase to get the next friend id
# --- User exists so i dont need to get a friend id
# self.friend_get_req = UrlRequest("https://friendly-fitness.firebaseio.com/next_friend_id.json?auth=" + idToken, on_success=self.on_friend_get_req_ok)
# app.change_screen("home_screen")
app.root.current = "main"
elif signin_request.ok == False:
error_data = json.loads(signin_request.content.decode())
error_message = error_data["error"]['message']
app.root.ids.login.ids.login_message.text = error_message.replace("_", " ")
class Server():
def __init__(self, thefirebase, *args, **kwargs):
super().__init__(*args, **kwargs)
app = App.get_running_app()
self.thefirebase = thefirebase # Store the initialised MyFireBase instance
app = App.get_running_app()
thefirebase = MyFireBase()
thefirebase.sign_up(email= app.root.ids.signup.ids.email.text, password=app.root.ids.signup.ids.password.text)
class MyApp(App):
refresh_token_file = "refresh_token.txt"
members_list = "members_list.txt"
thefirebase = MyFireBase()
def build(self):
app = App.get_running_app()
self.thefirebase = MyFireBase()
self.refresh_token_file = app.user_data_dir + self.refresh_token_file
return sm
if __name__ == "__main__":
MyApp().run()
解决方案
你的代码:
app = App.get_running_app()
thefirebase = MyFireBase()
thefirebase.sign_up(email= app.root.ids.signup.ids.email.text, password=app.root.ids.signup.ids.password.text)
running_app
将失败,因为它在运行应用程序之前尝试访问。这些行应该被删除。
在您的build()
方法中,您再次调用App.get_running_app()
,但在这种情况下,App
is self
。所以你也不需要在那里调用它。
由于您需要调用引用ids
,因此您必须延迟调用,直到App
构建显示(当ids
字典被填充时)。我建议将您的App
课程更改为:
class MyApp(App):
refresh_token_file = "refresh_token.txt"
members_list = "members_list.txt"
# thefirebase = MyFireBase() # not needed. it is defined in the build()
def build(self):
self.thefirebase = MyFireBase()
self.refresh_token_file = self.user_data_dir + self.refresh_token_file
# delay your call to sign_up() until the App is built
Clock.schedule_once(self.call_signup)
return sm
def call_signup(self, dt):
# now make the desired call to sign_up()
self.thefirebase.sign_up(email=self.root.ids.signup.ids.email.text, password=self.root.ids.signup.ids.password.text)
顺便说一句,您没有提供最小的可重现示例,因为您没有提供kv
包含id
定义的文件。所以我无法测试我的答案。
推荐阅读
- google-apps-script - 按名称搜索 google drive 文件并获取其 ID
- excel - 添加过滤器时,基于其他列的自动填充列值失败
- machine-learning - 高斯朴素贝叶斯是否有参数需要调整
- angular - 如果使用 ngIf 隐藏字段,如何从角度反应形式切换(添加/删除)表单控件?
- c++ - 链表中双指针的使用
- react-spring - 如何在单个组件上附加多个反应弹簧?
- c - c语言中的面试题reg二进制位操作
- docker - 如何从 docker-compose 或 docker run 写入现有的填充卷
- javascript - 根据日期从数据库中获取唯一值,当用户单击日期时,然后展开数据库中可用的详细信息
- javascript - 如何通过同一行的另一列的一个文本框中的输入获取值