编程python如何制作动画,python简单动画代码

本文介绍了Python入门学习动画设计的过程,包括软件准备、表格设计、图像绘制、使用QTimer控制动画和基本问题处理。作者提供了实例代码,如读取Excel表格、创建轮换序列和动画控制功能。
摘要由CSDN通过智能技术生成

本篇文章给大家谈谈python零基础入门高薪必看动画课,以及python做动画主要要学哪些东西,希望对各位有所帮助,不要忘了收藏本站喔。

【Python动画设计教程】系列文章目录
【第一讲】软件准备
【第二讲】搭建界面,Excel读取,图片读取
【第三讲】图像绘制
【第四讲】制作动画


 


计划2020年1月18日完成
2小时课时,完成动画设计

  • 软件准备
    下文中的SVN代码仓,地址为:svn://gitee.com/bigearrabbit/kevinpython/kevinanimation

1 轮换序列的表格

SVN代码仓切换到版本6。

  • 表格设计

按照30度一个图片,360/30 = 12个图片c语言和python哪个吃香
每行为一个时间的状态,时间间隔为50毫秒
每列为一个位置的颜色饱和度
保存为文件 loop.xlsx

msCir 0Cir 1Cir 2Cir 3Cir 4Cir 5Cir 6Cir 7Cir 8Cir 9Cir 10Cir 11
GreenGreenGreenGreenGreenGreenGreenGreenGreenGreenGreenGreen
010000000000000
50901000000000000
1008090100000000000
15070809010000000000
200607080901000000000
2505060708090100000000
30040506070809010000000
350304050607080901000000
4002030405060708090100000
45010203040506070809010000
50001020304050607080901000

  • 添加xlrd引用:
import xlrd

添加变量初始化:


        self.LoopTable = []
        self.LoopIndex = 0
  • 创建读取表格函数:
    def readExcelTable(self, iFilePath):
        # 打开文件:
        wb = xlrd.open_workbook(iFilePath)
        sheetCount = len(wb.sheets())  # sheet数量
        if sheetCount < 1:
            return []
        sheet = wb.sheet_by_index(0)  # sheet索引从0开始

        if sheet.nrows < 1 or sheet.ncols < 1:
            return []

        contents = []  # 定义一个行数组

        # 逐行读取
        for i in range(sheet.nrows):  # i从0开始
            tmp = []  # 定义一个空数组变量
            # 逐列读取
            for j in range(sheet.ncols):
                value = sheet.cell_value(i, j)
                tmp.append(value)  # add one value
            contents.append(tmp)  # first row
        return contents
  • 创建输出调试表格的函数

    def printTable(self, table):
        # 逐行输出
        for i in range(len(table)):
            print(table[i])  # 逐个输出最后一列
  • 修改OnOpenExcel函数读取和修改表格
    def OnOpenExcel(self):
        print('I am in OnOpenExcel().')
        self.LoopTable = self.readExcelTable("loop.xlsx")  # 打开文件:
        rows = len(self.LoopTable)
        if rows < 1:
            return 1
        self.printTable(self.LoopTable)
        return 0
  • 运行效果:
['ms', 'Cir 0', 'Cir 1', 'Cir 2', 'Cir 3', 'Cir 4', 'Cir 5', 'Cir 6', 'Cir 7', 'Cir 8', 'Cir 9', 'Cir 10', 'Cir 11']
['', 'Green', 'Green', 'Green', 'Green', 'Green', 'Green', 'Green', 'Green', 'Green', 'Green', 'Green', 'Green']
[0.0, 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
[50.0, 90.0, 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
[100.0, 80.0, 90.0, 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
...

如果学员没有调试出来,可以把SVN代码仓切换到版本8,查看效果。

2 根据表格轮换图片

SVN代码仓切换到版本8。

修改部分变量,添加函数:

  • 修改ImageLoop函数:
    def ImageLoop(self, angle, percent):
        # 图像坐标的0点在左上角
        x = self.x + self.R * \
            math.sin(angle * math.pi / 180)  # 圆的x坐标,向右为正
        y = self.y + self.R * \
            math.cos(angle * math.pi / 180)  # 圆心y坐标,向下为正
        self.ImageCircle(self.imgOutput, x, y, self.r, percent)  # 往输入的图片上画图形
        self.ShowCVImage(self.imgOutput, self.labelOutPut)  # 显示到InputLabel上
        return 0
  • 添加一个Loop按钮来显示图片。
    曹函数命名:OnImageLoop,
    代码如下:
    def OnImageLoop(self):
        print('I am in OnImageLoop().')
        LastIndex = len(self.LoopTable) - 3
        if LastIndex < 0:
            return 1
        if self.LoopIndex >= LastIndex:
            self.LoopIndex = 0

        img = self.imgInput.copy()  # 复制一个拷贝
        self.imgOutput = img  # 记录下来

        row = self.LoopTable[self.LoopIndex + 2]
        cols = len(row)
        for i in range(1, cols):
            self.ImageLoop(self.angle, row[i])
            self.angle += 30
            self.angle = self.angle % 360

        self.LoopIndex += 1

        return 0

通过loop的百分比,来循环绘制图像
效果图:
循环效果图


如果学员没有调试出来,可以把SVN代码仓切换到版本:9,查看效果。

3 使用QTimer控制动画

SVN代码仓切换到版本9。
参考文章: PyQt5 定时器的使用
添加按钮pushButtonAutoLoop,界面文字:Auto Loop
添加2个QLabel,显示动画的id和时间(毫秒)

定义变量:
self.LoopCounter = 0
self.LoopMax = 0

修改函数OnImageLoopAuto,通过self.startTimer(100)启动计时器,100毫秒触发一次,触发后就会运行timerEvent(self, event)函数。

    def OnImageLoopAuto(self):
        if self.time_id > 0:
            return 0  # 防止重复点击启动计时器
        self.time_id = self.startTimer(100)  # 100ms,0.1s
        self.LoopCounter = 0
        self.LoopMax= len(self.LoopTable) - 2
        return 0

重载函数:timerEvent,在达到一定条件下,停止计时器,
通过语句self.killTimer(self.time_id) 来停止。
所以要提前记录下来计时器的id。
但是这个方法不靠谱。容易出问题。
有可能计时器已经被删除了。


    def timerEvent(self, event):
        # 定时器经过设定的时间会调用这个函数,循环调用,直到被kill
        self.LoopCounter += 1
        if self.LoopCounter < 0:
            self.LoopCounter = 0
        self.OnImageLoop()
        self.labelTimeCounter.setText(str(self.LoopCounter))

        if(self.LoopCounter >= self.LoopMax):
            if self.time_id >0 :
            	self.killTimer(self.time_id)	# 结束定时
            self.time_id = -1
        else:
            text = ''
            id = self.LoopCounter + 2
            if id < len(self.LoopTable):
                row = self.LoopTable[id]
                if len(row) > 0:
                    text = str(row[0])
            if text[-2:] == '.0':
                text = text[0:-2]
            self.labelTime.setText(text)
            self.labelTimeCounter.setText(str(self.LoopCounter))

自动动画的效果


如果学员没有调试出来,可以把SVN代码仓切换到版本11,查看效果。

4 保存动画

把一个序列的图片,保存为avi视频
请等待,没有完成

5 问题处理

QT Toolbar简单示例

QT menu简单示例

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值