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很陌生,我仍然错过了框架如何工作的一些内容:)始终面向对象很重要。谢谢