在 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()
如何从 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()