gpt4 book ai didi

python - 一段时间后,pyglet windows 与 schedule_once 一起挂起

转载 作者:行者123 更新时间:2023-12-04 07:38:25 24 4
gpt4 key购买 nike

对于上下文,我正在尝试将 OpenAI 健身房与我编写的 pyglet 俄罗斯方 block 游戏一起使用。我面临的问题归结为下面的 MWE。
在总是相同的时间后,大约 9 秒后,窗口卡住,但 toto 函数和渲染函数的打印仍在打印。
我要疯了。 Pyglet 看起来不错,但我几乎找不到任何文档,官方文档也没什么帮助。
如果我使用带有 on_draw() 函数的更简单的代码做同样的事情,没问题,但我需要这个用于健身房部分。
谢谢

import pyglet
import time

class Display(pyglet.window.Window):
def __init__(self, ww, wh):
super().__init__(width=ww, height=wh)

class Env:
def __init__(self):
self.window = Display(640, 480)

def render(self, i):
self.window.clear()
label = pyglet.text.Label('iter {:f}'.format(i),
font_size=16,
x=300,
y=200,
anchor_x='left', anchor_y='center')
label.draw()
print('iter {:f}'.format(i))
self.window.flip()

env = Env()

def toto(dt):
for t in range(300):
time.sleep(0.5)
print("toto {:d}".format(t))
env.render(t)
print("done")
pyglet.clock.schedule_once(toto, 1)
pyglet.app.run()

最佳答案

至少在 Windows 上,我无法准确重现您遇到的问题,但我确实注意到窗口在移动、单击、最小化/恢复时会卡住。问题似乎是您不分派(dispatch)那些类型的事件,因此它们将其放在事件队列中并阻止进一步绘制。快速解决方法是调用 self.window.dispatch_events调用 self.window.clear() 后.

import pyglet
import time

class Display(pyglet.window.Window):
def __init__(self, ww, wh):
super().__init__(width=ww, height=wh)

class Env:
def __init__(self):
self.window = Display(640, 480)

def render(self, i):
self.window.clear()
self.window.dispatch_events()
label = pyglet.text.Label('iter {:f}'.format(i),
font_size=16,
x=300,
y=200,
anchor_x='left', anchor_y='center')
label.draw()
print('iter {:f}'.format(i))
self.window.flip()

env = Env()

def toto(dt):
for t in range(300):
time.sleep(0.5)
print("toto {:d}".format(t))
env.render(t)
print("done")
pyglet.clock.schedule_once(toto, 1)
pyglet.app.run()

您似乎没有充分利用此处的默认 Pyglet 事件循环,因此您可能只想编写自己的。这是您可以做到这一点的一种方法。
import pyglet
import time

class Display(pyglet.window.Window):
def __init__(self, ww, wh):
super().__init__(width=ww, height=wh)
self.label = pyglet.text.Label('',
font_size=16,
x=300,
y=200,
anchor_x='left', anchor_y='center')

def on_draw(self):
self.clear()
self.label.draw()

class Env:
def __init__(self):
self.window = Display(640, 480)

def render(self, i):
self.window.label.text = "iter {:f}".format(i)
self.window.switch_to()
self.window.dispatch_events()
self.window.dispatch_event('on_draw')
print('iter {:f}'.format(i))
self.window.flip()

env = Env()

def toto():
for t in range(300):
time.sleep(0.5)
print("toto {:d}".format(t))
env.render(t)
print("done")

toto()

关于python - 一段时间后,pyglet windows 与 schedule_once 一起挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67626206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com