簡體   English   中英

為什么 Kivy ScreenManager 在 Kivy 中無法識別我的屏幕?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM