2016-07-01 20 views
0

私は、別の関数on_completeを呼び出すようにアニメーションを設定し、再定義された変数でそれ自身を繰り返します。変数が変更されないので、最初に作成されたウィジェットで繰り返しアニメーションが適用されます。ここに例があります:kivyアニメーションで変数を変更できないのはなぜですか?

from kivy.config import Config 
Config.set('input', 'mouse', 'mouse,multitouch_on_demand') 
from kivy.app import App 
from kivy.uix.widget import Widget 
from kivy.core.window import Window 
from kivy.uix.image import Image 
from kivy.animation import Animation 
from kivy.graphics import Color, Rectangle 
from kivy.uix.button import Button 

global Draw_Card 
Draw_Card=0 
global SpadeCount 
SpadeCount=0 

##Window.fullscreen = True 
##Window.size = (1920, 1080) 

Player1Deck=['Spade', 'Spade', 'Spade'] 

class Spade1(Widget): 
    def __init__(self, **kwargs): 
     super(Spade1, self).__init__(**kwargs) 
     global CardSetup 
     CardSetup=True 
     self.b=Button(text='Hello World!') 
     self.add_widget(self.b) 

     self.bind(pos=self.redraw, size=self.redraw) 
     self.size=(186.5/2, 259.25/2) 
     self.pos=(200, 50) 

    def Set_Originals(self, x): 

     self.Original_pos=x.pos 
     self.Original_size=x.size 

    def redraw(self, *args): 

     self.b.pos=self.pos 
     self.b.size=self.size 

class Spade2(Widget): 
    def __init__(self, **kwargs): 
     super(Spade2, self).__init__(**kwargs) 
     global CardSetup 
     CardSetup=True 
     self.b=Button(text='Hello World!') 
     self.add_widget(self.b) 

     self.bind(pos=self.redraw, size=self.redraw) 
     self.size=(186.5/2, 259.25/2) 
     self.pos=(200, 50) 

    def Set_Originals(self, x): 

     self.Original_pos=x.pos 
     self.Original_size=x.size 

    def redraw(self, *args): 

     self.b.pos=self.pos 
     self.b.size=self.size 

class Spade3(Widget): 
    def __init__(self, **kwargs): 
     super(Spade3, self).__init__(**kwargs) 
     global CardSetup 
     CardSetup=True 
     self.b=Button(text='Hello World!') 
     self.add_widget(self.b) 

     self.bind(pos=self.redraw, size=self.redraw) 
     self.size=(186.5/2, 259.25/2) 
     self.pos=(200, 50) 

    def Set_Originals(self, x): 

     self.Original_pos=x.pos 
     self.Original_size=x.size 

    def redraw(self, *args): 

     self.b.pos=self.pos 
     self.b.size=self.size 

class DrawCard(Widget): 

    def __init__(self, **kwargs): 
     super(DrawCard, self).__init__(**kwargs) 

     self.anim_queue = [] 
     self.Draw_Card() 

    def Draw_Card(self): 
     global Draw_Card 
     global CardSetup 
     global SpadeCount 
     if Draw_Card > 0: 

      NextCard=Player1Deck.pop(0) 

      if NextCard == 'Spade': 
       if SpadeCount==0: 
        self.add_widget(Spade1()) 
       elif SpadeCount==1: 
        self.add_widget(Spade2()) 
       elif SpadeCount==2: 
        self.add_widget(Spade3()) 
       SpadeCount += 1 


      PlayerHandCardsList=self.children[:] 
      print(PlayerHandCardsList) 
      x=len(PlayerHandCardsList)-1 
      print(x) 
      print(PlayerHandCardsList[x]) 

      anim = Animation(pos=((493.75) + ((x * 25)), 0), 
          t='in_out_quad', duration=1) 
      anim &= Animation(size=(186.5, 259.25), 
           t='in_out_quad', duration=1) 

      self.anim_queue.append((PlayerHandCardsList[x], anim)) 

      w, a = self.anim_queue.pop(0) 
      a.bind(on_complete=lambda pos, size: self.WrapUpAnimation(PlayerHandCardsList, x)) 
      a.start(w) 

     else: 
      CardSetup=False 

    def WrapUpAnimation(self, instance, x): 
     global Draw_Card 
     instance[x].Set_Originals(instance[x]) 
     Draw_Card += -1 
     self.Draw_Card() 

class Game(Widget): 

    def __init__(self): 
     super(Game, self).__init__() 
     global Draw_Card 
     Draw_Card += 3 
     self.add_widget(DrawCard()) 

class GameApp(App): 

    def build(self): 
     top = Widget() 
     top.add_widget(Game()) 
     return top 

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

コンソールがPlayerHandCardsListを印刷すると、それまでに追加されたすべてのウィジェットが正しく表示されます。それがxを印刷するとき、これも正しい。ただし、PlayerHandCardsList [x]が印刷されると、割り当てられた最初の値が表示され、Draw_Card関数が繰り返されると更新されません。しかし、位置x * 25を正しく再定義するのはなぜですか?助けてください

答えて

0

私はそれを考え出しました! .appendingの代わりにself.childrenリストを毎回再定義していたので、最新の項目は常にインデックス0になりました!したがって、これを実行するためには、各実行のリストの参照インデックス0を実行するだけです。

関連する問題