其实前面程序中的高亮显示已经是动画效果了。程序会用红色、黄色交替显示几何图形的边框,这样看上去就是动画效果了。实现其他动画效果也是这个原理,程序只要增加一个定时器,周期性地改变界面上图形项的颜色、大小、位置等选项,用户看上去就是所谓的“动画”了。

下面以一个简单的桌面弹球游戏来介绍使用 Canvas 绘制动画。在游戏界面上会有一个小球,该小球会在界面上滚动,遇到边界或用户挡板就会反弹。该程序涉及两个动画:

小球转动:小球转动是一个“逐帧动画”,程序会循环显示多张转动的小球图片,这样用户就会看到小球转动的效果。

小球移动:只要改变小球的坐标程序就可以控制小球移动。

为了让用户控制挡板移动,程序还为 Canvas 的向左箭头、向右箭头绑定了事件处理函数。下面是桌面弹球游戏的程序:

from tkinter import * from tkinter import messagebox import threading import random GAME_WIDTH = 500 GAME_HEIGHT = 680 BOARD_X = 230 BOARD_Y = 600 BOARD_WIDTH = 80 BALL_RADIUS = 9 class App: def __init__(self, master): self.master = master # 记录小球动画的第几帧 self.ball_index = 0 # 记录游戏是否失败的旗标 self.is_lose = False # 初始化记录小球位置的变量 self.curx = 260 self.cury = 30 self.boardx = BOARD_X self.init_widgets() self.vx = random.randint(3, 6) # x方向的速度 self.vy = random.randint(5, 10) # y方向的速度 # 通过定时器指定0.1秒之后执行moveball函数 self.t = threading.Timer(0.1, self.moveball) self.t.start() # 创建界面组件 def init_widgets(self): self.cv = Canvas(root, background='white', width=GAME_WIDTH, height=GAME_HEIGHT) self.cv.pack() # 让画布得到焦点,从而可以响应按键事件 self.cv.focus_set() self.cv.bms = [] # 初始化小球的动画帧 for i in range(8): self.cv.bms.append(PhotoImage(file='images/ball_' + str(i+1) + '.gif')) # 绘制小球 self.ball = self.cv.create_image(self.curx, self.cury, image=self.cv.bms[self.ball_index]) self.board = self.cv.create_rectangle(BOARD_X, BOARD_Y, BOARD_X + BOARD_WIDTH, BOARD_Y + 20, width=0, fill='lightblue') # 为向左箭头按键绑定事件,挡板左移 self.cv.bind('', self.move_left) # 为向右箭头按键绑定事件,挡板右移 self.cv.bind('', self.move_right) def move_left(self, event): if self.boardx <= 0: return self.boardx -= 5 self.cv.coords(self.board, self.boardx, BOARD_Y, self.boardx + BOARD_WIDTH, BOARD_Y + 20) def move_right(self, event): if self.boardx + BOARD_WIDTH >= GAME_WIDTH: return self.boardx += 5 self.cv.coords(self.board, self.boardx, BOARD_Y, self.boardx + BOARD_WIDTH, BOARD_Y + 20) def moveball(self): self.curx += self.vx self.cury += self.vy # 小球到了右边墙壁,转向 if self.curx + BALL_RADIUS >= GAME_WIDTH: self.vx = -self.vx # 小球到了左边墙壁,转向 if self.curx - BALL_RADIUS <= 0: self.vx = -self.vx # 小球到了上边墙壁,转向 if self.cury - BALL_RADIUS <= 0: self.vy = -self.vy # 小球到了挡板处 if self.cury + BALL_RADIUS >= BOARD_Y: # 如果在挡板范围内 if self.boardx <= self.curx <= (self.boardx + BOARD_WIDTH): self.vy = -self.vy else: messagebox.showinfo(title='失败', message='您已经输了') self.is_lose = True self.cv.coords(self.ball, self.curx, self.cury) self.ball_index += 1 self.cv.itemconfig(self.ball, image=self.cv.bms[self.ball_index % 8]) # 如果游戏还未失败,让定时器继续执行 if not self.is_lose: # 通过定时器指定0.1秒之后执行moveball函数 self.t = threading.Timer(0.1, self.moveball) self.t.start() root = Tk() root.title("弹球游戏") root.iconbitmap('images/fklogo.ico') root.geometry('%dx%d' % (GAME_WIDTH, GAME_HEIGHT)) # 禁止改变窗口大小 root.resizable(width=False, height=False) App(root) root.mainloop()

上面程序中第 26、27 行代码通过线程启动了一个定时器,该定时器控制 moveball() 方法每隔 0.1 秒执行一次,而 moveball() 方法中通过改变小球的坐标可以实现小球移动的效果;通过改变小球的图片,可以实现小球滚动的效果。

运行上面程序,可以看到如图 1 所示的游戏效果:

图 1 桌面弹球游戏

如果读者对使用 Python 开发游戏有很浓厚的兴趣,则不要局限于使用简单的 Tkinter 和 Canvas 画布。记住 Python 的优势是拥有大量的工具和库。如果想使用 Python 开发游戏,则尽量考虑使用专业的游戏工具库,比如 Pygame。

python制作简单动画_Python tkinter Canvas绘制动画相关推荐

  1. python制作简单动画_Python通过matplotlib绘制动画简单实例

    Matplotlib是一个Python的2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形. 通过Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱, ...

  2. Python设置画布大小_Python Tkinter Canvas画布

    简介 画布部件则用于将结构化图形的 Python 应用.它是用于绘制图表和曲线图的 Python 应用. 画布部件则用于将结构化图形的 Python 应用.它是用于绘制图表和曲线图的 Python 应 ...

  3. python制作简单网页_python 跑服务器,访问自己制作的简单页面

    1 python 跑服务器,访问自己制作的简单页面 2 # win+b出现一个网址http:/0.0.1:5000/复制到浏览器查看 # http://127.0.0.1:5000/home 做这个首 ...

  4. python制作简单网页_Python制作简单的网页爬虫

    1.准备工作: 工欲善其事必先利其器,因此我们有必要在进行Coding前先配置一个适合我们自己的开发环境,我搭建的开发环境是: 操作系统:Ubuntu 14.04 LTS Python版本:2.7.6 ...

  5. 如何用Python制作简单又好看的词云?来瞅瞅吧~

    今天教大家如何用Python制作简单的词云,文中有非常详细的介绍及代码示例,对于正在学习Python的小伙伴们也能看的懂,需要的小伙伴可以参考下. 一.准备 词云制作所必需的三个包: 安装:pip i ...

  6. 用python制作简单的可视化地图

    用python制作简单的可视化地图,代码如下: from pyecharts.charts import Bar # 导入pyecharts工具包,调用Bar工具bar1 = Bar() bar1.a ...

  7. Python制作简单的终端交互小游戏

    Python制作简单的终端交互小游戏 因为最近的集训课程中,老师让我们把python,java,nodejs都需要掌握,本人最常使用的是java,python许久没有用过,就想写一段逻辑来帮助自己复习 ...

  8. Canvas绘制动画

    给大家分享一个用Canvas写的"小人吃豆"的动画,效果如下: 哈哈,实现代码如下: <!DOCTYPE html> <html><head lang ...

  9. python制作简单动画_Python通过matplotlib简单绘制动画实例

    Matplotlib是一个Python的2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形.通过Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条 ...

最新文章

  1. Meta 发布 Bean Machine 帮助衡量 AI 模型的不确定性
  2. 亿级数据湖统一存储技术实践
  3. 《中国基础研究竞争力报告2020》发布,6图表速览报告核心结论
  4. hive sql插入一行数据_Hive查询某一重复字段记录第一条数据
  5. 织梦内容管理系统(DedeCMS)
  6. 【常用】截取相机图片截图功能
  7. C#相关基础知识点总结+基础代码
  8. B+树索引和哈希索引
  9. html css表格样式模板_HTML amp; CSS 基础入门【4】列表及其样式
  10. Confluence 6 配置数字格式
  11. 小程序技术能提升桌面应用安全等级?
  12. 计算机视觉在小机器人中应用,基于计算机视觉的车身焊接机器人路径校正装置的制造方法...
  13. 苹果显示器(Apple Cinema Display)连接Windows的亮度调节方法(Win10可用)
  14. 商品详情页中特别注意的三件事
  15. 微信小程序radio单选框
  16. newifi路由器 php,newifi智能路由设置教程
  17. 远程计算机或设备将不接受连接,IE无法上网
  18. Mac苹果电脑上有哪些好用的txt小说阅读器?
  19. 【IoT】产品设计之商业模式:电商如何做增长?带你认知电商的商业逻辑:电商=流量×转化率×客单价×复购率
  20. ap计算机sql,如何用sql实现AP

热门文章

  1. 推荐系统 -- NFM
  2. element-ui 表格吸底固定最后一行
  3. flutter type ‘int‘ is not a subtype of type ‘String?‘
  4. Android-Hybrid-问题收集Android客户端无法拦截Vue路由的问题
  5. 福州大学计算机专业排名2018,福州大学2019年排名第64位 较2018年下降3名
  6. linux切换内核版本
  7. grunt从入门到自定义项目模板
  8. xshell进入管理员模式
  9. 12款好用的Visual Studio插件,最后一款良心推荐
  10. 大数据征信|芝麻信用、腾讯信用和51信用卡等信用评分模型解析