'中main_loop'函数while循环不会每5秒增加一次self.i值并且'运行'函数不会每1秒减少self.mycounter值。
为什么?
我做错了什么?
我不想使用time.sleep。
class MyThread(BoxLayout):
stop = []
timer = []
times = []
i = NumericProperty(0)
mycounter = NumericProperty(0)
def incrementi(self, *args):
self.i += 1
def decrementcounter(self,*args):
self.mycounter -= 1
def run(self):
self.mycounter = 30
while not self.stop:
self.timer.append(self.mycounter)
Clock.schedule_interval(self.decrementcounter, 1.0)
self.times.append(self.mycounter)
return self.mycounter
def main_loop(self):
self.i = 0
while True:
Clock.schedule_interval(self.incrementi, 5.0)
if self.i == 2:
self.mycounter = 30
threading.Thread(target = self.run).start()
if self.i == 5:
self.stop.append('dummystring')
if self.i == 6:
self.stop.pop(0)
self.timer = []
self.ids.lbl.text = "{}".format(self.i)
if self.i == 7:
self.i = 0
def read_it(self):
threading.Thread(target = self.main_loop).start()
class MyApp(App):
def build(self):
self.load_kv('thread.kv')
return MyThread()
if __name__ == "__main__":
app = MyApp()
app.run()
kivy.pv
<MyThread>:
Button:
text: "start program"
on_release: root.read_it()
Label:
id: lbl
text: "current step"
font_size: 50
答案 0 :(得分:1)
如果没有必要,我建议你扔掉整个while
样式 - 尤其是 main_loop
中的那个,这只是检查值。如果你真的不需要那种功能,那就不好了。例如:
while <some list>:
value = <some list>.pop()
# do something
甚至这里有不同的方法。正如恶意所暗示的那样,使用Clock
是正确的方法。此特定循环中还有一些错误的细节:
while True:
Clock.schedule_interval(self.incrementi, 5.0)
这将无限次地安排间隔,这基本上会在你运行这个函数时冻结你的应用程序,或者(如果在Thread中运行)导致无限循环/冻结+创建一个大的内存吃者=它将禁止你{{ 1}}即停止线程并正确退出应用程序,最终会崩溃。
我希望这是错误的,因为你只需要把它放在Thread.set()
循环之上。另一件事:while
...它在decrementcounter
循环中,它会再次创建多个时钟并导致麻烦。同样的事情 - 再次,将它置于循环之上以使其工作。
基本while
while
time.sleep(t)
为Clock.schedule_interval(some_function, t)
。你想要检查一些东西很好,但每个Clock.schedule_*
你创建另一个时钟,我没有看到任何阻止它的东西。所以基本上你会创造无数的时钟。
仅与while
更相似(没有睡眠)的是Clock.schedule_interval(some_function)
,即你省略了时间参数,并且它将在每个帧上调用函数,如果60fps
,那么每次60次第二。非常精确的简单值检查。