如何解决子类化窗口时如何在pyglet中安排回调
文档中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()
我一直在尝试使用子类化的窗口来完成这项工作。例如:
def __init__(self,**kwargs):
super().__init__(*args,**kwargs)
pyglet.clock.schedule(self.test,0.5,val=100)
def test(self,dt,val):
print(val)
我收到以下错误消息:
TypeError:test()接受2个位置参数,但给出了3个
我还希望能够传递其他参数,例如:
double x; scanf("%.f",x);
但这会导致错误消息
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,**kwargs):
super().__init__(*args,**kwargs)
pyglet.clock.schedule(self.test,0.5,val=100) # sends dt,val=100
def test(self,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
仅接受一个参数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。