2016-06-14 21 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と等しい場合にスレッドを開始します...クロックでループ 'x'秒間呼び出すことはできません...あなたは何を提案してください? – BlueDog

+0

私はこれが時計を介して関数を定期的に呼び出すのをなぜ妨げるのかわかりませんが、本当にこのようにしたい場合は関数をスレッドに入れてください。 – inclement

答えて

1

私はそれが必要ではない場合、あなたは離れて全体whileスタイリングをスローすることをお勧め - 特にだけの値をチェックしているmain_loopで1、ということ。たとえば、実際にその機能を必要としない場合は、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場合には、毎秒60timesそして、その各フレームに関数を呼び出します。単純な値のチェックのためにかなり正確です。

+0

私は毎回 'i'の値を 'x'秒ごとに監視したいので、 'main_loop'関数で 'while'を使用します。私はどうしたらいいのですか?私はスレッドを開始したいので、私は 'i'の値を監視したいと思っている間に他のことをするために同時に機能することができます。だから、それを解決するあなたの提案は何ですか? – BlueDog

+0

次の項目.. 'decrement counter' ... 'i'の値が特定の範囲にある場合2&5カウントダウンタイマーを実行したいので、2から5にどれくらいかかりますか?スレッドなしでタイマーなしで別の方法で行うことができます。特に、2〜5の時間が毎回異なる場合があります。 – BlueDog

関連する問題