python - 如何在 kivy 中切换 screens?

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

来自 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

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

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

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

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

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

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

回答1

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

主要.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()

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

希望这可以帮助

相似文章

最新文章