python - 按下按键时窗口显示上一帧

标签 python pyglet

我创建了一个简单的脚本,显示一个向左移动的正方形:

import pyglet

window = pyglet.window.Window(800, 600)

x = 0
y = 250
width = 100
height = 100


def update(time):
    global x

    window.clear()
    pyglet.graphics.draw(4, pyglet.gl.GL_QUADS, ('v2f', [x, y, x, y+height, x+width, y+height, x+width, y]))
    x += 10


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

pyglet.app.run()

当没有键盘输入时,正方形会正确渲染,但每当我按下一个键时,看起来窗口就会被清除,并且前一帧会再次渲染。我通过拆分更新函数并使用 on_key_press() 函数解决了这个问题:

@window.event
def on_key_press(symbol, modifiers):
    draw()


def update(time):
    global x
    x += 10
    draw()


def draw():
    window.clear()
    pyglet.graphics.draw(4, pyglet.gl.GL_QUADS, ('v2f', [x, y, x, y + height, x + width, y + height, x + width, y]))

但我认为这不是解决问题的正确方法,因为我在一帧中渲染正方形两次。您可以在这里查看问题所在:https://youtu.be/cIwuLYuLWtY .

最佳答案

在 pyglet 中,窗口应该在 on_draw() 中重绘。另请参阅Writing a pyglet application .
事件发生后,on_draw 事件被执行并更新窗口。
当没有实现 on_draw 事件时,似乎在双缓冲上下文中,在按键事件之后触发了缓冲区交换。由于场景未更新(因为也没有 on_draw),因此显示前一帧。

我建议实现一个 on_draw 事件来重绘窗口:

import pyglet

window = pyglet.window.Window(800, 600)
x, y, width, height = 0, 250, 100, 100

def update(time):
    global x
    x += 10

@window.event
def on_draw():
    window.clear()
    pyglet.graphics.draw(4, pyglet.gl.GL_QUADS, ('v2f', [x, y, x, y+height, x+width, y+height, x+width, y]))

pyglet.clock.schedule_interval(update, 1/10)
pyglet.app.run()

关于python - 按下按键时窗口显示上一帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57576644/

相关文章:

python - 在这个信号量示例中,是否有必要为 refill() 和 buy() 锁定?

pyglet on_draw 事件仅在鼠标移动时发生

opengl - 使用 pyglet 滚动窗口的最佳方式

python - Pyglet 行走动画。错误: 'NoneType' object has no attribute 'draw'

python - 如何计算 POS 标注器的标注精度和召回率?

Python 测试数据框列的真/假条件并在新列中返回输出

python - 排序()返回无

python - Pyglet 未绘制预定函数

python - 使用 pyglet 加载图像将一些透明像素变成白色

javascript - 在 ubuntu 中使用 Flask 将 .js 包含在 .html 中时出现引用错误