Не могу получить доступ к объектам в моем классе kivy, не могу использовать «app. root» и «self.ids» - PullRequest
0 голосов
/ 16 января 2020

Я хочу вызвать функцию, но эта функция имеет два параметра и не может вызвать функцию без параметров, так как python показывает ошибку о двух пропущенных аргументах. Обычно я обращаюсь к своим объектам с помощью «app.root» «self.ids», в этом случае я не могу использовать их по определенным причинам. Я хочу вызвать MyFirebase (). Sign_up (email =, password =), но мне нужно сопоставить его с объектами в моем классе kivy. Объекты, которым я пытаюсь сравниться, хранятся в «app. root .ids.signup.ids.email.text» и «app root .ids.signup.ids.password.text», если у кого-то есть идея. как получить доступ к этим объектам, я был бы признателен. Вот минимальный воспроизводимый пример моего кода, и я пытаюсь поместить функцию в 'thefirebase = MyFirebase ()'

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()

1 Ответ

0 голосов
/ 16 января 2020

Ваш код:

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 равен 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 определения. Поэтому я не могу проверить свой ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...