2011-02-13 40 views
6

在pyglet文档,我发现:采取截图与Pyglet [Fix'd]

下面的例子演示了如何 抢你的应用程序 窗口截图: pyglet.image.get_buffer_manager().get_color_buffer().save('screenshot.png')

但是,当使用这个,一切都会停止,直到我点击鼠标。是否有另一种方法来获取Pyglet中的屏幕内容,或者强制它回到事件循环中?

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

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

+0

简单 - 奖励我的赏金! ;) – chmullig 2011-02-23 17:41:01

+0

我没理由。 ;) – 2011-02-23 17:42:09

回答

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

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

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

至于pyglet的方法,可以你发布多一点的源代码?看起来奇怪的是,这会打破事件循环。如果真的如此,也许你可以在线程中包装单个方法调用?

+0

方法调用与上例相同。至于你的答案:谢谢,我可以看到,肯定工作,但不得不安装PIL不是我会太高兴。 :/ – 2011-02-23 17:22:54