python - 在指定时间后更新小部件

标签 python kivy

我不明白如何更新 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 文件

#:kivy 1.0.9
<PongGame>:
    labe:lab
    Label:
        id: lab
        font_size: 70  
        center_x: root.width / 4
        top: root.top - 50
        text: str("Hello")

当我运行它时,它全部卡住。然后我看到的就只有5。 我怎样才能让其他人出现?

最佳答案

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 中定期安排某些事情的最简单方法是创建一个函数并 Hook 到此事件循环,告诉时钟在某个时间间隔或每次重复某个时间段后运行您的函数。在您的情况下,您希望每 3 秒更改一次文本。

这是一个简短的示例,说明如何实现您想要的目标:

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

from functools import partial
from kivy.lang import Builder
from kivy.clock import Clock


Builder.load_string('''
<PongGame>:
    labe:lab
    Label:
        id: lab
        font_size: 70  
        center_x: root.width / 4
        top: root.top - 50
        text: str("Hello")
''')


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

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



class PongApp(App):

    def build(self):
        game = PongGame()
        game.settext(1)

        Clock.schedule_once(partial(game.settext, 5), 3)
        Clock.schedule_once(partial(game.settext, 87), 6)
        Clock.schedule_once(partial(game.settext, 5), 9)

        return game


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

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

如果您不清楚其含义,请尝试这些参数,看看会发生什么。

关于python - 在指定时间后更新小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21025721/

相关文章:

python - 为什么有些人将两个不同网络的参数链接起来并使用相同的优化器进行训练?

python : How to add vertical scroll in RecycleView

python - Kivy 文本输入换行

python - Kivy 按钮文本对齐 (halign) 不起作用

kivy - Kivy 和 Buildozer 的问题

python - 我可以控制由 Bokeh 创建的内联 css(或完全删除它)吗?

python - pysvn.Client.callback_ssl_server_trust_prompt 错误

kivy - 有什么方法可以在 Kivy App 上转换广告?

python - 如何在 Travis CI 上构建 MacOSX 可执行文件?

python - Odoo:One2many 字段不工作