在我在Pyglet上看到的所有网络教程中,似乎没有人使用类来包含pyglet.window.Window实例。例如,大多数教程似乎都像
import pyglet
game_window = pyglet.window.Window()
@game_window.event
def on_draw():
#dostuff
while __name__ == "__main__":
pyglet.app.run()
我无法将此代码重组为一个类。我打算这样做的代码就在这里
__author__ = 'Anish'
导入pyglet 来自pyglet.gl import * 来自董事会进口委员会
class Frontend:
def __init__(self,xs, ys):
self.GameInstance = Board(xs,ys)
self.GameWindow = pyglet.window.Window(width=512, height=512,visible=False)
@GameWindow.event
def on_draw(self):
self.GameWindow.clear()
f = Frontend()
当我运行此代码时,我收到以下错误
Traceback (most recent call last):
File "C:/Users/PycharmProjects/Nothing/2048/Frontend.py", line 7, in <module>
class Frontend:
File "C:/Users/PycharmProjects/Nothing/2048/Frontend.py", line 13, in Frontend
@GameWindow.event
NameError: name 'GameWindow' is not defined
当我更换&#34; @ GameWindow.event&#34;与&#34; @ self.GameWindow.event&#34;试图解决我得到的NameError
Traceback (most recent call last):
File "C:/Users/PycharmProjects/Nothing/2048/Frontend.py", line 7, in <module>
class Frontend:
File "C:/Users/PycharmProjects/Nothing/2048/Frontend.py", line 13, in Frontend
@self.GameWindow.event
NameError: name 'self' is not defined
我期待的。但是,我不确定为什么这段代码不起作用 - 有人可以解释为什么以及如何修复它吗?
答案 0 :(得分:4)
你可以inherit from Window。 这应该有效:
class Frontend(pyglet.window.Window):
def __init__(self, xs, ys):
self.GameInstance = Board(xs,ys)
super().__init__(width=512, height=512,visible=False)
def on_draw(self):
self.clear()
您的代码无效,因为您无法在方法之外引用Frontend类的实例。如果您只有一个Frontend类的实例,则可以执行以下操作:
class Frontend:
window = pyglet.window.Window()
def __init__(self):
...
@window.event
def on_draw():
...
答案 1 :(得分:2)
正如我对ragezor的回答所说,pyglet文档建议继承。
但另一种选择可能是将事件处理逻辑分离到自己的类中,作为EventDispatcher
:
http://pyglet.org/doc-current/programming_guide/events.html#creating-your-own-event-dispatcher
就个人而言,如果我知道只有一个Frontend
个实例,我会质疑上课的必要性。但那是一整套蠕虫。我认为我给你另一个不错的选择,至少,你可以从Window
继承错误,特别是如果你所有的事件都是Window
相关的。
第三个想法(第四个我猜是因为ragezor给了你两个选择):
class Frontend:
def __init__(self,xs, ys):
self.GameInstance = Board(xs,ys)
self.GameWindow = pyglet.window.Window(width=512, height=512,visible=False)
self.on_draw = self.GameWindow.event(self.on_draw)
def on_draw(self):
self.GameWindow.clear()
换句话说,手动应用@GameWindow.event
装饰器。
最后一件事,不要使用camelcase作为属性,它违背了PEP8约定,并且在编辑此代码时让我困惑了一秒钟。改为称呼game_window
。
答案 2 :(得分:-1)
我的猜测是你需要做的
@self.Gamewindow.event