Python + Kivy:时钟不适用于部分(关键字)


def _procedural_reloading(self,gen=[],*args):
    if len(gen):
        gen.pop().reload()
        Clock.schedule_interval(functools.partial(
            self._procedural_reloading,gen=gen),.5)

在上面的代码中,_proceural_reloading()是一个类的方法,它获得一个包含一些图像的列表,并尝试逐个重新加载()它们。猜猜看,它不起作用,因为它说_proceural_reloading有多个关键字gen的值!

奇怪的是,如果我传递gen作为参数(不是作为关键字参数),它工作得很好,在这里:
def _procedural_reloading(self,gen=[],*args):
    if len(gen):
        gen.pop().reload()
        Clock.schedule_interval(functools.partial(
            self._procedural_reloading,gen),.5)

为什么gen=gen不工作?

更详细地说,直到现在我都不能用Clock传递任何关键字参数,甚至一次!我总是要一个接一个地按顺序排列参数,然后传递它们……这是已知的问题吗?还是我做错了什么?我觉得自己很蠢!

编辑:

gen没有默认值也在我的情况下工作:

def _procedural_reloading(self,gen,*args):
    if len(gen):
        gen.pop().reload()
        Clock.schedule_interval(functools.partial(
            self._procedural_reloading,gen=gen),.5)

创建

functools.partial(self._procedural_reloading,gen=gen)

partialgen=gen保存为kwargskwargs可能看起来像{'gen': gen},与位置参数无关,还没有给出。当这个partial函数被调用时,您可以通过函数定义看到:

def _procedural_reloading(self,gen=[],*args):

gen是第一个位置参数,所以现在partial函数的调用者带着一定数量的参数调用它,其中第一个参数被设置为gen !因为它是第一个位置参数,所以要设置两次!(这是不允许的)。像这样定义位置参数(前面有一个默认参数)是很奇怪和有问题的(可以看到),解决方案是:

def _procedural_reloading(self,*args, **kwargs):

现在你处理args不同于kwargs,你可以得到genkwargs.get(gen, default)

我试图把@jamylak方法的工作,同时这里我自己的解决方案,这个问题:

正如我所预料的那样,问题是由于Kivy的时钟,它似乎首先将它的参数传递给函数!明白了吗?没有?

当时钟调用一个函数时,它传递一个名为dt的参数给它。

所以如果你有一个函数并且想要用Clock来调用它它应该至少有一个参数:

def clock_callback_function(dt):
    ...

在我的例子中,我总是给我的函数*args,所以Kivy可以用它们做任何它想做的事情!但似乎时钟总是覆盖回调函数的第一个参数。为了更好地包装它,我应该这样写代码:

def _procedural_reloading(self,dt=0,gen=[]):
        if len(gen):
            gen.pop().reload()
            Clock.schedule_interval(functools.partial(
                self._procedural_reloading,gen=gen),.5)

上面的代码没有异常,但下面的代码不工作,我们已经知道:

def _procedural_reloading(self,gen=[],dt=0):
        if len(gen):
            gen.pop().reload()
            Clock.schedule_interval(functools.partial(
                self._procedural_reloading,gen=gen),.5)

相关内容

  • 没有找到相关文章

最新更新