2016-07-21 20 views
2

Das Ziel, um eine Schaltfläche auf meinem Startbildschirm zu haben, wenn ein Verzögerungsbildschirm gedrückt wird, wird geöffnet. Es ist dann eine Zeitverzögerung von 5 Sekunden erforderlich, nach der der Bildschirm nach Hause zurückkehren wird.Kivy Screen Transition mit Zeitverzögerung

Mein Problem ist jede Zeitverzögerung auf den Knopf drücken verknüpft, um die Verzögerung Bildschirm Öffnen stoppt

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition 
from 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() 

Antwort

1

Sie wollen nicht time.sleep() verwenden, wenn Sie wollen UI nicht blockieren . Verwenden Sie stattdessen kivy.clock.

Es ist mir nicht klar, ob Sie 5 Sekunden nach dem Drücken einer Taste oder 5 Sekunden nach dem Aufrufen des Bildschirms zum Bildschirm zurückkehren möchten. In diesem Beispiel wird nach Tastendruck wieder:

from kivy.app import App 
from kivy.lang import Builder 
from kivy.clock import Clock, mainthread 
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition 
from kivy.uix.floatlayout import FloatLayout 
from 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() 

Wenn Sie zurück von 5 Sekunden nach der Eingabe Bildschirm gehen wollen, ähnlich Anruf getakteten Funktion zu verwenden, sondern von Screen.on_enter().