1

pyglet.window.Windowをサブクラス化したいのですが、このコードはon_draw()とon_mouse_pressed()でsuperの例外をスローします

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pyglet


class Window(pyglet.window.Window):
    def __init__(self, *arguments, **keywords):
        super(Window, self).__init__(*arguments, **keywords)

    def on_draw(self):
        super(Window, self).on_draw()
        self.clear()

    def on_key_press(self, symbol, modifiers):
        super(Window, self).on_key_press(symbol, modifiers)
        if symbol == pyglet.window.key.A:
            print "A"

    def on_mouse_press(self, x, y, button, modifiers):
        super(Window, self).on_mouse_press(x, y, button, modifiers)
        if button:
            print button


window = Window()
pyglet.app.run()

このコードはそうではありませんが。なんでこれ?Pygletイベントで安全に使用できますか?

pyglet.window.Windowのデフォルトのon_draw()はflip()を呼び出しますが、pyglet.window.Windowのon_draw()を呼び出すことができず、on_draw()がPygletモジュールのどこで定義されているかがわかりません。これはどこで定義されており、なぜpyglet.window.Windowのon_draw()をsuperで呼び出せないのですか?

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pyglet


class Window(pyglet.window.Window):
    def __init__(self, *arguments, **keywords):
        super(Window, self).__init__(*arguments, **keywords)

    def on_draw(self):
        self.clear()

    def on_key_press(self, symbol, modifiers):
        super(Window, self).on_key_press(symbol, modifiers)
        if symbol == pyglet.window.key.A:
            print "A"

    def on_mouse_press(self, x, y, button, modifiers):
        if button:
            print button


window = Window()
pyglet.app.run()
4

1 に答える 1

0

にはon_drawまたはon_mouse_press関数が定義されていないためpyglet.window.Window、それらを呼び出すことはできません。基本クラスでは、これらは登録されたイベントタイプとしてのみ存在します。つまり、ウィンドウがそれらの1つを受け取るdispatch_event()と、最初にハンドラーのイベントスタックをチェックし、次に一致する名前の関数の独自の属性をチェックします。どちらの場所にも一致するものがない場合、イベントは無視されます。これにより、コードで行ったようにハンドラーを直接定義するか、クラスの外部でデコレーターを使用してハンドラーをスタックにプッシュすることができます(またはその両方)。

は、反復ごとに各ウィンドウにイベントをEventLoopディスパッチしますが、個別に呼び出されます。on_drawflip()

ソース:

class EventLoop(event.EventDispatcher):
    # ...
    def idle(self):
        # ...
        # Redraw all windows
        for window in app.windows:
            if redraw_all or (window._legacy_invalid and window.invalid):
                window.switch_to()
                window.dispatch_event('on_draw')
                window.flip()
                window._legacy_invalid = False
于 2013-03-20T16:44:44.360 に答える