python 2.7 - Kivy Screen Transition with time delay -


the aim to have button on home screen, when pressed delay screen open. time delay of 5 seconds needed after screen return home.

my problem time delay linked button press, stops delay screen opening

from kivy.app import app kivy.lang import builder kivy.uix.screenmanager import screenmanager, screen, fadetransition kivy.uix.floatlayout import floatlayout import time   builder.load_string(""" <mainscreen>:     name: "main"     floatlayout:         canvas:         rectangle:             pos: self.pos             size: self.size     button:         background_color: 1, .8, .3, 1         text:'home'         size_hint: .8,.2         pos_hint: {'center_x':.5,'y':.1}         on_press:root.manager.current = "delay"  <timedelay>:     name: "delay"      floatlayout:         button:             color: 0,1,0,1             font_size: 25             size_hint: 0.3,0.2             text: "delay"             pos_hint: {'center_x':0.5,'top':0.5}             on_press:root.manager.current = "main" """) class mainscreen(screen):     pass  class timedelay(screen):         time.sleep(5)         sm.switch_to('main')  sm = screenmanager() sm.add_widget(mainscreen(name='main')) sm.add_widget(timedelay(name='delay'))  class timedelayapp(app):     def build(self):         return sm  if __name__ == "__main__":     timedelayapp().run() 

you don't want use time.sleep() if don't want block ui. use kivy.clock instead.

it not clear me if want go screen 5 seconds after button press, or 5 seconds after entering screen. example come after button press:

from kivy.app import app kivy.lang import builder kivy.clock import clock, mainthread kivy.uix.screenmanager import screenmanager, screen, fadetransition kivy.uix.floatlayout import floatlayout kivy.uix.button import button   kv_string = """ screenmanager:     mainscreen:     timedelay:  <mainscreen>:     name: "main"     floatlayout:         canvas:             rectangle:                 pos: self.pos                 size: self.size     button:         background_color: 1, .8, .3, 1         text:'home'         size_hint: .8,.2         pos_hint: {'center_x':.5,'y':.1}         on_press: root.manager.current = "delay"  <timedelay>:     name: "delay"     floatlayout:         buttondelay:             color: 0,1,0,1             font_size: 25             size_hint: 0.3,0.2             text: "delay"             pos_hint: {'center_x':0.5,'top':0.5}             ##on_press: root.manager.current = "main"             on_press: self.clocked_switch() """   class mainscreen(screen):     pass   class timedelay(screen):     pass   class buttondelay(button):     def clocked_switch(self):         clock.schedule_once(self.switch_to_main, 5)      def switch_to_main(self, *args):         app = app.get_running_app()         app.root.current = "main"   class timedelayapp(app):     def build(self):         root_widget = builder.load_string(kv_string)         return root_widget   if __name__ == "__main__":     timedelayapp().run() 

if want go 5 seconds after entering screen, use similar clocked function call, screen.on_enter().


Comments