kivy python时钟表更新

时间:2016-06-14 22:19:48

标签: python kivy clock

'中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

1 个答案:

答案 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次第二。非常精确的简单值检查。