2016-12-11 15 views
0

如何從Python代碼翻轉(自定義)kivy小工具?我試着將其高度或寬度設置爲負值,但它實際上會旋轉小部件,翻轉兩個軸。 Rotate指令顯然也是這樣。我知道有一個flip_horizontal()紋理的方法,但我沒有絲毫的想法如何實際上導致它影響現有的部件,而不是從,例如地圖集內存紋理。在基維翻轉小工具

如果有幫助,我使用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,它都不起作用。這個小部件是一個簡單的Widget子類,具有可伸縮的圖像以及大小和位置的幾個回調。

+0

我很好奇,爲什麼你要這麼做?爲什麼你不能旋轉180度?什麼樣的小工具?你需要一個內部文字或圖像翻轉?例如,您可以在其容器中重新繪製翻轉的圖像 - 可能比翻轉Widget更容易。 – Daniel

+1

因爲如果我將例如字母'd'旋轉180度,我會得到字母'p',但是如果我翻轉它,我會根據翻轉方向獲得'b'或'q'。小部件代碼在下面的要點中可用。是的,我可以做到這一點,但我希望有一種解決方案,不需要爲每個圖像製作兩份副本,以完成一項微不足道的操作。如果要在運行時構建一個小部件,那將會是一個痛苦的世界。 – 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

謝謝,它工作。唯一的修正是,至少在我的情況下(Scatter嵌套在RelativeLayout中)錨點座標不需要轉換爲本地。 – Synedraacus

+0

@Synedraacus - 沒問題:) –

0

帶縮放比例的Scale指令怎麼樣?

如果小部件還需要觸摸事件,則需要修改其on_touch_down以適當地轉換它們。

+0

出於某種原因,我無法讓它工作,具有負值或正值的縮放值。將代碼添加到問題中。 – Synedraacus

+0

發佈一個可運行的最小示例。 – inclement

+0

我需要一些時間,這是一個相當大的項目,'最低限度'不會那麼小。我在上面。 – Synedraacus