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

在上面的代码中,_procedural_reloading() 是一个类的方法,它获取一个包含一些图像的列表,并尝试一个一个地重新加载()它们。你猜怎么着,它不起作用,因为它说 _procedural_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)
4

2 回答 2

2

当你创建

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

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

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

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

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

现在你的处理方式args不同kwargs,你可以genkwargs.get(gen, default)

于 2013-04-21T11:19:13.243 回答
0

我正在尝试使用@jamylak 方法,同时在这里我自己解决这个问题:

正如我所料,问题是由于 Kivy 的时钟,它似乎首先将它的参数传递给函数!知道了?不?

当 Clock 调用一个函数时,它会向它传递一个名为 dt 的参数。

因此,如果您有一个函数并想用 Clock 调用它,它应该至少有一个参数:

def clock_callback_function(dt):
    ...

就我而言,我总是给我的函数 *args,所以 Kivy 可以用它们做任何想做的事!但似乎 Clock 总是覆盖回调函数的第一个参数。为了很好地包装它,我应该这样写我的代码:

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)
于 2013-04-21T11:29:32.730 回答