我想继承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()
答案 0 :(得分:0)
on_draw
没有定义on_mouse_press
或pyglet.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