Python Kivy如何旋转图片

Python Kivy如何旋转图片,python,kivy,Python,Kivy,我正在尝试旋转一些必须在屏幕上显示的图片,这些图片在堆栈布局中,我需要将它们显示为纵向而不是横向,我正在使用图像小部件 谢谢我认为这是两种方法。我将发布两个答案,让其他人决定什么是正确的方法。我个人更喜欢这种方法,因为我认为它计算量更轻。然而,这并不是那么直观 此方法使用RelativeLayout和两个上下文指令(旋转和平移) 1-您需要将图像嵌入到。为什么?因为旋转的工作方式类似于将钉子放在(0,0)坐标系中,即左下角。将0,0设置为小部件的位置 2-您需要使用 3-正如我之前所说,旋转指令

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

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

此方法使用RelativeLayout和两个上下文指令(旋转和平移)

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

2-您需要使用

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

4-现在你可以开始相对论,它将在你期望的位置结束

使用RelativeLayout还有另一个优点。它已经包括了两个重要的说明(和),如果您正在广泛使用旋转、缩放或平移,您必须理解这两个说明

下面是一个示例代码:

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()
从kivy.app导入应用
从kivy.uix.stacklayout导入stacklayout
从kivy.lang导入生成器
生成器。加载\u字符串(“”)
:
图片:
资料来源:“kivy.png”
大小提示:无,无
尺码:64,64
相对布局
大小提示:无,无
尺码:64,64
在以下情况之前:
翻译:
x:64
轮换:
角度:90
轴:0,0,1
图片:
资料来源:“kivy.png”
大小提示:无,无
尺码:64,64
""")
类示例(应用程序、StackLayout):
def生成(自):
回归自我
如果名称=“\uuuuu main\uuuuuuuu”:
示例().run()
我不认为这是用来做这件事的。但我想这是一个更直观的解决方案。散射包括旋转(以及缩放)特性

基本上,我将图像嵌入到散射中,并使用旋转属性旋转90度

为什么我要说这项任务不是为了完成这项任务。基本上是因为它允许在上面做手势。您基本上可以用手指(或使用)平移、旋转或缩放。这就是为什么在下一个示例中,我将
do_scale
do_rotation
do_translation
设置为false。在你混淆
do\u旋转: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()
从kivy.app导入应用
从kivy.uix.stacklayout导入stacklayout
从kivy.lang导入生成器
生成器。加载\u字符串(“”)
:
图片:
资料来源:“kivy.png”
大小提示:无,无
尺码:64,64
散布:
位置:0,0
大小提示:无,无
尺码:64,64
do_旋转:错误
do_比例:错误
你的翻译是错的吗
轮换:90
图片:
资料来源:“kivy.png”
大小提示:无,无
尺码:64,64
""")
类示例(应用程序、StackLayout):
def生成(自):
回归自我
如果名称=“\uuuuu main\uuuuuuuu”:
示例().run()

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()
Builder.load\u字符串(“”)
:
在以下情况之前:
推矩阵
轮换:
角度:root.angle
轴:0,0,1
来源:根.center
在下列情况之后:
流行音乐
''')
类旋转图像(图像):
角度=数值属性()
然后,将此小部件用作其他图像小部件,您只需使用一个“角度”属性即可


注意:碰撞检测不会在图像上处理,散射示例除外。仅旋转某个对象时,分散可能会很昂贵,但至少碰撞是有效的。

谢谢我稍后会尝试,它似乎是最好的解决方案,谢谢你的帮助,我对kivy很陌生,我仍然错过了框架如何工作的一些内容:)始终面向对象很重要。谢谢