2016-06-14 63 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