Python Kivy时钟计划外和重新安排问题

Python Kivy时钟计划外和重新安排问题,python,kivy,Python,Kivy,我有一个程序,经常不定时地重新安排时钟。然后我发现有时时钟对象堆栈没有被计划 下面是一个发生了什么的例子 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:

我有一个程序,经常不定时地重新安排时钟。然后我发现有时时钟对象堆栈没有被计划

下面是一个发生了什么的例子

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_变量中休眠的问题

在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程序时出现。

如果您一次只希望存在一个时钟事件,则只需在创建新的时钟事件之前取消上一个时钟事件:

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)

如果一次只希望存在一个ClockEvent,则只需在创建新的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)

每次使用
variable=
时,
variable
的上一个值都会被重写。不能在一个简单变量中存储多个值。考虑使用<代码>列表>代码>代替一个简单的变量。@ JohnAnderson,但是列表将以指数形式增长。如果我打算把它们全部取消,有时清空列表,那么我不知道这是否比每次取消一个时钟好。我不明白你想做什么。我唯一的观点是,在Kivy中,当分配一个时钟变量时,我可以在一个变量中分配两个或多个时钟对象,如下所示是不正确的。如果要存储多个
ClockEvent
,则需要使用除简单变量以外的其他变量,例如可以用作堆栈的
List
。@JohnAnderson我的意思是,我可以为一个变量分配多个时钟,但我只能引用最后分配的一个。我的问题是,我试图取消并重新运行时钟,但有时在取消发生之前会分配另一个时钟(我想当cpu变高时)。当这种情况发生时,一个时钟对象,我不能引用它来取消,它存在于某个地方,并且无限运行。我正在寻找一种方法来取消它们或防止这种情况发生。每次使用
variable=
,前面的
variable
值都被重写了。不能在一个简单变量中存储多个值。考虑使用<代码>列表>代码>代替一个简单的变量。@ JohnAnderson,但是列表将以指数形式增长。如果我打算把它们全部取消,有时清空列表,那么我不知道这是否比每次取消一个时钟好。我不明白你想做什么。我唯一的观点是,在Kivy中,当分配一个时钟变量时,我可以在一个变量中分配两个或多个时钟对象,如下所示是不正确的。如果要存储多个
ClockEvent
,则需要使用除简单变量以外的其他变量,例如可以用作堆栈的
List
。@JohnAnderson我的意思是,我可以为一个变量分配多个时钟,但我只能引用最后分配的一个。我的问题是,我试图取消并重新运行时钟,但有时在取消发生之前会分配另一个时钟(我想当cpu变高时)。当这种情况发生时,一个时钟对象,我不能引用它来取消,它存在于某个地方,并且无限运行。我正在寻找一种方法来取消它们或防止这种情况发生。