有没有办法计算运行时存在多少个 Kivy Clock.schedule 对象?

Is there a way to count how many Kivy Clock.schedule objects there are present at runtime?

我是 Kivy 的新手。我正在尝试创建具有两个屏幕的 android 应用程序,这两个屏幕都显示动态创建的列表 Buttons。一般来说,我添加或删除 Button 或编辑其内容,并希望看到其中发生的更改。这是一个简化的示例,其中 Button 从一列更改到另一列:

from kivy.app import App
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button

KV = '''
BoxLayout:
    MyListA:
    MyListB:
'''

class Content:
    def __init__(self):
        self.contentA =[]
        self.contentB = []
        for i in range(10):
            self.contentA.append(f"X{i}")
        self.change_made = 0

    def switch_to_content_A(self, content_id):
        content = self.contentB.pop(content_id)
        self.contentA.append(content)
        self.change_made = 2

    def switch_to_content_B(self, content_id):
        content = self.contentA.pop(content_id)
        self.contentB.append(content)
        self.change_made = 2

class MyListA(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.orientation = "vertical"
        content_listA = []
        for i in c.contentA:
            content_listA.append(Button(text=str(i), on_release=lambda x, id=len(content_listA): self.switsch_to_B(id)))
            self.add_widget(content_listA[-1])

        Clock.schedule_interval(self.update, 0.5)

    def update(self, *args):
        if c.change_made > 0:
            self.clear_widgets()
            self.__init__()

    def switsch_to_B(self, content_id):
        c.switch_to_content_B(content_id)
        self.update()
        c.change_made -= 1

class MyListB(BoxLayout):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.orientation = "vertical"
        content_listB = []
        for i in c.contentB:
            content_listB.append(Button(text=str(i), on_release=lambda x, id=len(content_listB): self.switsch_to_A(id)))
            self.add_widget(content_listB[-1])

        Clock.schedule_interval(self.update, 0.5)

    def update(self, *args):
        if c.change_made > 0:
            self.clear_widgets()
            self.__init__()

    def switsch_to_A(self, content_id):
        c.switch_to_content_A(content_id)
        self.update()
        c.change_made -= 1

class MyApp(App):
    def build(self):
        return Builder.load_string(KV)

if __name__ == "__main__":
    c = Content()
    MyApp().run()

我理解脚本Clock.schedule_interval(self.update, 0.5)的方式是更新其他专栏所必需的。但是我怀疑创建了多个 schedule_interval(但从未终止),因为我的程序开始显着变慢,然后在一段时间后冻结。我正在寻找是否可以检测并杀死较旧的 schedule_intervals。如果这不是冻结的原因,我想知道是什么。

尝试将 MyListA 更改为:

class MyListA(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.orientation = "vertical"

        Clock.schedule_interval(self.update, 0.5)

    def update(self, *args):
        if c.change_made > 0:
            self.clear_widgets()
            content_listA = []
            for i in c.contentA:
                content_listA.append(Button(text=str(i), on_release=lambda x, id=len(content_listA): self.switsch_to_B(id)))
                self.add_widget(content_listA[-1])

    def switsch_to_B(self, content_id):
        c.switch_to_content_B(content_id)
        self.update()
        c.change_made -= 1

MyListB 类似。此外 Content.change_made 必须为 1 或 2 才能进行第一次更新。如果您需要在 0.5 秒之前进行第一次更新,您可以在 __init__()

中添加一个对 self.update() 的调用