如何从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子类,带有可伸缩的图像和一对大小和位置的回调。
答案 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()