首页 > 解决方案 > Python + Kivy(第二个屏幕加载空白)

问题描述

我现在正在学习 kivy……我正在为朋友开发我的第一个应用程序,一个非常简单的应用程序。但我面临这个错误:

每当我单击“创建帐户”时,名为“登录(屏幕)”的名称就会加载为空白。我在我的 kivy 文件上创建的小部件都没有显示。

以下是代码:

==================================================== =========================

蟒蛇文件:

from kivy.app import App

from kivy.uix.screenmanager import Screen, ScreenManager


class Gerenciador(ScreenManager):
    pass

class BoasVindas(Screen):
    pass

class Login(Screen):
    def logar(self, usuario, senha):
        print("usuario={0}, senha={1}".format(usuario, senha))

class Resultado(Screen):
    pass

class LoginApp(App):

    def build(self):
        return Gerenciador()

LoginApp().run()

==================================================== =======================

基维文件:

<Gerenciador>:
BoasVindas:
    name: 'boasvindas'
    BoxLayout:
        orientation:'vertical'
        Label:
            text:'Faça o seu Login ou crie uma nova conta'
        Button:
            text:'Login'

        Button:
            text:'Criar nova conta'
            on_release:root.current='login'


Login:
    name: 'login'
    BoxLayout:
        TextInput:
            id:usuario
            hint_text:'Usuário'
            multiline: False
        TextInput:
            id:senha
            hint_text:'Senha'  
            multiline: False
            password: True
        Button:
            id:'btn'
            text:'Ok'
            on_press: self.parent.parent.logar(usuario.text, senha.text)
            on_release:root.current='boasvindas'

==================================================== ========================

关于我所缺少的任何想法?第一个屏幕加载完美。如果我交换订单,登录屏幕加载良好。但是第二个屏幕是空白的,无论什么内容。只要是要加载的第二个屏幕,它就会返回空白。

谢谢!

标签: pythonkivykivy-language

解决方案


在您的__init__()方法中,Gerenciador您正在创建LoginBoasVindas屏幕,但您也在.kv文件中创建它们。你不应该两者都做。如果您在.kv文件中创建它们,您的代码如下所示:

蟒蛇文件:

from kivy.app import App

from kivy.uix.screenmanager import Screen, ScreenManager


class Gerenciador(ScreenManager):
    pass

class BoasVindas(Screen):
    pass

class Login(Screen):
    pass

class Resultado(Screen):
    pass

class TesteLogin(App):

    def build(self):
       return Gerenciador()

TesteLogin().run()

.kv 文件:

<Gerenciador>:
    BoasVindas:
        name: 'boasvindas'
        BoxLayout:
            orientation:'vertical'
            Label:
                text:'Faça o seu Login ou crie uma nova conta'
            Button:
                text:'Login'

            Button:
                text:'Criar nova conta'
                on_release:root.current='login'

    Login:
        name: 'login'
        BoxLayout:
            TextInput:
                id:usuario
                hint_text:'Usuário'
                multiline: False
            TextInput:
                id:senha
                hint_text:'Senha'
                multiline: False
                password: True
            Button:
                id:'btn'
                text:'Ok'
                #on_press:self.parent.parent.logar(usuario.text, senha.text)
                on_release:root.current='boasvindas'

在您的.kv文件中,当类名被 包围时<>,这意味着它是用于构建该类的模板,但实际上并未创建该类。创建了没有的类<>,但.kv文件中的类从属于Gerenciador该类。因此,当Gerenciador创建类的实例时(如在您的App.build()方法中),LoginBoasVindas屏幕被创建为其子项。请注意,我将name属性添加到文件中的这些屏幕.kv


推荐阅读