Python 如何在Kivy屏幕小部件中初始化实例
我试图在我的kivy屏幕中访问名为self.localId的实例变量,它不断地说,在我初始化实例后,该实例不存在。我知道我的代码中有一个错误,但我很难识别它。在kivy屏幕中初始化实例有不同的方法吗?但这是我的密码。我将非常感谢任何帮助 mainfile.pyPython 如何在Kivy屏幕小部件中初始化实例,python,kivy,Python,Kivy,我试图在我的kivy屏幕中访问名为self.localId的实例变量,它不断地说,在我初始化实例后,该实例不存在。我知道我的代码中有一个错误,但我很难识别它。在kivy屏幕中初始化实例有不同的方法吗?但这是我的密码。我将非常感谢任何帮助 mainfile.py from kivy.app import App import requests import json from kivy.uix.screenmanager import Screen, ScreenManager from kivy
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()
WindowManager:
id:窗口管理器
登录窗口:
id:登录
名称:“登录”
配置文件窗口:
id:第页
名称:“第页”
在以下情况之前:
颜色:
rgba:1,1,1,1
矩形:
pos:self.pos
大小:self.size
文本输入:
id:电子邮件
提示文字:“电子邮件”
多行:False
pos_提示:{“center_x”:0.2,“center_y”:0.9}
尺寸提示:0.4,0.10
文本输入:
id:密码
提示文字:“密码”
多行:False
pos_提示:{“center_x”:0.2,“center_y”:0.8}
尺寸提示:0.4,0.10
密码:True
按钮:
pos_提示:{“x”:0.3,“y”:0.05}
尺寸提示:0.4,0.1
文本:“登录”
字体大小:(根.宽**2+根.高**2)/14**4
背景颜色:(0.082,0.549,0.984,1.0)
背景\u正常:“”
发布时:
app.page.sign\u in\u现有用户(email.text、password.text)
:
在以下情况之前:
颜色:
rgba:1,1,1,1
矩形:
pos:self.pos
大小:self.size
按钮:
pos_提示:{“x”:0.3,“y”:0.05}
尺寸提示:0.4,0.1
文本:“打印本地化”
字体大小:(根.宽**2+根.高**2)/14**4
背景颜色:(0.082,0.549,0.984,1.0)
背景\u正常:“”
发布时:
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'
[INFO][Base]正在退出应用程序。。。
回溯(最近一次呼叫最后一次):
文件“/Users/temitayoadefemi/PycharmProjects/test6/mainfile.py”,第109行,在
MyApp().run()
文件“/Users/temitayoadefemi/PycharmProjects/test6/venv/lib/python3.7/site packages/kivy/app.py”,第855行,运行中
runTouchApp()
runTouchApp中的文件“/Users/temitayoadefemi/PycharmProjects/test6/venv/lib/python3.7/site packages/kivy/base.py”,第504行
EventLoop.window.mainloop()
文件“/Users/temitayoadefemi/PycharmProjects/test6/venv/lib/python3.7/site packages/kivy/core/window/window_sdl2.py”,第747行,在主循环中
self._mainloop()
文件“/Users/temitayoadefemi/PycharmProjects/test6/venv/lib/python3.7/site packages/kivy/core/window/window_sdl2.py”,第479行,在主循环中
EventLoop.idle()
文件“/Users/temitayoadefemi/PycharmProjects/test6/venv/lib/python3.7/site packages/kivy/base.py”,第342行,处于空闲状态
self.dispatch_input()
文件“/Users/temitayoadefemi/PycharmProjects/test6/venv/lib/python3.7/site packages/kivy/base.py”,第327行,发送输入
发送后输入(*pop(0))
文件“/Users/temitayoadefemi/PycharmProjects/test6/venv/lib/python3.7/site packages/kivy/base.py”,第293行,发送后输入
wid.dispatch('我在润色时)
文件“kivy/_event.pyx”,第707行,在kivy.\u event.EventDispatcher.dispatch中
文件“/Users/temitayoadefemi/PycharmProjects/test6/venv/lib/python3.7/site packages/kivy/uix/behaviors/button.py”,第179行,在线触摸
自我分派(“发布时”)
文件“kivy/_event.pyx”,第703行,在kivy.\u event.EventDispatcher.dispatch中
文件“kivy/_event.pyx”,第1214行,在kivy.\u event.eventobservators.dispatch中
文件“kivy/_event.pyx”,第1098行,在kivy.\u event.eventobserver.\u调度
自定义回调中的文件“/Users/temitayoadefemi/PycharmProjects/test6/venv/lib/python3.7/site packages/kivy/lang/builder.py”,第64行
exec(\uuuukVLANG\uuuuuuu.co\u值,idmap)
文件“/Users/temitayoadefemi/PycharmProjects/test6/kivy.kv”,第86行,in
root.print_localId()
文件“/Users/temitayoadefemi/PycharmProjects/test6/mainfile.py”,第73行,打印为
打印(self.localId.text)
AttributeError:“ProfileWindow”对象没有属性“localId”
与“我的代码”相比,您在kivy.kv中没有定义localId,并且您没有将对象初始化为属性。
因此,这将是:
代码:
class ProfileWindow(Screen):
localId = NumericProperty()
def __init__(self):
self.localId = None
测试电压5.kv
<ProfileWindow>:
name: "page"
localId: localId
:
名称:“第页”
本地化的:本地化的
在配置文件窗口中有两个\uuuu init\uuuu()
方法。第二个重新定义、覆盖第一个属性,并且不创建localId
属性。ProfileWindow
中唯一的\uuuuu init\uuuu()方法应该是:
def __init__(self, **kwargs):
super(ProfileWindow, self).__init__(**kwargs)
self.localId = None
下一个问题是您正在创建3个ProfileWindow
实例。你只需要一个。因此,删除该行:
window = ProfileWindow()
并从应用程序中的build()
方法中删除:
self.page = ProfileWindow()
ProfileWindow
由代码中的行创建:
sm = Builder.load_file("kivy.kv")
任何其他使用ProfileWindow()
的操作都会创建一个不属于GUI的ProfileWindow
的新实例
接下来,当您按下登录
按钮
时,需要访问档案窗口的正确实例。为此,请使用kv
文件中的ids
,如下所示:
on_release:
app.root.ids.page.sign_in_existing_user(email.text, password.text)
我认为最后一个错误是,您的print\u localId()
方法尝试打印localId
的text
属性,但它没有这样的属性。只需将该方法更改为:
def print_localId(self):
print(self.localId)
为什么你总是用不同的帐号问同样的问题,然后删除其他的?@RandomUser问题越新,它得到的关注就越多。这对关注标签的人来说很烦人。即便如此,给它一些时间,耐心一点。同样的问题今天才被问到。删除它是对回答并试图帮助的人的不尊重。请添加kv文件的内容,因为它在错误消息中提到。您的回溯表明