7

在 pyglet 文档中,我发现:

以下示例显示了如何抓取应用程序窗口的屏幕截图: pyglet.image.get_buffer_manager().get_color_buffer().save('screenshot.png')

但是,当使用它时,一切都会停止,直到我单击鼠标。是否有另一种方法可以在 Pyglet 中获取屏幕内容,或者将其强制返回事件循环?

编辑:我发现实际上有一个短暂的延迟(0.2 秒〜),但没有别的。实际上它与停止pyglet的F10键有关。>_>

我无法关闭或删除,因为有一个开放的赏金。

4

2 回答 2

9

好的,这是 pyglet 中的完整工作示例。它显示文本“hello world”在窗口周围随机走动,并在您每次按下键时转储屏幕截图(使用您发布的完全相同的代码行)。

import pyglet, random

window = pyglet.window.Window()

label = pyglet.text.Label('Hello, world',
                          font_name='Times New Roman',
                          font_size=36,
                          x=window.width//2, y=window.height//2,
                          anchor_x='center', anchor_y='center')
@window.event
def on_draw():
    window.clear()
    label.draw()

@window.event
def on_key_press(symbol, modifiers):
    pyglet.image.get_buffer_manager().get_color_buffer().save('screenshot.png')

def update(dt):
    label.x += random.randint(-10, 10)
    label.y += random.randint(-10, 10)

pyglet.clock.schedule_interval(update, 0.1)
pyglet.app.run()

截屏不会停止事件循环。pyglet 中的事件循环只是懒惰的,并试图做尽可能少的工作。如果您希望事情自行发生,您需要安排一个函数重复运行。否则,它将等待附加了侦听器的事件发生。(您的代码必须在监听鼠标事件,这就是当您单击鼠标时它会恢复工作的原因。)

简短的回答,我怀疑你需要的修复是pyglet.clock.schedule_interval(...).

于 2011-02-23T17:39:30.707 回答
1

如果你碰巧在windows平台上,你可以用PIL创建截图: http: //effbot.org/imagingbook/imagegrab.htm

(PIL 是跨平台的,除了那一种特定的方法。)

至于pyglet的方法,能多发一点源码吗?这似乎很奇怪,这会打破事件循环。如果确实如此,也许您可​​以将单个方法调用包装在一个线程中?

于 2011-02-23T17:13:55.840 回答