使用Pyglet截图[修复]

时间:2011-02-13 20:27:21

标签: python events screenshot pyglet

在pyglet文档中,我发现:

  

以下示例说明如何操作   抓住你的应用程序的截图   窗口:   pyglet.image.get_buffer_manager().get_color_buffer().save('screenshot.png')

然而,当使用它时,一切都会停止,直到我点击鼠标。有另一种方法可以在Pyglet中获取屏幕内容,还是强制它回到事件循环中?

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

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

2 个答案:

答案 0 :(得分:8)

好的,这是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(...)

答案 1 :(得分:1)

如果您碰巧在Windows平台上,可以使用PIL创建屏幕截图:http://effbot.org/imagingbook/imagegrab.htm

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

至于pyglet的方法,你可以发布一些更多的源代码吗?这会破坏事件循环似乎很奇怪。如果确实如此,也许你可以在一个线程中包装那个单个方法调用吗?