如何在Kivy屏幕小部件中初始化实例 [英] How can you initialise an instance in a Kivy screen widget

查看:90
本文介绍了如何在Kivy屏幕小部件中初始化实例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在我的kivy屏幕中访问一个名为self.localId的实例变量,并且一直在说初始化该实例后说该实例不存在.我知道我的代码中有错误,但是我很难识别它.有没有其他方法可以在kivy屏幕中初始化实例?但是这是我的代码.我将不胜感激

I am trying to access an instance variable named self.localId in my kivy screen and it keeps saying the saying the instance doesn't exist after i have initialised it. I know I have an error In my code but im having a hard time identifying it. is there a different way to initialising instances in a kivy screen? but here is my code. I would appreciate any help

mainfile.py

mainfile.py

from kivy.app import App
import requests
import json
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.lang import Builder
from firebase import firebase



class LoginWindow(Screen):
   pass


class ProfileWindow(Screen):


   def __init__(self):
       self.localId = None






   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)

               print(sign_up_data['localId'])



           app.root.current = "page"

       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("_", " ")



   def print_localId(self):
       print(self.localId.text)


   def __init__(self, **kwargs):
       super(ProfileWindow, self).__init__(**kwargs)




window = ProfileWindow()




class MyApp(App):
   refresh_token_file = "refresh_token.txt"


   def build(self):
       self.page = ProfileWindow()
       self.refresh_token_file = self.user_data_dir + self.refresh_token_file

       return sm


class WindowManager(ScreenManager):
   pass


sm = Builder.load_file("kivy.kv")

#sm = WindowManager() 

if __name__ == '__main__':
   MyApp().run()

kivy.kv

WindowManager:
   id: window manager
   LoginWindow:
       id: login
       name: "login"
   ProfileWindow:
       id: page
       name: "page"



<LoginWindow>

   canvas.before:
       Color:
           rgba: 1, 1, 1, 1
       Rectangle:
           pos: self.pos
           size: self.size


   TextInput:
       id: email
       hint_text: "Email"
       multiline: False
       pos_hint: {"center_x": 0.2 , "center_y":0.9}
       size_hint: 0.4, 0.10

   TextInput:
       id: password
       hint_text: "Password"
       multiline: False
       pos_hint: {"center_x": 0.2, "center_y": 0.8}
       size_hint: 0.4, 0.10
       password: True


   Button:
       pos_hint:{"x":0.3,"y":0.05}
       size_hint: 0.4, 0.1
       text: "Login"
       font_size: (root.width**2 + root.height**2)  / 14**4
       background_color: (0.082, 0.549, 0.984, 1.0)
       background_normal: ''
       on_release:
           app.page.sign_in_existing_user(email.text, password.text)

<ProfileWindow>:


   canvas.before:
       Color:
           rgba: 1, 1, 1, 1
       Rectangle:
           pos: self.pos
           size: self.size

   Button:
       pos_hint:{"x":0.3,"y":0.05}
       size_hint: 0.4, 0.1
       text: "Print localId"
       font_size: (root.width**2 + root.height**2)  / 14**4
       background_color: (0.082, 0.549, 0.984, 1.0)
       background_normal: ''
       on_release:
           root.print_localId()


追踪

[INFO   ] [Base        ] Leaving application in progress...
Traceback (most recent call last):
  File "/Users/temitayoadefemi/PycharmProjects/test6/mainfile.py", line 109, in <module>
    MyApp().run()
  File "/Users/temitayoadefemi/PycharmProjects/test6/venv/lib/python3.7/site-packages/kivy/app.py", line 855, in run
    runTouchApp()
  File "/Users/temitayoadefemi/PycharmProjects/test6/venv/lib/python3.7/site-packages/kivy/base.py", line 504, in runTouchApp
    EventLoop.window.mainloop()
  File "/Users/temitayoadefemi/PycharmProjects/test6/venv/lib/python3.7/site-packages/kivy/core/window/window_sdl2.py", line 747, in mainloop
    self._mainloop()
  File "/Users/temitayoadefemi/PycharmProjects/test6/venv/lib/python3.7/site-packages/kivy/core/window/window_sdl2.py", line 479, in _mainloop
    EventLoop.idle()
  File "/Users/temitayoadefemi/PycharmProjects/test6/venv/lib/python3.7/site-packages/kivy/base.py", line 342, in idle
    self.dispatch_input()
  File "/Users/temitayoadefemi/PycharmProjects/test6/venv/lib/python3.7/site-packages/kivy/base.py", line 327, in dispatch_input
    post_dispatch_input(*pop(0))
  File "/Users/temitayoadefemi/PycharmProjects/test6/venv/lib/python3.7/site-packages/kivy/base.py", line 293, in post_dispatch_input
    wid.dispatch('on_touch_up', me)
  File "kivy/_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
  File "/Users/temitayoadefemi/PycharmProjects/test6/venv/lib/python3.7/site-packages/kivy/uix/behaviors/button.py", line 179, in on_touch_up
    self.dispatch('on_release')
  File "kivy/_event.pyx", line 703, in kivy._event.EventDispatcher.dispatch
  File "kivy/_event.pyx", line 1214, in kivy._event.EventObservers.dispatch
  File "kivy/_event.pyx", line 1098, in kivy._event.EventObservers._dispatch
  File "/Users/temitayoadefemi/PycharmProjects/test6/venv/lib/python3.7/site-packages/kivy/lang/builder.py", line 64, in custom_callback
    exec(__kvlang__.co_value, idmap)
  File "/Users/temitayoadefemi/PycharmProjects/test6/kivy.kv", line 86, in <module>
    root.print_localId()
  File "/Users/temitayoadefemi/PycharmProjects/test6/mainfile.py", line 73, in print_localId
    print(self.localId.text)
AttributeError: 'ProfileWindow' object has no attribute 'localId'

推荐答案

ProfileWindow中有两个__init__()方法.第二个重新定义,覆盖第一个,并且不创建localId属性.您在ProfileWindow中唯一的__init__()方法应该是:

You have two __init__() methods in ProfileWindow. The second redefines, overwriting the first, and does not create the localId attribute. Your one and only __init__() method in ProfileWindow should be:

   def __init__(self, **kwargs):
       super(ProfileWindow, self).__init__(**kwargs)
       self.localId = None

下一个问题是您要创建3个ProfileWindow实例.您只需要一个.因此删除该行:

The next problem is that you are creating 3 instances of ProfileWindow. You only need one. So remove the line:

window = ProfileWindow()

,然后从App中的build()方法中,删除:

and from your build() method in the App, remove:

self.page = ProfileWindow()

ProfileWindow是由代码中的行创建的:

The ProfileWindow is created by the line in your code:

sm = Builder.load_file("kivy.kv")

ProfileWindow()的任何其他用法都会创建一个ProfileWindow的新实例,该实例不属于您的GUI.

any other use of ProfileWindow() creates a new instance of ProfileWindow that is not part of your GUI.

接下来,当您按下Login Button时,需要访问ProfileWindow的正确实例.为此,请在kv文件中将ids用作:

Next, you need to access the correct instance of ProfileWindow when you press the Login Button. To do that, make use of the ids in your kv file as:

    on_release:
        app.root.ids.page.sign_in_existing_user(email.text, password.text)

而且,我认为这是最后的错误,您的print_localId()方法尝试打印localIdtext属性,但是它没有这样的属性.只需将该方法更改为:

And, what I think is the final error, your print_localId() method tries to print the text attribute of localId, but it does not have such an attribute. Just change that method to:

   def print_localId(self):
       print(self.localId)

这篇关于如何在Kivy屏幕小部件中初始化实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆