2016-01-14 7 views
0

Я собираю приложение Kivy, и у меня возникают проблемы с разработкой того, как сменить экраны в произвольно выбранной точке кода python.Kivy: изменение экрана из кода python

В следующем примере я хотел бы знать, как переключиться с Screen2 на Screen1, выполнив функцию my main.py.

Вот мой main.py:

# -*- coding: utf-8 -*- 

from kivy.app import App 
from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition 
from kivy.properties import ObjectProperty 
from functools import partial 

import random 
import time 

class ScreenOne(Screen): 
    pass 

class ScreenTwo(Screen): 

    def __init__(self,**kwargs): 
     super(ScreenTwo, self).__init__(**kwargs) 
     self.displayScreenThenLeave() 

    def displayScreenThenLeave(self): 
     # 'time.sleep(3)' is a stand-in for "execute some code here" 
     time.sleep(3) 
     self.changeScreen() 

    # I want this function to send the user back to ScreenOne. 
    def changeScreen(self): 
     pass 

class Manager(ScreenManager): 

    screen_one = ObjectProperty(None) 
    screen_two = ObjectProperty(None) 

class ScreensApp(App): 

    def build(self): 
     m = Manager(transition=NoTransition()) 
     return m 

if __name__ == "__main__": 
    ScreensApp().run() 

А вот мой screens.kv:

#:kivy 1.8.0 

<ScreenOne>: 

    BoxLayout: 
     orientation: "vertical" 
     size: root.size 
     spacing: 20 
     padding: 20 

     Label: 
      text: "Main Menu" 
     Button: 
      text: "Button 1" 
      on_release: root.manager.current = "screen2" 

<ScreenTwo>:   

    BoxLayout: 
     orientation: "vertical" 
     size: root.size 
     spacing: 20 
     padding: 20 

     Label: 
      id: label 
      text: "Welcome to Screen 2, please wait three seconds" 

<Manager>: 
    id: screen_manager 

    screen_one: screen_one 
    screen_two: screen_two 

    ScreenOne: 
     id: screen_one 
     name: "screen1" 
     manager: screen_manager 

    ScreenTwo: 
     id: screen_two 
     name: "screen2" 
     manager: screen_manager 

Как должно быть совершенно очевидно, я полный новичок в Kivy, так что я бы очень признателен, если вы можете показать мне, что мне нужно изменить, включая конкретный синтаксис, который следует использовать.

Заранее благодарим за ваше время и мудрость.

ответ

2

Вот простой «игра» пример, основанный на вашей дополнительной информации. Когда игрок входит в игровой экран, их очки здоровья кровоточат. Когда пул достигнет нуля, они будут отправлены обратно на экран меню.

main.py:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

from kivy.app import App 
from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition 
from kivy.properties import ObjectProperty, NumericProperty 

import time 
import threading 


class ScreenOne(Screen): 
    pass 


class ScreenTwo(Screen): 
    health_points = NumericProperty(100) 

    def __init__(self, **kwargs): 
     super(ScreenTwo, self).__init__(**kwargs) 

    def on_health_points(self, instance, value): 
     if value < 1: 
      self.changeScreen() 

    def on_enter(self, *args): 
     thread = threading.Thread(target=self.bleed) 
     thread.daemon = True 
     thread.start() 

    def bleed(self, *args): 
     while self.health_points > 0: 
      self.health_points -= 5 
      time.sleep(0.1) 

    def displayScreenThenLeave(self): 
     self.changeScreen() 

    def changeScreen(self): 
     if self.manager.current == 'screen1': 
      self.manager.current = 'screen2' 
     else: 
      self.manager.current = 'screen1' 


class Manager(ScreenManager): 

    screen_one = ObjectProperty(None) 
    screen_two = ObjectProperty(None) 


class ScreensApp(App): 

    def build(self): 
     m = Manager(transition=NoTransition()) 
     return m 

if __name__ == "__main__": 
    ScreensApp().run() 

screens.kv:

#:kivy 1.8.0 

<ScreenOne>: 

    BoxLayout: 
     orientation: "vertical" 
     size: root.size 
     spacing: 20 
     padding: 20 

     Label: 
      text: "Main Menu" 
     Button: 
      text: "Button 1" 
      on_release: 
       root.manager.current = "screen2" 
       # reset health_points 
       root.manager.ids.screen_two.health_points = 100 

<ScreenTwo>:   

    BoxLayout: 
     orientation: "vertical" 
     size: root.size 
     spacing: 20 
     padding: 20 

     Label: 
      id: label 
      text: "health points: " + str(root.health_points) 

<Manager>: 
    id: screen_manager 

    screen_one: screen_one 
    screen_two: screen_two 

    ScreenOne: 
     id: screen_one 
     name: "screen1" 
     manager: screen_manager 

    ScreenTwo: 
     id: screen_two 
     name: "screen2" 
     manager: screen_manager 
+0

Awesome. Огромное спасибо. –

1

сделать эти небольшие изменения

#import Clock to create a schedule 
from kivy.clock import Clock 

class ScreenTwo(Screen): 

    def __init__(self,**kwargs): 
     super(ScreenTwo, self).__init__(**kwargs) 

    #this is event that is fired when the screen is displayed. 
    def on_enter(self, *args): 
     self.displayScreenThenLeave() 

    def displayScreenThenLeave(self): 
     #schedued after 3 seconds 
     Clock.schedule_once(self.changeScreen, 3) 

    def changeScreen(self, *args): 
     #now switch to the screen 1 
     self.parent.current = "screen1" 

для более знаков В перейти по этим ссылкам Screen Manager, Clock

+0

Большое спасибо @ kiok46 это отличный ответ. К сожалению, я все еще не смог исправить свою проблему. Пристрастия к тому, что я не формулирую свой вопрос лучше. Мне действительно нужно знать, как изменить экран в произвольно выбранной точке при выполнении кода python, а не как загрузить экран, а затем автоматически оставить его снова после ожидания определенного количества секунд (хотя это круто, чтобы знать). Строка 'time.sleep (3)' была просто обозначена как «стоящий» для '#execute random code here'. Извините за неясность. Вы могли бы немного помочь мне? –

+0

@ R.Duke Не могли бы вы написать, что именно вы пытаетесь сделать, без лишней абстракции? Что такое экран, и что такое экран два? В этом случае вам нужно сменить экран на # 1 и на экран # 2? – jligeza

+0

@zmarszczony Screen One - это экран меню, в котором на данный момент имеется только одна кнопка, которая отправляет вас на Screen Two. Экран Two - игровой экран. Ради простого примера, «игра» в Screen Two состоит только в ожидании трех секунд, но это может быть любая игра. Что мне нужно знать, как это сделать, так это как отправить пользователя с экрана два обратно на экран один, когда выполняются определенные условия, например. когда их здоровье равно нулю. –

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