使用Pyglet截图[修复]
在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(...)
。