Python 尝试在kivy中的速度计上添加动画

Python 尝试在kivy中的速度计上添加动画,python,kivy,Python,Kivy,我试着让速度表上的指针从左向右移动。它有制作动画的功能吗?一个简单的函数或帮助就可以了 .py文件 import kivy from kivy.lang import Builder from kivy.uix.screenmanager import Screen, ScreenManager from kivy.app import App class SpeedWindow(Screen): pass class WindowManager(ScreenManager):

我试着让速度表上的指针从左向右移动。它有制作动画的功能吗?一个简单的函数或帮助就可以了

.py文件

import kivy
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.app import App

class SpeedWindow(Screen):
    pass

class WindowManager(ScreenManager):
    pass

KV = """

WindowManager:
    SpeedWindow:

<SpeedWindow>:

    Image:
        source: 'cadran.png'
        size_hint: None, None
        size: 400, 400
        pos_hint: {'center_x': 0.5, 'center_y': 0.5}

    Image:
        source: 'needle.png'
        size_hint: None, None
        size: 300, 300
        pos_hint: {'center_x': 0.5, 'center_y': 0.5}

"""



class MyMainApp(App):
    def build(self):
        return  Builder.load_string(KV)

if __name__ == "__main__":
    MyMainApp().run()
导入kivy
从kivy.lang导入生成器
从kivy.uix.screenmanager导入屏幕,screenmanager
从kivy.app导入应用程序
类速度窗口(屏幕):
通过
类WindowManager(屏幕管理器):
通过
KV=”“”
WindowManager:
速度窗口:
:
图片:
来源:“cadran.png”
大小提示:无,无
尺码:400400
位置提示:{'center_x':0.5,'center_y':0.5}
图片:
资料来源:“needle.png”
大小提示:无,无
尺码:300300
位置提示:{'center_x':0.5,'center_y':0.5}
"""
类MyMainApp(应用程序):
def生成(自):
返回生成器。加载字符串(KV)
如果名称=“\uuuuu main\uuuuuuuu”:
MyMainApp().run()

使用
旋转
动画
,可以设置针旋转的动画,如下所示:

from kivy.animation import Animation
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.app import App

class SpeedWindow(Screen):
    pass

class WindowManager(ScreenManager):
    pass

KV = """

WindowManager:
    SpeedWindow:

<SpeedWindow>:
    angle: 90    # angle for needle
    name: 'speedometer'    # every Screen needs a name

    Image:
        source: 'cadran.png'
        size_hint: None, None
        size: 400, 400
        pos_hint: {'center_x': 0.5, 'center_y': 0.5}

    Image:
        source: 'needle.png'
        size_hint: None, None
        size: 300, 300
        pos_hint: {'center_x': 0.5, 'center_y': 0.5}   
        # apply rotation matrix to this Image                                                                                                                                            
        canvas.before:                                                                                                                                             
            PushMatrix                                                                                                                                             
            Rotate:                                                                                                                                                
                angle: root.angle                                                                                                                                  
                axis: (0, 0, 1)                                                                                                                                    
                origin: (self.center_x, self.center_y - self.norm_image_size[1]/2, 0)                                                                                                                              
        canvas.after:                                                                                                                                              
            PopMatrix                           

"""



class MyMainApp(App):
    def build(self):
        Clock.schedule_once(self.animate_needle, 2.0)  # start the animation in 2 seconds
        return  Builder.load_string(KV)

    def animate_needle(self, dt):
        # animate the needle from +90 to -90 and then back to +90
        self.anim = Animation(angle=-90.0) + Animation(angle=90)
        self.anim.repeat = True    # repeat forever
        speedometer = self.root.get_screen('speedometer')
        self.anim.start(speedometer)

if __name__ == "__main__":
    MyMainApp().run()
从kivy.animation导入动画
从kivy.clock导入时钟
从kivy.lang导入生成器
从kivy.uix.screenmanager导入屏幕,screenmanager
从kivy.app导入应用程序
类速度窗口(屏幕):
通过
类WindowManager(屏幕管理器):
通过
KV=”“”
WindowManager:
速度窗口:
:
角度:针的90度角
名称:“速度表”#每个屏幕都需要一个名称
图片:
来源:“cadran.png”
大小提示:无,无
尺码:400400
位置提示:{'center_x':0.5,'center_y':0.5}
图片:
资料来源:“needle.png”
大小提示:无,无
尺码:300300
位置提示:{'center_x':0.5,'center_y':0.5}
#将旋转矩阵应用于此图像
在以下情况之前:
推矩阵
轮换:
角度:root.angle
轴:(0,0,1)
原点:(self.center\u x,self.center\u y-self.norm\u图像大小[1]/2,0)
在下列情况之后:
流行音乐
"""
类MyMainApp(应用程序):
def生成(自):
时钟。计划一次(self.animate_pine,2.0)#2秒后开始动画
返回生成器。加载字符串(KV)
def动画针(自身,dt):
#将针的动画设置为从+90到-90,然后再回到+90
self.anim=动画(角度=-90.0)+动画(角度=90)
self.anim.repeat=True#永远重复
速度表=self.root.get\u屏幕(“速度表”)
自动动画启动(速度表)
如果名称=“\uuuuu main\uuuuuuuu”:
MyMainApp().run()

您可以使用
旋转
动画
。请参阅类似的应用程序。谢谢!我可以知道PushMatrix和PopMatrix的用途吗?当我运行代码时,我得到一个错误
TypeError:必须是实数,不是非类型kivy,它指向
角度:根。角度
是否在
部分中包含
角度:90
?在显示之前,有一个
模型视图
矩阵应用于
画布
图形。
PushMatrix
将当前矩阵推到堆栈上,然后
Rotate
创建一个执行我们所需旋转的新矩阵。然后,
PopMatrix
弹出矩阵堆栈以恢复先前保存的矩阵。使用
canvas.before
在显示
needle.png
图像之前设置旋转,而
canvas.after
在显示指针之后恢复旧矩阵。我发布的代码工作正常。一定有别的东西在影响它。