子类化时如何在 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
只接受一个参数。
文档中 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
只接受一个参数。