Kivy:从python代码更改屏幕 [英] Kivy: changing screen from python code

查看:220
本文介绍了Kivy:从python代码更改屏幕的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在整理一个Kivy应用程序,在解决如何在python代码中任意选择的位置更改屏幕时遇到了一些问题.

I'm putting together a Kivy app and am having some problems working out how to change screens at an arbitrarily chosen point within the python code.

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

In the following example, I would like to know how to switch from Screen2 back to Screen1 by executing a function my main.py file.

这是我的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的初学者,所以如果您能确切地告诉我我需要更改的内容(包括应使用的特定语法),我将不胜感激.

As should be pretty evident, I'm a total beginner at Kivy, so I'd really appreciate it if you could show me exactly what I need to change, including the specific syntax that should be used.

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

Thanks in advance for your time and wisdom.

推荐答案

这里是一个基于您的附加信息的简单游戏"示例.当玩家进入游戏屏幕时,他们的健康点正在流血.当池达到零时,它们将返回到菜单屏幕.

Here is a simple 'game' example based on your additional info. When a player enters the game screen, their health points are bleeding. When the pool reaches zero, they are sent back to menu screen.

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:

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

这篇关于Kivy:从python代码更改屏幕的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆