使用Pyglet截图[修复]

7 投票
2 回答
3229 浏览
提问于 2025-04-16 11:45

在pyglet的文档中,我发现了以下内容:

下面这个例子展示了如何抓取你应用窗口的截图:

pyglet.image.get_buffer_manager().get_color_buffer().save('screenshot.png')

不过,当我使用这个方法时,一切都会停止,直到我点击鼠标。有没有其他方法可以在Pyglet中获取屏幕内容,或者强制它回到事件循环中?

补充:我发现其实是有一个短暂的延迟(大约0.2秒),但没有其他问题。实际上,这和F10键有关,它会让pyglet停止运行。>_>

我不能关闭或删除这个问题,因为有一个悬赏在进行中。

2 个回答

1

如果你在使用Windows系统,可以通过PIL来创建截图:http://effbot.org/imagingbook/imagegrab.htm

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

关于pyglet的方法,你能多发一点源代码吗?看起来这个方法会让事件循环出问题,这有点奇怪。如果真是这样,也许你可以把这个方法放到一个线程里去执行?

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(...)

撰写回答