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 事件中安全使用 super 吗?

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()
4

1 回答 1

0

没有为定义on_draworon_mouse_press函数pyglet.window.Window,因此您不能调用它们。在基类中,这些仅作为注册的事件类型存在,这意味着当窗口通过 接收其中一个时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 回答