【问题标题】:Flip a widget in kivy在 kivy 中翻转一个小部件
【发布时间】:2016-12-11 12:54:47
【问题描述】:

如何从 Python 代码翻转(自定义)kivy 小部件?我尝试将它的高度或宽度设置为负值,但它实际上会旋转小部件,ie 会翻转两个轴。 Rotate 指令显然也是如此。我知道有一个纹理的flip_horizontal() 方法,但我一点也不知道如何实际导致它影响现有的小部件,而不是 eg 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,它都不起作用。有问题的小部件是一个简单的小部件子类,具有可拉伸的图像和几个大小和位置的回调。

【问题讨论】:

  • 我很好奇你为什么需要这样做?为什么不能旋转 180 度?什么样的小部件?您需要内部文本或图像来翻转吗?例如,您可以在其容器中重新绘制翻转的图像 - 可能比翻转 Widget 更容易。
  • 因为如果我将例如字母d 旋转180 度,我会得到字母p,但如果我翻转它,我会得到bq,具体取决于翻转方向。小部件代码可在下面的要点中找到。是的,我可以这样做,但我希望有一个解决方案不涉及为每个图像制作两个副本,因为这应该是一个微不足道的操作。如果要在运行时构建一个小部件,那将是一个痛苦的世界。

标签: python python-3.x widget kivy


【解决方案1】:

实现目标的一种简单方法是使用 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()

【讨论】:

  • 谢谢,它成功了。唯一的更正是,至少在我的情况下(嵌套在 RelativeLayout 中的散射)锚坐标不需要转换为本地。
  • @Synedraacus - 没问题 :)
【解决方案2】:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多