指定时间后更新小工具

2024-10-06 10:27:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我不明白如何更新kivy屏幕。 这是我的python文件:

import kivy
kivy.require('1.1.1')

from kivy.app import App
from kivy.uix.widget import Widget
import time


class PongGame(Widget):
    labe = ObjectProperty(None)

    def settext(self,x):
        self.labe.text = str(x)
        print "DONE"



class PongApp(App):

    def build(self):
        game = PongGame()
        game.settext(1)
        time.sleep(3)
        game.settext(5)
        time.sleep(3)
        game.settext(87)
        time.sleep(3)
        game.settext(5)
        return game


if __name__ == '__main__':
    PongApp().run()

这是我的kv档案

^{pr2}$

当我运行它所有的冻结。我只看到5分。 我怎样才能让其他人出现?在


Tags: fromimportselfgameapptimedefsleep
1条回答
网友
1楼 · 发布于 2024-10-06 10:27:27
def build(self):
        game = PongGame()
        game.settext(1)
        time.sleep(3)
        game.settext(5)
        time.sleep(3)
        game.settext(87)
        time.sleep(3)
        game.settext(5)
        return game

您的问题是sleep阻塞了整个线程-在调用期间,整个程序只是停止执行任何操作。这包括任何已绘制的图形界面,它不能更新甚至不能接收输入,因为它运行在同一线程中,并且在阻塞函数调用停止之前不会再次运行。在

实际上,您还存在这样一个问题:所有这些更改都发生在绘制gui之前(游戏只在从build返回的之后才会显示在kivy窗口中)。在

你必须从kivy的主循环和时钟的角度来考虑——kivy正在尽可能频繁地运行某些功能,比如触摸检测和图形更新。如果您在这个循环中运行一些需要很长时间的代码,那么kivy的其余部分都不能工作,直到您的代码终止。这在gui编程中是很正常的,你总是要小心不要阻塞主程序循环。在

在kivy中,有规律地安排某件事的最简单的方法是创建一个函数并挂接到这个事件循环中,告诉时钟在某个时间间隔或某个时间段的每次重复之后运行您的函数。在您的例子中,您希望每隔3秒更改一次文本。在

下面是一个简短的例子,说明如何实现您想要的:

^{pr2}$

这里有一些重要的注意事项。一个是我使用functools.partial(),因为您需要将一个函数传递给Clock.schedule_oncepartial从现有函数(这里是game.settext)和一些要使用的默认参数(这里是标签的数字)创建一个函数。将*args添加到PongGame.settext也很重要,因为时钟会自动传递一些我们不关心的额外参数。在

如果你不清楚这一点的含义,可以用这些参数进行实验,看看会发生什么。在

相关问题 更多 >