【问题标题】:Where does this argument come from?这个论点从何而来?
【发布时间】:2015-05-05 09:12:26
【问题描述】:

编辑:显然我不是很清楚。我真的不知道发生了什么,所以我不知道具体要问什么。我的问题是小睡如何得到它的论点,而我没有指定一个。 Inclement 明白我的意思,所以我想现在已经回答了。

这可能很愚蠢,但我真的不明白更新的“小睡”参数(在“更新”中)来自哪里。编辑:(我的意思是它从哪里接收它的价值)。

“更新”仅从(编辑:通过)“on_start”调用,没有其他地方。

class ClockApp(App):
    sw_started = False
    sw_seconds = 0

    def on_start(self):
        Clock.schedule_interval(self.update, 0)

    def update(self, nap):
        if self.sw_started:
            self.sw_seconds += nap

        self.root.ids.time.text = strftime('[b]%H[/b]:%M:%S')

        m, s = divmod(self.sw_seconds, 60)
        self.root.ids.stopwatch.text = (u'{0:02d}:{1:02d}.[size=40]{2:02d}[/size]'
                                        .format(int(m), int(s), int(s * 100 % 100)))

    def start_stop(self):
        self.root.ids.start_stop.text = 'Start' if self.sw_started else 'Stop'
        self.sw_started = not self.sw_started

    def reset(self):
        if self.sw_started:
            self.root.ids.start_stop.text = 'Start'
            self.sw_started = False

        self.sw_seconds = 0

【问题讨论】:

  • updateon_start 中未被“调用”。它只是传递给函数。它在schedule_interval 中调用或传递给另一个函数并在那里调用。这是 nap 传入的地方。
  • 什么意思,你不明白nap 是从哪里来的?我不明白你的问题。您确实将 self.update, 作为参数传递给函数,但实际上并没有调用它
  • 如前所述,self.update 作为参数传递给schedule_interval。您需要检查schedule_interval 方法以了解如何从那里调用self.update 方法。
  • 我不认为这个问题不清楚 - 原始发布者不明白为什么更新方法会收到一个参数,因为他没有手动指定一个参数,答案是(就像已经说过)它由时钟在内部调用,此时它会自动包含此参数。
  • @AustinMullins Clock.schedule_once 的代码和文档可在线获取(github.com/kivy/kivykivy.org/docs)。这个问题没有什么不清楚的,我们只是让对 Kivy 一无所知的人来决定这个问题是否不清楚。

标签: python kivy


【解决方案1】:

update 不是直接调用的,而是通过Clock.schedule_interval(self.update, 0) 与时钟一起调度的。这会自动将参数传递给与上次调用以来的时间相对应的函数,在本例中称为nap

由于调用之间的时间设置为0,因此每帧都会调用该函数,nap 最终应该约为 1/60。

为了比较,如果你把它改成Clock.schedule_interval(self.update, 1),你会发现nap总是大约为1……但不完全是1,这是由于小的(或者如果主线程被阻塞,则很大)波动当框架被推送时。

【讨论】:

  • 就是这样!我从未见过一个函数从它所放入的对象中接收参数(不知道我说得对不对)。如果您不介意回答,请进一步提问:这是如何工作的?我从未见过这种“流动”。当它是另一个函数或类本身的参数时,它如何接收参数?
  • 现在我想一想:“0”是初始参数,但在实际更新部分本身实际执行之前,它会被时钟更改为新的东西(根据时钟的延迟)?
  • 没有初始参数。重要的是函数本身就是一个可以传递的对象——它在你的代码行中被调用,但是函数本身作为参数传递。这是完全通用的,例如您可以使用import math; a = [math.sin, math.cos]; a[1](5) 来计算 cos(5)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
相关资源
最近更新 更多