Делаем скриншот с Pyglet [Fix'd] - PullRequest
6 голосов
/ 13 февраля 2011

В документах Pyglet я нашел:

В следующем примере показано, как захватить скриншот вашего приложения окно: pyglet.image.get_buffer_manager().get_color_buffer().save('screenshot.png')

Однако при использовании этого все будет останавливаться, пока я не щелкну мышью. Есть ли другой способ получить содержимое экрана в Pyglet или принудительно вернуть его в цикл обработки событий?

РЕДАКТИРОВАТЬ: я обнаружил, что на самом деле есть небольшая задержка (0,2 секунды ~), но ничего больше. На самом деле это как-то связано с клавишей F10, которая останавливает пиглет. > _>

Я не могу закрыть или удалить, так как есть открытое вознаграждение.

Ответы [ 2 ]

8 голосов
/ 23 февраля 2011

Хорошо, вот полный рабочий пример в 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 голос
/ 23 февраля 2011

Если вы оказались на платформе Windows, вы можете создать скриншот с помощью PIL: http://effbot.org/imagingbook/imagegrab.htm

(PIL является кроссплатформенным, за исключением этого конкретного метода.)

Что касается метода pyglet, можете ли вы опубликовать немного больше исходного кода? Кажется странным, что это нарушит цикл событий. Если это действительно так, возможно, вы могли бы обернуть этот единственный вызов метода в потоке?

...