Jest to bardzo związane z this other question. Jedyna różnica polega na tym, że dynamicznie dodajemy Ellipse przy pomocy with self.canvas
zamiast używać Buildera (Builder.load_string
lub Builder.load_file
). Oto kod , który działa. Po kliknięciu w elipsa porusza się i zmienia kolor:Jak zaktualizować kolor ** dynamicznie dodawanej ** elipsy (bez użycia Buildera) zgodnie z właściwościami Widget Kivy?
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()
Jeśli staram się zrobić to samo bez użycia Builder
, to już nie działa:
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()
tras kod i Zdarzenie jest faktycznie wywoływane. Co więcej, widget jest przenoszony (nawet jeśli nie jest to wizualnie jasne), ale instrukcje obszaru roboczego nie są aktualizowane.
Wszelkie pomysły?
ja też eksperymentować z 'ask_update' i to nie działa. –
Podoba mi się, gdy pytanie, na które potrzebuję odpowiedzi, jest prawie dosłownie odpowiedział na stackoverflow :) – Nebelhom