2016-07-21 3 views
2

Цель открыть кнопку на моем главном экране при нажатии экрана задержки откроется. Затем требуется временная задержка в 5 секунд, после чего экран вернется на родину.Kivy Screen Transition с задержкой по времени

Моя проблема в любое время задержки связана с нажатием кнопки, останавливает экран задержки с открытием

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() 

ответ

1

Вы не хотите использовать time.sleep(), если вы не хотите, чтобы блокировать пользовательский интерфейс , Вместо этого используйте kivy.clock.

Мне не ясно, если вы хотите вернуться к экрану через 5 секунд после нажатия кнопки или через 5 секунд после входа в экран. Этот пример будет вернуться после нажатия кнопки:

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() 

Если вы хотите, чтобы вернуться через 5 секунд после ввода экрана, используйте подобный вызов синхронизированной функции, но из Screen.on_enter().

Смежные вопросы