【问题标题】:Kivy how to rotate a pictureKivy如何旋转图片
【发布时间】:2013-07-14 12:39:21
【问题描述】:

我正在尝试旋转一些我必须在屏幕上显示的图片,这些图片在堆栈布局内,我需要将它们显示为纵向而不是横向,我正在使用图像小部件 谢谢

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    toto_tico 的前 2 个答案是一种方法,但我宁愿为它创建一个新的小部件,并使用它:

    Builder.load_string('''
    <RotatedImage>:
        canvas.before:
            PushMatrix
            Rotate:
                angle: root.angle
                axis: 0, 0, 1
                origin: root.center
        canvas.after:
            PopMatrix
    ''')
    
    class RotatedImage(Image):
        angle = NumericProperty()
    

    然后,将此小部件用作其他图像小部件,您只需拥有一个可以使用的“角度”属性。

    注意:碰撞检测不在图像上处理,除了分散示例。 Scatter 仅用于旋转某些东西可能会很昂贵,但至少碰撞有效。

    【讨论】:

    • 谢谢,我稍后会尝试,这似乎是最好的解决方案,感谢您的帮助,我对 kivy 还是很陌生,我仍然想念一些关于框架如何工作的东西 :)
    • 始终面向对象很重要。谢谢。
    【解决方案2】:

    我不认为Scatter 用于此目的。但我想是一个更直观的解决方案。 Scatter 包括一个旋转(以及一个缩放)属性。

    基本上,我将 Image 嵌入到 Scatter 中并使用旋转属性旋转 90 度。

    为什么我说Scatter 不适用于此任务。基本上是因为它允许对其进行手势。您基本上可以用手指(或使用multi-touch mouse emulation)平移、旋转或缩放。这就是为什么在下一个示例中我将do_scaledo_rotationdo_translation 设置为false。在您对do_rotation: false 感到困惑之前,我会澄清这一点

    from kivy.app import App
    from kivy.uix.stacklayout import StackLayout
    from kivy.lang import Builder
    
    Builder.load_string("""
    <Example>:
        Image:
            source: 'kivy.png'
            size_hint: None,None
            size: 64,64
        Scatter:
            pos: 0,0
            size_hint: None,None
            size: 64,64
            do_rotation: False
            do_scale: False
            do_translation: False
            rotation: 90
            Image:
                source: 'kivy.png'
                size_hint: None,None
                size: 64,64
    
    """)
    
    class Example(App, StackLayout):
        def build(self):
            return self
    
    if __name__ == "__main__":
        Example().run()
    

    【讨论】:

      【解决方案3】:

      我认为他们是这样做的两种方式。我将发布两个答案,让其他人决定什么是正确的方法。我个人更喜欢这种方法,因为我认为它的计算量更轻。但是,它并不那么直观

      此方法使用一个RelativeLayout 和两个上下文指令(Rotate 和Translate)。

      1 - 您需要将图像嵌入到RelativeLayout 中。为什么?因为 Rotate 的工作方式类似于将钉子放在 (0,0) 坐标中,即左下角。 RelativeLayout 将 0,0 设置为 Widget 的位置。

      2- 您需要使用canvas

      3- 正如我之前所说,Rotate 指令相当于在 (0,0) 坐标中钉了一个钉子。想想一张纸。如果你把钉子放在角落里,旋转将在左边结束。所以,在轮换之前,你需要Translate你右边的那张纸。

      4- 现在您可以RotateRelativeLayout 并且它将在您期望的位置结束。

      使用RelativeLayout 还有另一个好处。它已经包含了两条重要的指令(PushMatrixPopMatrix),如果您广泛使用旋转、缩放或平移,则必须了解这些指令。

      这是一个示例代码:

      from kivy.app import App
      from kivy.uix.stacklayout import StackLayout
      from kivy.lang import Builder
      
      Builder.load_string("""
      <Example>:
          Image:
              source: 'kivy.png'
              size_hint: None,None
              size: 64,64
          RelativeLayout
              size_hint: None,None
              size: 64,64
              canvas.before:
                  Translate:
                      x: 64
                  Rotate:
                      angle: 90
                      axis: 0,0,1
              Image:
                  source: 'kivy.png'
                  size_hint: None,None
                  size: 64,64
      """)
      
      class Example(App, StackLayout):
          def build(self):
              return self
      
      if __name__ == "__main__":
          Example().run()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-10
        • 1970-01-01
        • 2020-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-27
        相关资源
        最近更新 更多