我试图在我的kivy屏幕中访问名为self.localId的实例变量,它不断地说,在我初始化实例后,该实例不存在。我知道我的代码中有一个错误,但我很难识别它。在kivy屏幕中初始化实例有不同的方法吗?但这是我的密码。我将非常感谢任何帮助
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()
千伏
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__()
方法应该是:下一个问题是您正在创建3个
ProfileWindow
实例。你只需要一个。因此,删除该行:并从
App
中的build()
方法中删除:ProfileWindow
由代码中的行创建:对
ProfileWindow()
的任何其他使用都会创建一个不属于GUI的ProfileWindow
的新实例接下来,当按下}键时,需要访问
Login
{ProfileWindow
的正确实例。为此,请使用kv
文件中的ids
,如下所示:我认为最后一个错误是,您的
print_localId()
方法试图打印localId
的text
属性,但它没有这样的属性。只需将该方法更改为:当与我的代码比较时,您错过了kivy.kv中localId的定义,并且没有将对象初始化为属性。 因此,这将是:
代码:
测试电压5.kv
相关问题 更多 >
编程相关推荐