Снимок экрана с помощью Pyglet [Fix'D]

в документах pyglet я нашел:

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

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

EDIT: я обнаружил, что на самом деле есть короткая задержка (0,2 секунды~), но ничего больше. На самом деле это что-то сделайте с ключом F10, который останавливает pyglet. >_ >

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

2 ответов


хорошо, вот полный рабочий пример в 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(...).


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

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

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