有没有办法计算运行时存在多少个 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_interval
s。如果这不是冻结的原因,我想知道是什么。
尝试将 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()
的调用
我是 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_interval
s。如果这不是冻结的原因,我想知道是什么。
尝试将 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()
的调用