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を正しく再定義するのはなぜですか?助けてください