【问题标题】:Why does Kivy ScreenManager not recognize my screen in Kivy?为什么 Kivy ScreenManager 在 Kivy 中无法识别我的屏幕?
【发布时间】:2021-03-30 16:56:52
【问题描述】:

这是我第一次提问,也是 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('没有名为 "%s" 的屏幕。' % name)

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()

这是我的 .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"


根据我收集到的信息,由于我在 .kv 代码的 RootWidget 中定义了“sign_up_screen_success”以对应于 SignUpScreenSuccess,因此我应该转到另一个屏幕。那么,为什么这不起作用?

SignUpScreen 和 LoginScreen 工作正常,但我看不出它们与 SignUpScreenSuccess 之间的代码有任何区别。

如果我需要澄清其他任何事情,请告诉我。

谢谢。

【问题讨论】:

    标签: python python-3.x kivy kivy-language


    【解决方案1】:

    我不确定它是否能解决问题,但在我见过的示例中并根据文档: 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"
    

    【讨论】:

      【解决方案2】:

      嘿,过去几周我也一直在研究 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:
            
      
      
      
      

      我是这样编写我的屏幕的,我认为这应该可以工作

      【讨论】:

      • 我试图这样编码,但现在由于某种原因出现了一个新错误。它说第 40 行有一个无效的缩进,并且必须是 4 个空格的倍数。我真的不知道为什么会出现,因为我已经三次检查它是 4 个空格。但是,这个错误也出现在我最初的 .kv 程序中,所以我猜这不是代码的错,而是与我的编辑器(Atom)或任何相关的东西有关。
      • 我刚刚看到 的缩进与 不同。我使用 PyCharm 顺便说一句
      猜你喜欢
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多