Python 子类化窗口时如何在pyglet中安排回调

Python 子类化窗口时如何在pyglet中安排回调,python,pyglet,Python,Pyglet,文档中pyglet.clock.schedule的典型示例如下: def callback(dt): print(f"{dt} seconds since last callback") clock.schedule_interval(callback, .5) 我一直在尝试使用子类窗口来实现这一点。例如: import pyglet from pyglet.gl import * class MyWindow(pyglet.window.Window):

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

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

clock.schedule_interval(callback, .5)
我一直在尝试使用子类窗口来实现这一点。例如:

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()接受2个位置参数,但给出了3个

我还希望能够传递其他参数,如:

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()为参数“val”获取了多个值


我怎样才能解决这个问题?我可能可以通过不子类化窗口来实现,但据我所知,子类化窗口是组织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)
第二个测试修复:

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)
要澄清的是,
获取多个值
错误意味着您提供了一个参数作为位置参数和命名参数

例如:

def myfunc(p):
    print (p)

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

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

正如您所说,我把
schedule
误认为是
schedule\u interval
。将
计划
替换为
计划间隔
后,一切正常。。。