繁体   English   中英

如何在类中使用pyglet

[英]How to use pyglet within a class

在我在Pyglet上看到的所有Web上的教程中,看起来他们中的任何一个都没有使用类来包含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'

从Board导入板导入来自pyglet.gl import *的pyglet

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

当我用“@ self.GameWindow.event”替换“@ GameWindow.event”以尝试解决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

我所期待的。 但是,我不确定为什么这段代码不起作用 - 有人可以解释为什么以及如何修复它?

您可以从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():
        ...

正如我对ragezor的回答所评论的那样,pyglet文档建议继承。

但另一种选择可能是将事件处理逻辑分离到自己的类中,作为EventDispatcherhttp//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

我的猜测是你需要做的

@self.Gamewindow.event

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM