在kivy中翻转小部件

时间:2016-12-11 12:54:47

标签: python python-3.x widget kivy

如何从Python代码中翻转(自定义)kivy Widget?我尝试将其高度或宽度设置为负值,但实际上它会旋转小部件,翻转两个轴。 Rotate指令显然也是如此。我知道纹理有一种flip_horizontal()方法,但我不知道如何真正让它影响现有的小部件,而不是来自的内存中纹理例如 Atlas。

如果有帮助,我使用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子类,带有可伸缩的图像和一对大小和位置的回调。

2 个答案:

答案 0 :(得分:0)

具有负缩放的Scale指令怎么样?

如果小部件还需要接触触摸事件,则您需要修改其on_touch_down以对其进行适当的转换。

答案 1 :(得分:0)

实现目标的简便方法是使用Scatter。这是一个完整的工作示例

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