2016-06-14 98 views
0

'main_loop'函数while循环不会每5秒增加self.i值,'run'函数不会每隔1秒递减self.mycounter值。kivy python时钟表更新

为什么?

我在做什么错?

我不想使用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

直到您的while循环返回时,Kivy中才会发生任何事情,因为它会阻塞该线程。使用时钟表来定期运行你的代码。 – inclement

+0

但我在while循环中有线程...例如我开始线程,如果self.i等于2 ...所以我不能打电话while循环'X'秒与时钟...你有什么建议请? – BlueDog

+0

我不明白为什么这会阻止你通过时钟定期调用函数,但如果你真的想这样做,那么把整个函数放在一个线程中。 – inclement

回答

1

我建议你扔掉整个while造型,如果它不是必需的 - 尤其是之一main_loop,它只是检查值。这不是在kivy好,如果你真的不需要这些功能例如为:

while <some list>: 
    value = <some list>.pop() 
    # do something 

,甚至可以通过以下方法如何做到这一点不同。根据恶意建议,使用Clock是正确的方法。也有点错误细节在那个特定的循环是这样的:

while True: 
    Clock.schedule_interval(self.incrementi, 5.0) 

这将预定的时间间隔无限多的时候,当你运行该功能,或将基本要么冻结您的应用程序(如果在线程中运行)引起的无限循环/冻结+创建一个大的记忆食客=它会禁止你Thread.set()即停止线程并正确退出应用程序,最终会崩溃。

我希望它是错字,因为你只需要把它放在while以上就可以了。另一件事:decrementcounter ...它在while循环,它会再次创建多个时钟,并造成麻烦。同样的事情 - 再次,把它放在循环之上,使其工作。基本上whiletime.sleep(t)Clock.schedule_interval(some_function, t)。很高兴你想检查一些东西,但每个Clock.schedule_*你创建另一个时钟,我没有看到任何阻止它的东西。所以基本上你会创造无限多的时钟。

的东西更类似于while只(不睡觉)是Clock.schedule_interval(some_function)即你留出时间参数,它会调用每个帧的功能,如果60fps,则每秒60次。对于简单的值检查非常精确。

+0

我在'main_loop'函数中使用'while',因为我想每隔'x'秒不断监视'i'值。没有'while'我怎样才能做到这一点?我想开始线程,所以我可以运行同时功能来做其他事情,而我希望监测'我'的价值。那么,你有什么建议来解决它? – BlueDog

+0

下一项..'递减计数器'...如果'i'值在特定范围之间,例如2&5我想运行倒数计时器,所以我知道需要多长时间才能从2到5 ...没有线程的情况下,我怎样才能以不同的方式做到这一点? – BlueDog