Kivy:从python代码更改屏幕

Kivy:从python代码更改屏幕,python,python-2.7,kivy,Python,Python 2.7,Kivy,我正在组装一个Kivy应用程序,但在解决如何在python代码中任意选择的点上更改屏幕时遇到了一些问题 在下面的示例中,我想知道如何通过执行函数mymain.py文件从Screen2切换回Screen1 这是我的main.py: # -*- coding: utf-8 -*- from kivy.app import App from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition from kivy.prop

我正在组装一个Kivy应用程序,但在解决如何在python代码中任意选择的点上更改屏幕时遇到了一些问题

在下面的示例中,我想知道如何通过执行函数my
main.py
文件从
Screen2
切换回
Screen1

这是我的
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()
这是我的
屏幕.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 1.8.0
:
盒子布局:
方向:“垂直”
大小:root.size
间距:20
填充:20
标签:
文本:“主菜单”
按钮:
文本:“按钮1”
发布时:root.manager.current=“screen2”
:        
盒子布局:
方向:“垂直”
大小:root.size
间距:20
填充:20
标签:
id:标签
文字:“欢迎来到屏幕2,请等待三秒”
:
id:屏幕管理器
第一屏:第一屏
第二屏:第二屏
第一屏:
id:第一屏
名称:“屏幕1”
经理:屏幕管理器
屏幕二:
id:屏幕2
名称:“屏幕2”
经理:屏幕管理器
很明显,我是Kivy的初学者,所以如果你能准确地告诉我需要修改什么,包括应该使用的特定语法,我将非常感激


提前感谢您的时间和智慧。

做些小改动

#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"

有关更多信息,请访问这些链接,

以下是一个基于您的其他信息的简单“游戏”示例。当玩家进入游戏屏幕时,他们的生命值正在流血。当池达到零时,它们被发送回菜单屏幕

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()
#/usr/bin/env python
#-*-编码:utf-8-*-
从kivy.app导入应用程序
从kivy.uix.screenmanager导入screenmanager、Screen、NotTransition
从kivy.properties导入ObjectProperty、NumericProperty
导入时间
导入线程
一级屏幕(屏幕):
通过
第二类屏幕(屏幕):
运行状况\u点=数值属性(100)
定义初始(自我,**kwargs):
超级(屏幕二,自我)。\uuuuuu初始化(**kwargs)
健康点定义(自身、实例、值):
如果值<1:
self.changeScreen()
def on_enter(自身,*参数):
线程=线程。线程(目标=自出血)
thread.daemon=True
thread.start()
def排放(自身,*参数):
当self.health_积分>0时:
自我健康评分-=5
睡眠时间(0.1)
def显示屏然后离开(自我):
self.changeScreen()
def更改屏幕(自身):
如果self.manager.current==“screen1”:
self.manager.current='screen2'
其他:
self.manager.current='screen1'
班级经理(屏幕经理):
screen_one=ObjectProperty(无)
screen_two=ObjectProperty(无)
类屏幕(应用程序):
def生成(自):
m=Manager(transition=nottransition())
返回m
如果名称=“\uuuuu main\uuuuuuuu”:
ScreensApp().run()
千伏电压:

#: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
#:kivy 1.8.0
:
盒子布局:
方向:“垂直”
大小:root.size
间距:20
填充:20
标签:
文本:“主菜单”
按钮:
文本:“按钮1”
发布时:
root.manager.current=“屏幕2”
#重置健康点
root.manager.ids.screen\u two.health\u points=100
:        
盒子布局:
方向:“垂直”
大小:root.size
间距:20
填充:20
标签:
id:标签
文本:“健康点:”+str(根健康点)
:
id:屏幕管理器
第一屏:第一屏
第二屏:第二屏
第一屏:
id:第一屏
名称:“屏幕1”
经理:屏幕管理器
屏幕二:
id:屏幕2
名称:“屏幕2”
经理:屏幕管理器

非常感谢@kiok46这是一个很好的答案。不幸的是,我仍然无法解决我的问题。为我的问题措辞不当而道歉。我真正需要知道的是如何在python代码执行过程中的任意选择点更改屏幕,而不是如何加载屏幕,然后在等待一定的秒数后自动离开屏幕(尽管知道这一点很酷)。
time.sleep(3)
行只是作为
#在这里执行随机代码
的替身。抱歉没有说清楚。你有没有可能再帮我一点忙?@R.Duke你能写下你到底想做什么,而不是不必要的抽象?什么是第一屏,什么是第二屏?在这种情况下,您需要将屏幕切换为#1,何时切换为#2?@zmarszczony屏幕一是一个菜单屏幕,目前只包含一个按钮,将您发送到屏幕二。第二屏是游戏屏。为了给出一个简单的例子,屏幕2中的“游戏”只包括等待三秒钟,但它可以是任何类型的游戏。我需要知道的是,当满足某些条件时,例如当用户的健康状况为零时,如何将用户从第二屏送回第一屏。
self.parent.current=“your\u Screen\u name”
Awesome。非常感谢。