2016-05-01 34 views
0

私はクリック可能な画像を作成しました。回転できますが、回転の原点を取得することはできません。次のコードでは、2つのイメージ(その1つはクリック可能)をフォームに配置します。クリック可能なものを回転させて、それらを互いの上に置くことを期待しています。クリック可能なものは回転しますが、回転中心はイメージセンター以外のものになります。中心を指定していても、その中心が移動します。興味深いことに、それはクリック可能ですが、クリック領域はそれが想定されているところです:クリック不可能な画像上。つまり、青いイメージをクリックすると、赤いイメージが緑色に変わります!Kivy:クリック可能な画像を回転

私はオンラインで見つかったいくつかのkv言語からこのコードを修正しました。しかし、ボタンをプログラムで設定する必要があります。なぜなら、最終的には、それぞれが回転して別々に動かされるフォームがたくさんあるからです。

私は問題が座標単位の不一致であるように感じますが、私は多くのオンラインとドキュメントを見つけていません。どんな助けもありがとうございます。画像はちょうど32x32のアイコンで、あなたが手軽に持っているものに置き換えることができます。あなたのウィジェット(非常に便利なデバッグ手法)の周りに線を描画しようとした場合

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.image import Image 
from kivy.uix.floatlayout import FloatLayout 
from kivy.graphics.context_instructions import PopMatrix, PushMatrix 
from kivy.graphics import Rotate 
from kivy.uix.behaviors import ButtonBehavior 

h = .05 
w = h * 1.6 

class IconButton(ButtonBehavior, Image): 

    def __init__(self, angle=0, **kwargs): 
     super(IconButton, self).__init__(**kwargs) 

     self.canvas.before.add(PushMatrix()) 
     self.canvas.before.add(Rotate(angle = angle, origin = [self.get_center_x(), self.get_center_y()])) 

     self.canvas.after.add(PopMatrix()) 

    def on_press(event): 
     event.source = event.img_dn 
     print '{} pressed'.format(event.id) 

    def on_release(event): 
     event.source = event.img_up 
     print '{} released'.format(event.id) 


class TestApp(App): 

    def build(self): 
     layout = FloatLayout() 
     btn = IconButton(angle=-20, id='b1', size_hint=(h,w), pos_hint = {'center_x': .25, 'center_y': .9}) 
     btn.img_up = 'loudspeaker_red_32.png' 
     btn.img_dn = 'loudspeaker_green_32.png' 
     btn.source = btn.img_up 

     layout.add_widget(btn) 

     im = Image(id='i1', size_hint=(h,w), pos_hint = {'center_x': .25, 'center_y': .9}) 
     im.source = 'loudspeaker_blue_32.png' 

     layout.add_widget(im) 

     return layout 

class MainApp(App): 
    def build(self): 
     layout = Builder.load_string(src) 
     return layout 


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

答えて

2

、あなたはIconButton.__init__()pos atribute呼び出されたときに、まだ(0, 0)であることを発見するでしょうし、コードがあなたのボタンが左下隅にあると考えています。

class IconButton(ButtonBehavior, Image): 

    def __init__(self, angle=0, **kwargs): 
     super(IconButton, self).__init__(**kwargs) 

     self.canvas.before.add(PushMatrix()) 

     self.canvas.add(Color(rgba=(1,0,0,.5))) 
     self.canvas.add(Line(rectangle=(self.x, self.y, self.width, self.height))) 

     self.canvas.after.add(PopMatrix()) 

    def on_press(event): 
     event.source = event.img_dn 
     print '{} pressed'.format(event.id) 

    def on_release(event): 
     event.source = event.img_up 
     print '{} released'.format(event.id) 

これはあなたのウィジェットがレイアウトの内側に配置されている場合pos属性が実現されbeacuse起こっています。あなたがウィジェットを作成しているとき、ウィジェットがどこに置かれるかはわかりません。

class IconButton(ButtonBehavior, Image): 

    def __init__(self, angle=0, **kwargs): 
     super(IconButton, self).__init__(**kwargs) 

     self.rotate = Rotate(angle = angle) 

     self.canvas.before.add(PushMatrix()) 
     self.canvas.before.add(self.rotate) 
     self.canvas.after.add(PopMatrix()) 

     self.bind(pos=self.update_canvas) 
     self.bind(size=self.update_canvas) 

    def update_canvas(self, *args): 
     self.rotate.origin = self.center   

    def on_press(event): 
     event.source = event.img_dn 
     print '{} pressed'.format(event.id) 

    def on_release(event): 
     event.source = event.img_up 
     print '{} released'.format(event.id) 

この不便さは、我々はレイアウトを説明するために.kv言語を使用することを好む正確な理由です:あなたはすべてのプロパティが正しく設定されている場合、後で呼び出すon_posメソッド内の原点を回転実現する必要がある理由です。

+0

ありがとうございます。あなたの答えは理にかなっていて、うまくいきます。 –

関連する問題