2013-06-12 2 views
7

यह this other question से बहुत संबंधित है। फर्क सिर्फ इतना है कि मैं with self.canvas के साथ गतिशील रूप दीर्घवृत्त द्वारा जोड़ा जा रहा बजाय बिल्डर (Builder.load_string या Builder.load_file) का उपयोग कर रहा है। तो यहाँ कोड कि काम करता है। जब आप दीर्घवृत्त यह चाल में क्लिक करें और बदलने का रंग:विजेट कीवी गुणों के अनुसार मैं ** ** गतिशील रूप से जोड़ा गया ** एलीपसे (बिल्डर का उपयोग नहीं कर रहा) का रंग कैसे अपडेट करूं?

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

अगर मैं Builder का उपयोग किए बिना भी ऐसा ही करने की कोशिश, इसे अब और काम नहीं करता:

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

कोड रन और घटना वास्तव में कहा जाता है। अधिक से अधिक, विजेट स्थानांतरित हो गया है (भले ही यह स्पष्ट रूप से स्पष्ट न हो) लेकिन कैनवास के निर्देश अपडेट नहीं किए गए हैं।

कोई भी विचार?

+0

मैं भी 'ask_update' के साथ प्रयोग और यह काम नहीं किया। –

+0

मुझे यह पसंद है जब एक प्रश्न के लिए मुझे एक उत्तर की आवश्यकता है लगभग verbatim stackoverflow पर जवाब दिया :) – Nebelhom

उत्तर

8

पहले संस्करण में काम करता है क्योंकि केवी लैंग स्वचालित रूप से भाव में संपत्तियों के लिए कैनवास मनोरंजन के लिए बाध्य है, तो इन पंक्तियों:

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

इस एक से अधिक कार्य करें:

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

आप क्या कर सकते, कैसे, अपने कैनवास निर्देशों को ऑटो पुनर्निर्माण के लिए self.r बांधना है।

__init__

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

में

और ले जाने के redraw नामक एक विधि है, एक self.canvas.clear() कॉल से पहले के साथ करने के लिए

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

भाग।

पूर्ण परिणाम:

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

बहुत बहुत धन्यवाद! मुझे संदेह करना शुरू हो गया था कि बिल्डर सिर्फ किवी भाषा को पार्स करने से कुछ और कर रहा था। –

+1

खैर, तकनीकी रूप से यह पार्सिंग का हिस्सा है, यह सिर्फ इतना है कि केवी भाषा को इन चीजों को सादे पायथन से आसान बनाने के लिए बनाया गया है। बोनस के लिए धन्यवाद :)। – Tshirtman

संबंधित मुद्दे

 संबंधित मुद्दे