使用Pyglet进行屏幕截图 [已修复]

7
在pyglet文档中,我找到了以下内容:
以下示例展示了如何截取应用程序窗口的屏幕截图: pyglet.image.get_buffer_manager().get_color_buffer().save('screenshot.png') 但是,在使用此方法时,一切都会停止,直到我点击鼠标。在Pyglet中是否有另一种获取屏幕内容或将其强制返回事件循环的方法?
编辑:我发现实际上存在短暂的延迟(约0.2秒),但没有其他问题。实际上,这与F10键有关,它会停止pyglet。 >_>
由于有未解决的悬赏,我无法关闭或删除。

简单 - 授予我赏金吧! ;) - chmullig
2个回答

10

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

我发现问题实际上是另外一件事(我没有怀疑,所以...);但是,我会在能够时(明天)授予您悬赏。谢谢,如果问题仍然存在,这将是一个很好的答案。 ;) - PrettyPrincessKitty FS

1

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

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

至于pyglet的方法,您能发布更多的源代码吗?看起来这很奇怪,它会破坏事件循环。如果真是这样,也许您可以将单个方法调用包装在一个线程中?


方法调用与上面的示例相同。至于你的答案:谢谢,我可以看到它肯定有效,但是必须安装PIL并不是我很满意的事情。 :/ - PrettyPrincessKitty FS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接