Wie aktualisiere ich die Farbe einer dynamisch hinzugefügten Ellipse (ohne Builder) gemäß den Widget Kivy-Eigenschaften?
Das ist sehr verwandt mitdiese andere Frage. Der einzige Unterschied ist, dass ich die Ellipse dynamisch mit hinzufügewith self.canvas
anstatt den Builder zu verwenden (Builder.load_string
oderBuilder.load_file
). Also hier ist der Codedas funktioniert. Wenn Sie in die Ellipse klicken, bewegt sie sich und ändert die Farbe:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.properties import NumericProperty
from kivy.graphics import Color, Ellipse
Builder.load_string("""
<CircleWidget>:
canvas:
Color:
rgba: self.r,1,1,1
Ellipse:
pos: self.pos
size: self.size
""")
class CircleWidget(Widget):
r = NumericProperty(0)
def __init__(s, **kwargs):
s.size= [50,50]
s.pos = [100,50]
super(CircleWidget, s).__init__(**kwargs)
def on_touch_down(s, touch):
if s.collide_point(touch.x,touch.y):
s.pos = [s.pos[1],s.pos[0]] # this works
s.r = 1.0 # this also works
class TestApp(App):
def build(s):
parent = Widget()
parent.add_widget(CircleWidget())
return parent
if __name__ == '__main__':
TestApp().run()
Wenn ich das Gleiche versuche, ohne das zu verwendenBuilder
funktioniert es nicht mehr:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.properties import NumericProperty
from kivy.graphics import Color, Ellipse
class CircleWidget(Widget):
r = NumericProperty(0)
def __init__(s, **kwargs):
s.size= [50,50]
s.pos = [100,50]
super(CircleWidget, s).__init__(**kwargs)
with s.canvas:
Color(s.r,1,1,1)
Ellipse(pos = s.pos, size = s.size)
def on_touch_down(s, touch):
if s.collide_point(touch.x,touch.y):
s.pos = [s.pos[1],s.pos[0]] # This doesn't work anymore
s.r = 1.0 # Neither do this
class TestApp(App):
def build(s):
parent = Widget()
parent.add_widget(CircleWidget())
return parent
if __name__ == '__main__':
TestApp().run()
Der Code wird ausgeführt und das Ereignis wird tatsächlich aufgerufen. Darüber hinaus wird das Widget verschoben (auch wenn es visuell nicht klar ist), aber die Anweisungen der Zeichenfläche werden nicht aktualisiert.
Irgendwelche Ideen?