![](/img/trans.png)
[英]Kivy - ScreenManager saying it does not recognize another screen name despite it being there?
[英]Why does Kivy ScreenManager not recognize my screen in Kivy?
這是我第一次提問,Python和Kivy的初學者。
在使用 Kivy 運行程序時,我開發了一些按計划運行的屏幕。 但是,添加新屏幕時,無法識別並返回此錯誤。
文件“kivy_event.pyx”,第 1154 行,在 kivy._event.EventObservers._dispatch 文件“C:\Users\MyName\AppData\Local\Programs\Python\Python39\lib\site-packages\kivy\uix\screenmanager.py ",第 1045 行,在 on_current screen = self.get_screen(value)
文件“C:\Users\MyName\AppData\Local\Programs\Python\Python39\lib\site-packages\kivy\uix\screenmanager.py”,第 1071 行,在 get_screen raise ScreenManagerException('No Screen with name "%s “。' % 姓名)
kivy.uix.screenmanager.ScreenManagerException:沒有名稱為“sign_up_screen_success”的屏幕。
這是我的 main.py 代碼:
import os
os.chdir(r"C:\Users\MyName\Documents\mobile app")
from kivy.app import App
import json
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from datetime import datetime
Builder.load_file('design.kv')
class LoginScreen(Screen):
def sign_up(self):
self.manager.current = "sign_up_screen"
class RootWidget(ScreenManager):
pass
class SignUpScreen(Screen):
def add_user(self, uname, pword):
with open("users.json") as file:
users = json.load(file)
users[uname] = {'username': uname, 'password': pword,
'created': datetime.now().strftime("%Y-%m-%d %H-%M-%S")}
with open("users.json", 'w') as file:
json.dump(users, file)
self.manager.current = "sign_up_screen_success"
class SignUpScreenSuccess(Screen):
pass
class MainApp(App):
def build(self):
return RootWidget()
if __name__ == "__main__":
MainApp().run()
這是 my.kv 代碼:
<LoginScreen>:
GridLayout:
cols: 1
GridLayout:
cols: 1
Label:
text: "User Login"
TextInput:
hint_text: "Username"
TextInput:
hint_text: "Password"
Button:
text: "Login"
GridLayout:
cols: 2
Button:
text: "Forgot Password?"
Button:
text: "Sign Up"
on_press: root.sign_up()
<SignUpScreen>:
GridLayout:
cols: 1
Label:
text: "Sign up for a space journey!"
TextInput:
id: username
hint_text: "Username"
TextInput:
id: password
hint_text: "Password"
Button:
text: "Submit"
on_press: root.add_user(root.ids.username.text, root.ids.password.text)
<SignUpScreenSuccess>:
GridLayout:
cols: 1
Label:
text: "Sign up successful!"
Button:
text: "Login page"
<RootWidget>:
LoginScreen:
name: "login_screen"
SignUpScreen:
name: "sign_up_screen"
SignUpScreenSuccess:
name: "sign_up_screen_success"
根據我收集到的信息,由於我在 my.kv 代碼的 RootWidget 中定義了“sign_up_screen_success”以對應於 SignUpScreenSuccess,因此我應該進入另一個屏幕。 那么,為什么這不起作用?
SignUpScreen 和 LoginScreen 工作正常,但我看不出它們和 SignUpScreenSuccess 之間的代碼有任何區別。
如果我需要澄清其他任何事情,請告訴我。
謝謝。
我不確定它是否可以解決問題,但在我見過的示例中並根據文檔: https://kivy.org/doc/stable/guide/lang.html
kv 中的根小部件沒有 <> 括號。
像這樣:
RootWidget:
LoginScreen:
name: "login_screen"
SignUpScreen:
name: "sign_up_screen"
SignUpScreenSuccess:
name: "sign_up_screen_success"
嘿,過去幾周我一直在研究 Kivy。 您可以嘗試像這樣初始化名稱嗎:
<LoginScreen>:
name: "login_screen"
GridLayout:
cols: 1
GridLayout:
cols: 1
Label:
text: "User Login"
TextInput:
hint_text: "Username"
TextInput:
hint_text: "Password"
Button:
text: "Login"
GridLayout:
cols: 2
Button:
text: "Forgot Password?"
Button:
text: "Sign Up"
on_press: root.sign_up()
<SignUpScreen>:
name: "sign_up_screen"
GridLayout:
cols: 1
Label:
text: "Sign up for a space journey!"
TextInput:
id: username
hint_text: "Username"
TextInput:
id: password
hint_text: "Password"
Button:
text: "Submit"
on_press: root.add_user(root.ids.username.text, root.ids.password.text)
<SignUpScreenSuccess>:
name: "sign_up_screen_success"
GridLayout:
cols: 1
Label:
text: "Sign up successful!"
Button:
text: "Login page"
<RootWidget>:
LoginScreen:
SignUpScreen:
SignUpScreenSuccess:
我這樣編碼我的屏幕,我認為這應該可以工作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.