2016-12-11 27 views
0

Pythonコードから(カスタム)kivyウィジェットをどのように置き換えることができますか?私はその高さや幅を負の値に設定しようとしましたが、実際にはウィジェットは、つまりは両方の軸を反転します。 Rotate命令は明らかに同じことをします。私はテクスチャの方法がflip_horizontal()であることを認識していますが、からアトラスのメモリ内テクスチャではなく、既存のウィジェットに実際にどのように影響させるかは少しは考えていません。kivyのウィジェットを反転する

私が役に立ちそうなら、私はkivy 1.9.2をPython 3.4.3で使用します。

UPD Scale()を無効にしました。

event.actor.widget.img.canvas.before.add(PushMatrix()) 
event.actor.widget.canvas.before.add(Scale(x=2.0, origin=event.actor.widget.center)) 
event.actor.widget.img.canvas.after.add(PopMatrix()) 
event.actor.widget.canvas.ask_update() 

PushMatrix/PopMatrixの有無にかかわらず動作しません。問題のウィジェットは、ストレッチ可能なイメージと大きさと位置のためのカップルコールバックを持つシンプルなウィジェットサブクラスです。

+0

のですか?なぜあなたは180度だけ回転できませんか?どのようなウィジェットですか?裏返すために内部のテキストやイメージが必要ですか?たとえば、そのコンテナに反転したイメージを再描画するだけで、おそらくウィジェットを反転させるよりも簡単です。 – Daniel

+1

文字 'd'を180度回転させると文字 'p'が得られますが、反転すると反転方向によって' b'または 'q'が得られます。ウィジェットコードは以下の要点から入手できます。はい、私はそれをすることができますが、私は、些細な操作でなければならないものについて、すべての画像の2つのコピーを作ることを伴わない解決策があることを望んでいました。ウィジェットが実行時に構築されるなら、それは痛みの全世界になるでしょう。 – Synedraacus

答えて

0

目的を達成する簡単な方法は、スキャッターを使用することです。ここでは、フル作業の例では、これを実行する必要がある理由私は好奇心が強い

from kivy.lang import Builder 
from kivy.app import App 
from kivy.clock import Clock 
from kivy.uix.boxlayout import BoxLayout 

import random 
from kivy.graphics.transformation import Matrix 


class MyBox(BoxLayout): 



    def later_(self, dt=None): 
     self.t.apply_transform(Matrix().scale(-1, 1.0, 1.0), 
          post_multiply=True, 
          anchor=self.to_local(*self.center)) 
     Clock.schedule_once(self.later_, 1.0) 

class TestApp(App): 
    def build(self): 


     Builder.load_string("""\ 
<MyBox>: 
    t: s 
    orientation: 'vertical' 
    Scatter: 
     id: s 
     do_scale: 0 
     do_rotate: 0 
     do_translation: 0,0 
     Label: 

      pos: s.pos 
      size: s.size 
      text: "The text below will keep changing using a delayed function..." 

     """ 
     ) 
     mybox = MyBox() 
     Clock.schedule_once(mybox.later_, 1.0) 

     return mybox 

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

ありがとうございました。唯一の訂正は、少なくとも私の場合(RelativeLayout内にネストされたScatter)アンカー座標をローカルに変換する必要はないということです。 – Synedraacus

+0

@Synedraacus - 問題ありません:) –

0

負のスケーリングを持つスケール命令はどうですか?

ウィジェットもタッチイベントを受け取る必要がある場合は、on_touch_downを修正して適切に変換する必要があります。

+0

何らかの理由で、負のスケール値または正のスケーリング値では動作しません。質問にコードを追加しました。 – Synedraacus

+0

実行可能な最小限の例を投稿してください。 – inclement

+0

私はしばらく時間がかかりますが、それはむしろ大きなプロジェクトであり、「最小」はそれほど大きくはありません。やってる。 – Synedraacus

関連する問題