2013-06-12 17 views
7

Bu, this other question ile çok ilgilidir. Tek fark, Oluşturucu (Builder.load_string veya Builder.load_file) yerine Elips'i with self.canvas ile dinamik olarak ekliyorum. Yani burada işini yapan kodudur. Eğer hareket Elips tıklayın ve değiştirmek Renk: Ben Builder kullanmadan aynı şeyi denersenizWidget Kivy özelliklerine göre dinamik olarak eklenen ** Ellipse (Builder kullanmıyor) rengini nasıl güncellerim?

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() 

, artık çalışmaz:

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() 

kod çalışır ve Olay aslında denir. Daha fazla, Widget (görsel olarak açık olmasa bile) hareket ettirilir, ancak tuvalin Talimatları güncellenmez.

Herhangi bir fikrin var mı? kv lang otomatik ifadelerde özelliklerine tuval rekreasyon bağlamak çünkü

+0

Ben de ask_update' 'deneme ve işe yaramadı. –

+0

Cevap vermem gereken bir soru olduğunda hemen hemen verbatim stackoverflow üzerinde cevap verdi :) – Nebelhom

cevap

8

ilk sürümü çalışır, bu yüzden bu çizgiler:

Color: 
     rgba: self.r,1,1,1 

birden bu bir yapın:

Color(s.r,1,1,1) 

ne yapabildiğini, nasıl olursa olsun, tuval talimatlarınızı otomatik olarak yeniden oluşturmak için self.r öğesini bağlamaktır.

__init__

self.bind(r=self.redraw) 
self.bind(pos=self.redraw) 
self.bind(size=self.redraw) 

içinde

ve önce self.canvas.clear() çağrısı ile redraw adında bir yöntem ile

with s.canvas: 
     Color(s.r,1,1,1) 
     Ellipse(pos = s.pos, size = s.size) 

Part taşıyın.

tam sonucu:

from kivy.app import App 
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): 
     super(CircleWidget, s).__init__(**kwargs) 
     s.bind(r=s.redraw) 
     s.bind(pos=s.redraw) 
     s.bind(size=s.redraw) 
     s.size = [50, 50] 
     s.pos = [100, 50] 

    def redraw(s, *args): 
     s.canvas.clear() 
     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): 
      print "gotcha" 
      s.pos = [s.pos[1], s.pos[0]] 
      s.r = 1.0 

class TestApp(App): 
    def build(s): 
     parent = Widget() 
     parent.add_widget(CircleWidget()) 
     return parent 

if __name__ == '__main__': 
    TestApp().run() 
+0

Çok teşekkür ederim! Builder'ın sadece Kivy dilini ayrıştırmaktan başka bir şey yaptığını düşünmeye başlamıştım. –

+1

Teknik olarak ayrışmanın bir parçası, kv dilinin bu şeyleri sade bir pythondan daha kolay hale getirmek için yapıldığı. Bonus için teşekkürler :). – Tshirtman

İlgili konular