子类化时如何在 pyglet 中安排回调 window

How to schedule callbacks in pyglet when subclassing window

文档中 pyglet.clock.schedule 的典型示例如下:

def callback(dt):
    print(f"{dt} seconds since last callback")

clock.schedule_interval(callback, .5)

我一直在尝试使用子类 window 来完成这项工作。例如:

import pyglet
from pyglet.gl import *


class MyWindow(pyglet.window.Window):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        pyglet.clock.schedule(self.test, 0.5)

    def test(self, dt):
        print("test")


if __name__ == "__main__":
    window = MyWindow(visible=False, resizable=True)
    pyglet.app.run()

我收到以下错误消息:

TypeError: test() takes 2 positional arguments but 3 were given

我还希望能够传递额外的参数,例如:

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    pyglet.clock.schedule(self.test, 0.5, val=100)

def test(self, dt, val):
    print(val)

但这会导致错误消息

TypeError: test() got multiple values for argument 'val'

我该如何解决这个问题?我可能可以通过不子类化 window 来做到这一点,但据我了解,子类化 window 是组织 pyglet 应用程序的常用方法。

回调的第一个参数始终是自上次调用以来的时间。您还可以传递其他参数。

第一次测试修复:

class MyWindow(pyglet.window.Window):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        pyglet.clock.schedule(self.test, 0.5)  # sends dt and 0.5 as args

    def test(self, dt, val):  # val = 0.5
        print("test")

第二次测试修复:

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    pyglet.clock.schedule(self.test, 0.5, val=100) # sends dt, 0.5, val=100

def test(self, dt, val0, val): # val0 = 0.5
    print(val)

澄清一下,got multiple values 错误意味着您提供了一个参数作为位置参数和命名参数。

示例:

def myfunc(p):
    print (p)

myfunc(1, p = 5) # error, sending 'p' parameter twice

另请注意,您提到的文档是针对 pyglet.clock.schedule_interval 的,它采用第二个参数作为时间延迟。在您的代码中,您使用的 pyglet.clock.schedule 只接受一个参数。