【问题标题】:Kivy Clock unscheduling and rescheduling issueKivy Clock 未安排和重新安排的问题
【发布时间】:2019-02-01 23:08:23
【问题描述】:

我有一个经常取消和重新安排时钟的程序。然后我发现有时时钟对象堆栈没有被计划外。

下面是一个例子。

def functionA(self):
    if self.clock_variable is None:
        self.clock_variable = Clock.schedule_interval(self._function, 1)

...

def functionB(self):
    if self.clock_variable is not None:
        self.clock_variable.cancel()
        self.clock_variable = None

这类任务虽然看起来不应该,但很少会导致时钟对象没有被删除并在 self.clock_variable 中休眠的问题。

在 Kivy 中,当分配一个时钟变量时,我可以在一个变量中分配 2 个或多个时钟对象,如下所示。

variable = Clock.schedule_interval(func, 1) # First Clock
variable = Clock.schedule_interval(func, 2) # Second Clock

这不会取消第一个时钟对象,两个时钟对象都保留。但是,当我尝试取消安排它们时。我只能取消我最后安排的那个。

例如,下面的代码只会取消第二时钟的调度。而且我无法取消计划或删除第一个时钟

variable.cancel()
variable.cancel() # Even if I cancel() twice, it works only once.

这是一个大问题,因为当时钟对象堆叠在变量中时,我的系统的 CPU 会从 20% 变为 90%,而我无法删除它们。

在结论中,我正在寻找一种方法来限制时钟对象只能一个一个地分配给一个变量。这个问题是我在Linux嵌入式系统(单核低性能板)上加载kivy程序时才出现的。

【问题讨论】:

  • 每次使用variable = ,之前的variable值都会被覆盖。您不能将多个值存储在一个简单的变量中。考虑使用List 而不是简单的变量。
  • @JohnAnderson 但随后该列表将呈指数增长。如果我有时要取消它们并清空列表,那么我不知道这是否比每次都取消时钟更好。
  • 我不明白你在做什么。我唯一的观点是您的陈述In Kivy, when assigning a clock variable, I can assign 2 or more clock objects in one variable like below 是不正确的。如果要存储多个ClockEvent,则需要使用简单变量以外的其他变量,例如可以用作堆栈的List
  • @JohnAnderson 我的意思是我可以将多个时钟分配给一个变量,但我只能引用最后分配的那个。我的问题是我试图取消并重新运行时钟,但有时在取消发生之前分配了另一个时钟(我认为当 cpu 变高时)。发生这种情况时,我无法引用取消的时钟对象存在于某处并无限运行。我正在寻找一种方法来取消它们或防止这种情况发生。

标签: python kivy


【解决方案1】:

如果您只想同时存在一个 ClockEvent,那么只需在创建新的之前取消前一个:

def functionA(self):
    if self.clock_variable is None:
        self.clock_variable = Clock.schedule_interval(self._function, 1)
    else:
        self.clock_variable.cancel()
        self.clock_variable = Clock.schedule_interval(self._function, 1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 2016-03-04
    相关资源
    最近更新 更多