2013-07-16 13 views
6

मैं स्क्रीन पर दिखने वाली कुछ तस्वीरों को घुमाने की कोशिश कर रहा हूं, ये तस्वीर एक स्टैकलेआउट के अंदर हैं, और मुझे उन्हें परिदृश्य के बजाय पोर्ट्रेट के रूप में दिखाने की ज़रूरत है, मैं छवि का उपयोग कर रहा हूं विजेट धन्यवादकिवी एक तस्वीर को घुमाने के लिए कैसे करें

उत्तर

14

साथ भ्रमित toto_tico के पिछले 2 जवाब करने के लिए एक रास्ता है मिलता है, लेकिन मैं नहीं बल्कि इसके लिए एक नया विजेट बना होता है, और इसका इस्तेमाल करते हैं:

Builder.load_string(''' 
<RotatedImage>: 
    canvas.before: 
     PushMatrix 
     Rotate: 
      angle: root.angle 
      axis: 0, 0, 1 
      origin: root.center 
    canvas.after: 
     PopMatrix 
''') 

class RotatedImage(Image): 
    angle = NumericProperty() 

फिर, इस विजेट का उपयोग अन्य छवि विजेट के रूप में करें, आपके पास बस "कोण" संपत्ति है जिसके साथ आप खेल सकते हैं।

नोट: स्कैटर उदाहरण को छोड़कर टकराव का पता लगाने पर छवि पर टकराव का पता नहीं लगाया जाता है। स्कैटर बस कुछ घुमाने के लिए महंगा हो सकता है, लेकिन कम से कम टकराव काम करता है।

+0

मूल संपत्ति के लिए +1 –

+0

धन्यवाद मैं इसे बाद में कोशिश करूंगा, यह आपकी मदद के लिए सबसे अच्छा समाधान है, मैं बहुत नया हूं, मैं अभी भी फ्रेमवर्क कैसे काम करता हूं इस पर कुछ याद करता हूं :) – nukedbit

+0

यह हमेशा महत्वपूर्ण है ऑब्जेक्ट उन्मुख होने के लिए। धन्यवाद। – ehsan88

1

मुझे लगता है कि वे ऐसा करने के दो तरीके हैं। मैं दो उत्तरों पोस्ट करूंगा और दूसरों को यह तय करने दूंगा कि सही दृष्टिकोण क्या है। मैं व्यक्तिगत रूप से इस विधि को पसंद करता हूं क्योंकि मुझे लगता है कि यह कम्प्यूटेशनल लाइटर है। हालांकि, यह सहज नहीं है

यह विधि एक रिलेवेटिवआउट और दो संदर्भ निर्देशों (घुमाने और अनुवाद) का उपयोग करती है।

1 - आपको छवि को RelativeLayout के अंदर एम्बेड करने की आवश्यकता है। क्यूं कर? चूंकि घुमावदार कामों की तरह (0,0) समन्वय में एक नाखून डालने के समान है, यानी नीचे-बाएं कोने। RelativeLayout विजेट की स्थिति में 0,0 सेट करता है।

2- आप जैसा कि मैंने पहले भी कहा canvas

3 उपयोग करने के लिए की आवश्यकता होगी, घुमाएँ अनुदेश (0,0) में एक कील डाल करने के लिए समन्वय के बराबर है। कागज के एक टुकड़े के बारे में सोचो। यदि आप कोने में एक नाखून डालते हैं तो रोटेशन बाईं ओर खत्म हो जाएगा। तो, घूर्णन से पहले, आपको Translate पेपर का टुकड़ा अपने दाहिनी ओर ले जाना होगा।

4- अब आप Rotate रिलेवेटिवआउट कर सकते हैं और यह उस स्थिति में समाप्त हो जाएगा जिसकी आप उम्मीद कर रहे हैं।

रिलेटिवलाइट का उपयोग करने का एक और फायदा है। इसमें पहले से ही दो महत्वपूर्ण निर्देश शामिल हैं (PushMatrix और PopMatrix) कि आपको समझना होगा कि क्या आप घूर्णन, स्केलिंग या अनुवाद के साथ बड़े पैमाने पर काम कर रहे हैं।

from kivy.app import App 
from kivy.uix.stacklayout import StackLayout 
from kivy.lang import Builder 

Builder.load_string(""" 
<Example>: 
    Image: 
     source: 'kivy.png' 
     size_hint: None,None 
     size: 64,64 
    RelativeLayout 
     size_hint: None,None 
     size: 64,64 
     canvas.before: 
      Translate: 
       x: 64 
      Rotate: 
       angle: 90 
       axis: 0,0,1 
     Image: 
      source: 'kivy.png' 
      size_hint: None,None 
      size: 64,64 
""") 

class Example(App, StackLayout): 
    def build(self): 
     return self 

if __name__ == "__main__": 
    Example().run() 
4

मुझे नहीं लगता कि Scatter इस के लिए उपयोग करने के लिए है:

यहाँ एक उदाहरण कोड है। लेकिन मुझे लगता है कि एक और सहज ज्ञान युक्त समाधान है। स्कैटर में एक रोटेशन (और एक पैमाने) संपत्ति भी शामिल है।

असल में, मैंने एक स्कैटर के अंदर छवि को एम्बेड किया और 90 डिग्री घुमाने के लिए रोटेशन प्रॉपर्टी का उपयोग किया।

मैं क्यों कहता हूं कि Scatter इस कार्य के लिए नहीं है। असल में क्योंकि यह इस पर इशारा करता है। आप मूल रूप से अपनी उंगलियों के साथ अनुवाद, घुमाने या स्केल कर सकते हैं (या multi-touch mouse emulation का उपयोग कर)। यही कारण है कि अगले उदाहरण में मैं do_scale, do_rotation और do_translation को गलत पर सेट कर रहा हूं। मैं इस स्पष्ट कर रहा हूँ इससे पहले कि आप do_rotation: false

from kivy.app import App 
from kivy.uix.stacklayout import StackLayout 
from kivy.lang import Builder 

Builder.load_string(""" 
<Example>: 
    Image: 
     source: 'kivy.png' 
     size_hint: None,None 
     size: 64,64 
    Scatter: 
     pos: 0,0 
     size_hint: None,None 
     size: 64,64 
     do_rotation: False 
     do_scale: False 
     do_translation: False 
     rotation: 90 
     Image: 
      source: 'kivy.png' 
      size_hint: None,None 
      size: 64,64 

""") 

class Example(App, StackLayout): 
    def build(self): 
     return self 

if __name__ == "__main__": 
    Example().run() 
संबंधित मुद्दे