7

pyglet docs で、次のことがわかりました。

次の例は、アプリケーション ウィンドウのスクリーンショットを取得する方法を示しています。 pyglet.image.get_buffer_manager().get_color_buffer().save('screenshot.png')

ただし、これを使用すると、マウスをクリックするまですべてが停止します。Pyglet で画面の内容を取得する、または強制的にイベント ループに戻す別の方法はありますか?

編集:実際には短い遅延(0.2秒〜)があることがわかりましたが、他には何もありません。実はpygletを止めるF10キーと関係があります。>_>

公開中の報奨金があるため、閉鎖または削除できません。

4

2 に答える 2

9

さて、これは 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(...).

于 2011-02-23T17:39:30.707 に答える
1

Windowsプラットフォームを使用している場合は、PILを使用してスクリーンショットを作成できます:http://effbot.org/imagingbook/imagegrab.htm

(PILは、その1つの特定の方法を除いて、クロスプラットフォームです。)

pygletの方法については、もう少しソースコードを投稿できますか?それがイベントループを壊すのは奇妙に思えます。それが実際に当てはまる場合、おそらくその単一のメソッド呼び出しをスレッドでラップすることができますか?

于 2011-02-23T17:13:55.840 に答える