2013-07-16 16 views
6

Ekranda göstermek zorunda olduğum bazı resimleri döndürmeye çalışıyorum, bu resim bir stacklayout içerisindedir ve bunları yatay yerine Portre olarak göstermem gerekiyor, resmi kullanıyorum Widget TeşekkürlerKivy bir resmi döndürme

cevap

14

ile karıştırmayın geçmedenseni bu açıklık ediyorum, ama doğrusu bunun için yeni bir widget oluşturmak ve kullanmak olacaktır:

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

Sonra, bu widget'ı diğer Image widget'ları olarak kullanın, sadece oynayabileceğiniz bir "açı" özelliğiniz var.

Not: scatter örneği dışında, çarpışma algılaması görüntü üzerinde işlenmez. Dağılım sadece bir şeyi döndürmek için pahalı olabilir, ama en azından çarpışma çalışır.

+0

+1 menşei mülkiyeti için –

+0

Teşekkür ederim, en iyi çözüm gibi görünüyor, yardımınız için teşekkürler, kivy için oldukça yeni, çerçevenin nasıl çalıştığını hala özlüyorum :) – nukedbit

+0

Her zaman önemli nesne yönelimli olmak. Teşekkürler. – ehsan88

1

Bunu yapmanın iki yolu olduğunu düşünüyorum. İki cevap gönderirim ve diğerlerinin doğru yaklaşımın ne olduğuna karar vermesine izin vereceğim. Ben kişisel olarak bu yöntemi tercih ediyorum, çünkü hesaplamanın daha hafif olduğunu düşünüyorum. Ancak, bu o kadar da mantıklı değil

Bu yöntem RelativeLayout ve iki bağlam talimatı kullanır (Döndür ve Çevir).

1 - Görüntüyü RelativeLayout içine gömmeniz gerekir. Niye ya? Döndürme yolu, (0,0) koordinatına, yani sol alt köşeye tırnak koymaya benzer olduğu için. RelativeLayout, 0,0 değerini Widget'ın konumuna ayarlar. Eğer daha önce belirttiğimiz gibi canvas

3- kullanmak gerekecektir

2-, Döndürme kullanıcı koordinat (0,0) bir çivi koymak için eşdeğerdir. Bir kağıt parçası düşün. Köşeye bir çivi koyarsanız, dönüş solda bitecek. Bu nedenle, döndürmeden önce, sağınıza Translate kağıt parçası gerekir.

4-1 Rotate RelativeLayout ve Beklediğiniz konumda sona erecektir.

RelativeLayout kullanmanın başka bir avantajı vardır. Zaten kapsamlı, ölçekleme veya çeviri ile çalışıyorsanız, anlamanız gereken iki önemli yönergeyi (PushMatrix ve PopMatrix) içerir.

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

Ben Scatter bunun için kullanılmasını olması gerekiyordu sanmıyorum: Burada

bir örnek kodudur. Ama sanırım daha sezgisel bir çözüm. Dağılım, bir döndürme (ve ayrıca bir ölçek) özelliği içerir.

Temel olarak, Görüntüyü bir Dağıtıcıya yerleştirdim ve döndürme özelliğini 90 derece döndürmek için kullanıyorum.

Neden bu görev için Scatter kastedilmiyor? Temelde jestleri ona izin verdiği için. Temel olarak parmaklarınızla çevirebilir, döndürebilir veya ölçekleyebilirsiniz (veya multi-touch mouse emulation'u kullanarak). Bu yüzden bir sonraki örnekte do_scale, do_rotation ve do_translation hatalarını ayarlamıyorum. Eğer toto_tico önceki 2 cevap yapmak için bir yoldur 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()