Skip to main content
 首页 » 编程设计

python之Kivy:从 python 代码更改屏幕

2025年05月04日30arxive

我正在组装一个 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() 

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

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

请您参考如下方法:

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

主要.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() 

屏幕.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