2017-09-20 7 views
0

私は、forループを繰り返して一連のオブジェクトを順番にアニメーション化したいという状況に遭遇したアプリケーションを書いています。Kivyでは、一連のウィジェットをループでアニメーションできますか?

私は、アプリケーションを実行し、ボタンをクリックすると、最初のラベルのテキストを縮小し、1.5秒のポーズを待つ、2番目のラベルを縮小する、待つ、縮小する、待つ、縮小するなどしたい。実行すると、アプリケーションは1.5秒ごとにスリープ状態になりますが、forループがコースを実行してから一度に実行されるまでアニメーションは発生しません。

以下のメインコードから問題コードを削除しても問題は解決しません。誰かが解決策や代替手段を持っていますか?私はそれがマルチスレッドと関係があると思われますが、それは単なる推測です。私はの縮み付けを@mainthreadと飾ってみましたが、違いはありません。あなたが正しい

from kivy.app import App 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.label import Label 
from kivy.animation import Animation 
from kivy.uix.button import Button 
import time 

class Test(GridLayout): 
    def __init__(self, **kwargs): 
     super(Test, self).__init__(**kwargs) 
     self.cols = 2 
     self.thislabel1 = Label(text="One") 
     self.add_widget(self.thislabel1) 
     self.thislabel2 = Label(text="Two") 
     self.add_widget(self.thislabel2) 
     self.thislabel3 = Label(text="Three") 
     self.add_widget(self.thislabel3) 
     self.thislabel4 = Label(text="Four") 
     self.add_widget(self.thislabel4) 
     self.thislabel5 = Label(text='Five') 
     self.add_widget(self.thislabel5) 
     self.button1 = Button(text='Shrink Ray') 
     self.button1.bind(on_release=self.shrinkray) 
     self.add_widget(self.button1) 
     self.these_children = [self.thislabel1,self.thislabel2,self.thislabel3,self.thislabel4,self.thislabel5] 

    def shrinkray(self,*args): 
     anim = Animation(font_size=1) 
     for these_labels in self.these_children: 
      anim.start(these_labels) 
      time.sleep(1.5) 


class MyApp(App): 
    def build(self): 
     return Test() 

if __name__ == '__main__': 
    MyApp().run() 

答えて

0

、あなたは、このためにをマルチスレッドを必要としています。メインスレッドでループしてtime.sleep()を使用すると、メインのKivyループが影響を受けるためです。しかし、たとえば、次のようにループを実行するには、threadを1つだけ追加する必要があります(コメントに従います)。

from kivy.app import App 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.label import Label 
from kivy.animation import Animation 
from kivy.uix.button import Button 
import time 
import threading 

class Test(GridLayout): 
    def __init__(self, **kwargs): 
     super(Test, self).__init__(**kwargs) 
     self.cols = 2 
     self.thislabel1 = Label(text="One") 
     self.add_widget(self.thislabel1) 
     self.thislabel2 = Label(text="Two") 
     self.add_widget(self.thislabel2) 
     self.thislabel3 = Label(text="Three") 
     self.add_widget(self.thislabel3) 
     self.thislabel4 = Label(text="Four") 
     self.add_widget(self.thislabel4) 
     self.thislabel5 = Label(text='Five') 
     self.add_widget(self.thislabel5) 
     self.button1 = Button(text='Shrink Ray') 
     self.button1.bind(on_release=self.shrinkstart) # here the button targets the thread starter function 
     self.add_widget(self.button1) 
     self.these_children = [self.thislabel1,self.thislabel2,self.thislabel3,self.thislabel4,self.thislabel5] 

    def shrinkstart(self, *args): 
     t = threading.Thread(target=self.shrinkray) # initiate the thread 
     t.daemon = True # daemon thread so it terminates when stopping the main thread 
     t.start() 

    def shrinkray(self): 
     anim = Animation(font_size=1) 
     for these_labels in self.these_children: 
      anim.start(these_labels) 
      time.sleep(1.5) 


class MyApp(App): 
    def build(self): 
     return Test() 

if __name__ == '__main__': 
    MyApp().run() 
+0

完璧!迅速な入力に感謝します。私はスレッディングに関する文書を掘り下げ始めますので、これについてよりよく理解することができます –

関連する問題