【问题标题】:Kivy: changing screen from python codeKivy:从python代码改变屏幕
【发布时间】:2016-01-14 10:43:22
【问题描述】:

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

在以下示例中,我想知道如何通过执行我的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()

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

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

【问题讨论】:

    标签: python python-2.7 kivy


    【解决方案1】:

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

    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
    

    【讨论】:

    • 太棒了。非常感谢。
    【解决方案2】:

    做这些小改动

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

    【讨论】:

    • 非常感谢@kiok46,这是一个很好的答案。不幸的是,我仍然无法解决我的问题。抱歉没有更好地表达我的问题。我真正需要知道的是如何在执行 python 代码的任意选择点更改屏幕,而不是如何加载屏幕然后在等待一定秒数后自动再次离开它(尽管那是很高兴知道)。 time.sleep(3) 行只是作为#execute random code here 的替代品。抱歉没有更清楚。有没有机会再帮我一些忙?
    • @R.Duke 你能写出你到底想做什么,没有不必要的抽象吗?什么是屏幕一,什么是屏幕二?什么情况下需要换屏到#1,什么时候换屏#2?
    • @zmarszczony 屏幕一是菜单屏幕,目前只包含一个按钮,将您发送到屏幕二。屏幕二是游戏屏幕。为了举一个简单的例子,屏幕二中的“游戏”只是等待三秒钟,但它可以是任何类型的游戏。我需要知道如何在满足某些条件时将用户从屏幕二发送回屏幕一,例如当他们的生命值为零时。
    • self.parent.current = "your_screen_name"
    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    相关资源
    最近更新 更多