2011-02-13 48 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