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