Python Pyglet从for循环移动精灵位置,而不是使用Pyglet时钟

Python Pyglet从for循环移动精灵位置,而不是使用Pyglet时钟,python,for-loop,pyglet,Python,For Loop,Pyglet,我正在编写我的第一个pyglet应用程序来可视化另一个脚本所做的一些计算。 不幸的是,我被困住了,不知道下一步该去哪里 我试图使用for循环将精灵从其位置移动到另一个位置, 所以在每个循环结束时,它会将精灵相对于旧位置的位置更改为循环计算的特定距离 这是我正在编写的代码的简化版本(我希望这将帮助其他人解决类似问题,然后复制我自己的特定项目) 我不想使用pyglet.clock.schedule\u interval(update()),因为循环的计算时间可能比clock.schudule要长,所

我正在编写我的第一个pyglet应用程序来可视化另一个脚本所做的一些计算。 不幸的是,我被困住了,不知道下一步该去哪里

我试图使用for循环将精灵从其位置移动到另一个位置, 所以在每个循环结束时,它会将精灵相对于旧位置的位置更改为循环计算的特定距离

这是我正在编写的代码的简化版本(我希望这将帮助其他人解决类似问题,然后复制我自己的特定项目)

我不想使用
pyglet.clock.schedule\u interval(update())
,因为循环的计算时间可能比
clock.schudule
要长,所以移动不会很平稳,但这很好


我遇到的问题是,在循环完成之前,什么都不会发生,只有在python运行完它调用的
pyglet.app.run()
循环之后,但是如果我在循环之前调用
pyglet.app.run()
,它只会在我关闭pyglet窗口之后运行循环。

当使用
pyglet
时,你不能控制程序的主循环

主循环由
pyglet.app.run()
启动,您可以使用
window.event
装饰器钩住事件

在主循环开始之前运行循环。这就是为什么看起来什么都没发生

如果要每0.1秒调用一次
update
,则应使用
clock.schedule\u interval
,它需要调用一个函数和一个interval参数。如果要为
距离中的每个值移动精灵一次,可以使用迭代器和嵌套函数,如:

def update():
   g = iter(distance)
   def inner(): 
       try:
           update(next(g))    
       except StopIteration:
           pass
   return inner

pyglet.clock.schedule_interval(update(), .1)

根据您的评论进行编辑:

考虑到你的循环:

for i in distance:
    time.sleep(0.1)
    update(i)
您可以将其转换为迭代器:

def calculate():
    for i in distance:
        time.sleep(0.1) # just some expensive calculation
        yield i
并在绘图()上的
内使用它。


你是不是应该在循环中还是在更新中运行?不,pyglet是一个事件驱动的框架,当主循环启动时,pyglet自己用
app.run()
重复调用
on\u-draw
。所以我在循环中调用pyglet.clock.schedule\u interval()?我的问题是我不知道循环需要多长时间来计算,在循环结束时,我有一个变量,它包含计算时间和计算距离。这就是我试图调用update()作为循环的最后一行的原因。sleep(0.1)为了模拟循环计算所需的时间,循环中有很多与小猪无关的代码question@user2879397也许我误解了你的问题。所以你基本上有一个循环,在这个循环中你想做昂贵的计算,然后多次更新精灵的位置?如果是这样,您可以使用相同的技术(使用迭代器)并在
on_draw()
中简单地使用它。我会更新我的答案。我知道了,我想,调用我在问题中所做的更新(),它会起作用。一些非常奇怪的事情正在发生,我想,当我在pyglet窗口内移动鼠标时,循环会停止,并在一些随机的地方持续。也许这应该是另一个问题?
def calculate():
    for i in distance:
        time.sleep(0.1) # just some expensive calculation
        yield i
calc = calculate()

@window.event
def on_draw():
    window.clear()
    batch.draw()
    try: update(next(calc)) 
    except StopIteration: pass