Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Pyglet中对时钟进行子类化?_Python_Pyglet - Fatal编程技术网

Python 如何在Pyglet中对时钟进行子类化?

Python 如何在Pyglet中对时钟进行子类化?,python,pyglet,Python,Pyglet,我想对pyglet.Clock模块的时钟类进行子类化,但在使用schedule_interval时遇到了一些问题: 下面的代码不打印任何内容,如果没有勾选,对象c看起来就像: #!/usr/bin/env python # -*- coding: utf-8 -*- import pyglet class Clock(pyglet.clock.Clock): def __init__(self): super(Clock, self).__init__() clas

我想对pyglet.Clock模块的时钟类进行子类化,但在使用schedule_interval时遇到了一些问题:

下面的代码不打印任何内容,如果没有勾选,对象c看起来就像:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pyglet

class Clock(pyglet.clock.Clock):
    def __init__(self):
        super(Clock, self).__init__()

class Test(object):
    def update(self, dt):
        print dt

w = pyglet.window.Window()
@w.event
def on_draw():
    w.clear()

t = Test()

c = pyglet.clock.Clock()
c.schedule_interval(t.update, 1/60.0)

pyglet.app.run()
但下一个很好

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pyglet

class Clock(pyglet.clock.Clock):
    def __init__(self):
        super(Clock, self).__init__()

        pyglet.clock.set_default(self)

class Test(object):
    def update(self, dt):
        print dt

w = pyglet.window.Window()
@w.event
def on_draw():
    w.clear()

t = Test()

c = Clock()
c.schedule_interval(t.update, 1/60.0)

pyglet.app.run()
唯一的区别是clock的构造函数方法中的pyglet.clock.set_default(self)语句

我认为这并不清楚,或者至少不是将pyglet.clock.clock子类化以拥有自己的派生时钟类的最佳方式

问题:

有没有办法用Pyglet自动设置默认时钟

有一种解决方案更优雅或更具Python风格


不使用pyglet.clock.set_default(self)行是否可以执行此操作?

我没有使用pyglet,但我猜:

你快到了。您的第一个实现可能不起作用的原因是以下几行:

c = pyglet.clock.Clock()
c.schedule_interval(t.update, 1/60.0)
在这里,您正在创建一个新的时钟实例,并计划对其进行回调。然而,在任何情况下,您都不会将时钟实例与pyglet关联起来。所以,当你跑步的时候

pyglet.app.run()
…你从来没有告诉过pyglet新的时钟实例
c
。相反,pyglet将使用它自己创建的实例。看看这个…:

当pyglet启动时,它创建自己的时钟实例(称为
\u default
)。如果您想使用自己的,您需要使用
set\u default()
来替换它。因此,要修复第一段代码,您可能需要执行以下操作之一:

c = pyglet.clock.get_default()
c.schedule_interval(t.update, 1/60.0)
c = MyClock()
c2 = UnpausedClock()
pyglet.clock.set_default(c)
……或者

c = pyglet.clock.Clock()
pyglet.clock.set_default(c)
c.schedule_interval(t.update, 1/60.0)
上面的第二个例子毫无意义:pyglet已经给了您一个时钟实例,所以您只需要复制pyglet已经为您做过的事情。无论如何,您最终都会在pyglet使用的时钟上安排回调

因此,现在应该可以理解,是的,您确实需要调用
set\u default()
。这就是告诉pyglet使用对象而不是默认对象的方式。现在,您可以将这个
set\u default()
调用放在您当前拥有它的地方(在构造函数中)。然而,这样做可能更有意义

class Clock(pyglet.clock.Clock):
    def __init__(self):
        super(Clock, self).__init__()

...

c = Clock()
pyglet.clock.set_default(c)
编辑

在回答为什么要在构造函数之外执行此操作的问题时:

首先,根据一般经验,构造函数只应用于构造对象。通过添加set_default,您不仅构建了对象,还改变了其他实体(pyglet.clock模块)的状态。这可能会引起混乱,我将在下面说明。假设我写的代码是这样的

c = MyClock()
c2 = UnpausedClock()
在本例中,我之前实现了两种不同的时钟类型:
NewClock
unpusedclock
<代码> unPauldCaldie将只考虑游戏暂停时的传递时间。如果我将
set_default()
放在这两个新类的构造函数中,那么
UnpausedClock
将成为新的默认时钟(我不想要)。通过不在构造函数中放入
set\u default()
,而是执行以下操作:

c = pyglet.clock.get_default()
c.schedule_interval(t.update, 1/60.0)
c = MyClock()
c2 = UnpausedClock()
pyglet.clock.set_default(c)
我的代码更明确,也不那么混乱


当然,代码会以任何一种方式工作,但我觉得在构造函数之外设置默认值可以让您更灵活地在以后需要时使用该类。

无论何时您说“工作”或“不工作”,请确保更具体。有些“不起作用”可能意味着它出错了,没有出错,但也没有达到您期望的效果,等等。在代码的第一部分中,什么东西不起作用?@MarkHildreth谢谢您的建议!我的意思是,在第一段代码中,update不打印任何内容,c看起来就像没有勾选一样,但我不知道为什么…我希望子类Clock为Pyglet Clock类提供一些额外的功能。因此,在我选择的代码中,调用构造函数中的set_default。在这种情况下,您认为在构造函数内部还是外部调用set_default更好?谢谢您的解释。我在问题中编写的代码只是一个示例(不是生产代码)。也许我必须给你更多关于我项目代码的信息,这样你才能理解我的观点。我认为构造函数是最好的解决方案,因为我的时钟对象是一个单例,构造函数方法使时钟处于有效状态(如果构造函数中没有这一行,时钟就不会滴答响!)。@SuperUser:我在这个答案中的目标是向您提供有效代码和无效代码之间的区别。希望你现在有了一些有效的方法,并且你知道为什么。如果它与我在回答中建议的不同,那就好了。如果你有一些有用的东西,并且想让其他人对这是否是一个好的方法发表意见,我建议你在上发布。谢谢你的帮助!在我之前的评论中,我只是想说明我为什么用这种方式解决了这个问题。