在 kivy 中翻转一个小部件

Flip a widget in kivy

如何从 Python 代码翻转(自定义)kivy 小部件?我试过将它的高度或宽度设置为负值,但它实际上旋转了小部件,ie 翻转了两个轴。旋转指令显然做同样的事情。我知道纹理有一个 flip_horizontal() 方法,但我一点也不知道如何真正使它影响现有的小部件而不是来自 eg[ 的内存中纹理=23=]图集.

如果有帮助,我将 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 都不起作用。有问题的小部件是一个简单的小部件子类,具有可拉伸图像和几个大小和位置回调。

负缩放的缩放指令怎么样?

如果小部件还需要接收触摸事件,您需要修改它的 on_touch_down 以适当地转换它们。

实现目标的一种简单方法是使用散点图。这是一个完整的工作示例

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