繁体   English   中英

如何在kivy中切换屏幕?

[英]How do I switch screens in kivy?

我的代码目前存在无法切换屏幕的问题。 在我具体解释问题是什么之前,我将在下面包含我的代码片段。

来自main.py

import kivy
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.core.window import Window
from kivy.uix.screenmanager import ScreenManager, Screen

Window.clearcolor = 255 / 255, 255 / 255, 255 / 255, 1
Window.size = 414, 736

sm = ScreenManager()

class PulseWelcome(Screen):
    pass

    class PulseWelcomeCanvas(Widget):
        pass

class PulseLogin(Screen):

    class PulseLoginCanvas(Widget):
        pass

class WindowManager(ScreenManager):
    pass

sm.add_widget(PulseWelcome(name = 'welcome'))
sm.add_widget(PulseLogin(name = 'login'))

class PulseApp(App):
    def build(self):
        return PulseWelcome()

if __name__ == '__main__':
    PulseApp().run()

来自Pulse.kv

    #:kivy 2.1.0

WindowManager:
    PulseWelcome:
    PulseLogin:

<PulseWelcome>:

    id: welcome

    PulseWelcomeCanvas:

        Label:
            font_size: 30  
            font_name: 'assets/fonts/tommy.ttf'
            center_x: root.width / 2
            center_y: root.height / 2
            text: "Welcome to Pulse!"
            color: 0, 0, 0, 1

        Button:
            background_normal: 'assets/images/next_purple_normal.png'
            background_down: 'assets/images/next_purple_down.png'
            border: 0, 0, 0, 0
            center_x: root.width / 2
            center_y: 90
            height: 40
            width: 100
            on_press:
                root.manager.transition.direction = 'left'
                root.manager.current = 'login'

<PulseLogin>:

    id: login

    PulseLoginCanvas:

        Label:
            font_size: 30
            font_name: 'assets/fonts/tommy.ttf'
            text: 'Sign In or Sign Up'
            color: 0, 0, 0, 1
            center_x: root.width / 2
            center_y: root.height / 2

我的应用程序在程序启动时会正常运行,但是,当我单击按钮以更改屏幕时,会出现以下错误:

File "C:\Users\Nitro\Documents\Pulse\pulse.kv", line 30, in <module>
 root.manager.transition.direction = 'left'
 AttributeError: 'NoneType' object has no attribute 'transition'

我尝试了各种解决方案,但没有任何进展。 我的猜测是,因为我试图从屏幕类中的小部件切换屏幕,所以我得到了前面讨论的错误。 我最初决定在每个屏幕类中放置一个小部件来组织元素,因为当我尝试为屏幕类独立组织.kv文件中的元素时(PulseWelcome 等),我遇到了 gui 问题。

我还尝试在屏幕类中定义一个可以通过包含的小部件激活的函数。 在尝试之后,我得到了这个错误:

kivy.uix.screenmanager.ScreenManagerException: ScreenManager accepts only Screen widget.

不确定是否有人知道可能导致问题的原因以及如何解决它,但如果有人对前面提到的任何问题有任何形式的意见,我们将不胜感激。

您尚未初始化返回屏幕的屏幕管理器而不是屏幕管理器

主要.py:

import kivy
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.core.window import Window
from kivy.uix.screenmanager import ScreenManager, Screen

Window.clearcolor = 255 / 255, 255 / 255, 255 / 255, 1
Window.size = 414, 736

class PulseWelcome(Screen):
    pass

    class PulseWelcomeCanvas(Widget):
        pass

class PulseLogin(Screen):

    class PulseLoginCanvas(Widget):
        pass

class WindowManager(ScreenManager):
    pass


class PulseApp(App):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(PulseWelcome(name='welcome'))
        sm.add_widget(PulseLogin(name='login'))
        return sm

if __name__ == '__main__':
    PulseApp().run()

像这样定义构建函数应该可以解决问题。

.kv:

<PulseWelcome>:
    id: welcome
    PulseWelcomeCanvas:
        Label:
            font_size: 30
            font_name: 'assets/fonts/tommy.ttf'
            center_x: root.width / 2
            center_y: root.height / 2
            text: "Welcome to Pulse!"
            color: 0, 0, 0, 1
        Button:
            background_normal: 'assets/images/next_purple_normal.png'
            background_down: 'assets/images/next_purple_down.png'
            border: 0, 0, 0, 0
            center_x: root.width / 2
            center_y: 90
            height: 40
            width: 100
            on_press:
                root.manager.transition.direction = 'left'
                root.manager.current = 'login'
<PulseLogin>:

    id: login

    PulseLoginCanvas:

        Label:
            font_size: 30
            font_name: 'assets/fonts/tommy.ttf'
            text: 'Sign In or Sign Up'
            color: 0, 0, 0, 1
            center_x: root.width / 2
            center_y: root.height / 2

我还从 kv 文件中删除了屏幕管理器,因为在创建屏幕管理器时不起作用,就像我在这里所做的那样。 否则你将不得不像这样创建构建函数

建造:

def build:
    returm WindowManager()

我在执行这样的构建功能时遇到了一些麻烦,所以现在我会按照我第一次向您展示的方式进行操作

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM