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 verwendenBuilderfunktioniert 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?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage