在屏幕上停留3秒后切换屏幕

0 投票
1 回答
2007 浏览
提问于 2025-04-18 01:17

问题出在屏幕管理器上,我有两个屏幕,一个是加载屏幕(loadingscreen),另一个是菜单屏幕(menuscreen)。

一开始我先加载加载屏幕,然后过了3秒钟再切换到菜单屏幕,这个切换是通过时钟调度实现的。

在菜单屏幕上,我有一个按钮,按下这个按钮可以返回到加载屏幕。

现在我想在加载屏幕显示3秒后自动返回到菜单屏幕。有没有人能给我一个更好的方法来实现这个功能?下面是我现在的代码和我想要的效果:

我知道如果把下面的代码改成Clock.schedule_interval(self.callNext, 3)放在加载屏幕类里就能实现,但我在寻找一个更高效的选项。

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen,FallOutTransition
from kivy.properties import ObjectProperty,NumericProperty
from kivy.uix.image import Image
from kivy.graphics import Color
from kivy.clock import Clock


gui_v3 = '''
<PlayScreen>:
    play_Button: playButton
    canvas.before:
        Color:
            rgb: (0, 0, 1)
    GridLayout:
        rows:1
        size_hint: .1,.1
        pos_hint: {'center_x': .5, 'center_y': .5}
        Button:
            id: playButton
            size_hint_x: None
            width: 100
            text: 'Play !'
            font_size: 12
            bold: True
            italic: False
            border: 10,10,10,10
            color: (0.5, 1, 0.5, 1)

            on_press: root.playButton_press()
<LoadingScreen>:
    canvas:
        Color:
            rgba: 0.4, 0.4, 0.4, 1
        Rectangle:
            pos: root.center
            size: (32, 32)
    BoxLayout:
        Label:
            text: 'JB'
            font_size: 100
        Label:
            text: 'Loading...'
            font_size: 10

'''


class PlayScreen(Screen):
    play_Button = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(PlayScreen, self).__init__(**kwargs)
        Clock.schedule_interval(self.update, 1.0/2)

    def update(self,dt):
        print "Current screen is ",self.manager.current


    def playButton_press(self):
        print "Hi Play button is pressed"
        sm.current = 'loading'


class LoadingScreen(Screen):
    def __init__(self, **kwargs):
        super(LoadingScreen, self).__init__(**kwargs)
        Clock.schedule_once(self.callNext, 3)


    def callNext(self,dt):
        self.manager.current = 'play'
        print "Hi this is call Next Function of loading 1"


# Create the screen manager
Builder.load_string(gui_v3)
sm = ScreenManager(transition= FallOutTransition())
sm.add_widget(LoadingScreen(name='loading'))
sm.add_widget(PlayScreen(name='play'))


class MyJB(App):
    def build(self):
        print sm.screen_names
        return sm

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

1 个回答

1

你应该使用屏幕的 on_enter 事件。只需要在 kv 文件中这样做:

<LoadingScreen>:
    on_enter: Clock.schedule_once(self.callNext, 3)

另外,在 kv 文件的顶部,你需要导入 Clock,写上 #:import Clock kivy.clock.Clock。现在每次打开这个屏幕时,它都会安排这个回调。

撰写回答