2011-02-13 17 views
6

En los documentos Pyglet, que encontré:Tomar una captura de pantalla con Pyglet [Fix'd]

El siguiente ejemplo muestra cómo agarrar una captura de pantalla de la ventana de la aplicación : pyglet.image.get_buffer_manager().get_color_buffer().save('screenshot.png')

Sin embargo, al usar esto, todo se detendrá hasta que haga clic con el mouse. ¿Hay alguna otra forma de obtener los contenidos de la pantalla en Pyglet, o de forzarlo de vuelta al ciclo de eventos?

EDIT: he encontrado que en realidad hay un pequeño retraso (0.2 segundos ~), pero nada más. En realidad, tiene algo que ver con la tecla F10 que detiene la piruleta. > _>

No puedo cerrar o eliminar ya que hay una recompensa abierta.

+0

Fácil - ¡dame la recompensa! ;) – chmullig

+0

No tengo ninguna razón para hacerlo. ;) –

Respuesta

8

De acuerdo, aquí hay un ejemplo completo de trabajo en pyglet. Muestra el texto "hello world" dando un paseo aleatorio por la ventana y volca la captura de pantalla (usando la misma línea de código que publicaste) cada vez que presionas una tecla.

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

Al tomar la captura de pantalla no se detiene el ciclo de eventos. El ciclo de evento en pyglet es flojo e intenta hacer el menor trabajo posible. Necesitas programar una función para que se ejecute repetidamente si quieres que las cosas sigan sucediendo por sí mismas. De lo contrario, esperará a que suceda un evento que tenga un oyente conectado. (Su código debe estar escuchando el evento del mouse, que es por lo que reanuda el trabajo cuando hace clic con el mouse.)

Respuesta corta, sospecho que la solución que necesita es pyglet.clock.schedule_interval(...).

+0

En realidad, he encontrado que el problema es otra cosa (que no sospeché, así que ...); sin embargo, te otorgaré la recompensa cuando pueda (mañana). Gracias, esta sería una gran respuesta si la pregunta aún está en pie. ;) –

1

Si usted sucede estar en una plataforma Windows, puede crear una captura de pantalla con el PIL: http://effbot.org/imagingbook/imagegrab.htm

(PIL es multiplataforma a excepción de que un método en particular.)

Como para el método de Pyglet, puede publica un poco más código fuente? Parece extraño que eso rompa el ciclo del evento. Si ese es realmente el caso, ¿tal vez podría ajustar esa llamada a un solo método en un hilo?

+0

La llamada al método es la misma que en el ejemplo anterior. En cuanto a su respuesta: gracias, puedo ver que definitivamente funciona, pero tener que instalar PIL no es algo con lo que estaría muy contento. :/ –

Cuestiones relacionadas