如何在Window的子类事件中使用Pyglet中的super?

时间:2013-03-18 19:52:25

标签: python events super pyglet

我想继承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(),我找不到Pyglet模块中定义on_draw()的位置。这个定义在哪里以及为什么我不能用super调用pyglet.window.Window的on_draw()?

#!/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()

1 个答案:

答案 0 :(得分:0)

on_draw没有定义on_mouse_presspyglet.window.Window函数,因此您无法调用它们。在基类中,这些只作为已注册的事件类型存在,这意味着当窗口通过dispatch_event()接收其中一个时,它将首先检查其事件堆栈中的处理程序,然后检查其自身的属性是否为匹配名称。如果两个地方都不匹配,则忽略该事件。这使您可以像在代码中一样直接定义处理程序,或者使用类外部的装饰器将处理程序推送到堆栈(或两者)。

EventLoop会在每次迭代过程中向每个窗口发送一个on_draw事件,但flip()会被单独调用。

来源:

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