利用Tkinter实现彩球碰撞屏保

一、架构与思路

(1)主函数:

  • main():通过类启动程序;

(2)类:

  • ScreenSaver():用于定义屏保和主画布,调用球创建、运动等函数;
  • RandomBall():定义球的基本属性、球创建与运动函数;

(3)对象:单个球,需要创建、运动(包括碰撞反弹),通过循环调用实现多个球并存的效果

  • create_ball():单个球创建函数;
  • move_ball():单个球运动函数;

(4)20181215更新:此处对原有屏保程序的退出环节进行了扩展,使用messabox工具建立消息框,询问是否退出,点击“确定”会直接退出,点击“取消”仍留在程序中。

程序架构和思路如下:

二、代码实现

根据上述思路,利用python实现屏保程序,代码如下:

import random
import tkinter
import tkinter.messageboxclass RandomBall():'''单个球定义、运动的类'''def __init__(self, root_canvas, width, height):'''参数说明:canvas:从ScreenSaver类中传入的画布width,height:从SS类中传入的宽高,即屏幕宽高'''# 将传入变量赋为RB类的属性self.canvas = root_canvasself.width = widthself.height = height# 随机生成球的中心坐标self.xcenter = random.randint(100, width-100)self.ycenter = random.randint(100, height-100)# 随机生成球的运动速度self.xvelocity = random.randint(8,16)self.yvelocity = random.randint(8,16)# 计算球的半径self.radius = random.randint(60, 100)# 利用十六进制随机数与lambda表达式生成球的颜色# RGB表示法:三个数字,每个数字的值是0-255之间,表示红绿蓝三个颜色的大小# 在某些系统中,直接用英文单词表示也可以,比如red,greencolor = lambda : random.randint(0,255)self.color = '#%02x%02x%02x' % (color(),color(),color())# 创建球的函数def create_ball(self):'''用构造函数定义的变量值,在canvas上画一个球'''# tkinter没有画圆形函数# 只有一个画椭圆函数,画椭圆需要定义两个坐标,# 在一个长方形内画椭圆,我们只需要定义长方形左上角和右下角就好# 求两个坐标的方法是,已知圆心的坐标,则圆心坐标减去半径能求出# 左上角坐标,加上半径能求出右下角坐标(向右x为正,向下y为正)xleftup = self.xcenter - self.radiusyleftup = self.ycenter - self.radiusxrightdown = self.xcenter + self.radiusyrightdown = self.ycenter + self.radius# 创建球self.item = self.canvas.create_oval(xleftup,yleftup,xrightdown,yrightdown,fill=self.color,outline=self.color)# 球运动的函数def move_ball(self):# 计算球移动后的中心点坐标self.xcenter += self.xvelocityself.ycenter += self.yvelocity# 当球与边框发生碰撞时,需要进行回弹操作,即对应方向的速度取负if self.xcenter + self.radius >= self.width:self.xvelocity = - self.xvelocityif self.xcenter - self.radius <= 0:self.xvelocity = - self.xvelocityif self.ycenter + self.radius >= self.height:self.yvelocity = - self.yvelocityif self.ycenter - self.radius <= 0:self.yvelocity = - self.yvelocity# 在canvas上移动球,前提是create_ball已经调用self.canvas.move(self.item, self.xvelocity, self.yvelocity)class ScreenSaver():'''屏保定义类程序启动'''def __init__(self):# 创建球存储列表self.balls = []# 随机生成球的数量self.num = random.randint(10,20)# 利用tkinter生成root窗口self.root = tkinter.Tk()# 获取屏幕宽、高尺寸root_w, root_h = self.root.winfo_screenwidth(), self.root.winfo_screenheight()# 取消边框self.root.overrideredirect(1)# 绑定退出函数与相应动作self.root.bind('<Motion>', self.myquit)self.root.bind('<Key>', self.myquit)self.root.bind('<Any-Button>', self.myquit)# 创建画布,配置尺寸与颜色属性self.canvas = tkinter.Canvas(self.root, width=root_w, height=root_h)self.canvas.pack()# 利用循环与RandomBall类在画布上画球,并append到列表中for i in range(self.num):ball = RandomBall(self.canvas, width=root_w, height=root_h)ball.create_ball()self.balls.append(ball)# 调用球运动函数self.run_screen_saver()# 启用tkinter时间消息循环mainloopself.root.mainloop()# 球运动函数def run_screen_saver(self):# 循环实例化的ball调用move_ball函数for ball in self.balls:ball.move_ball()# 使用after实现递归,通过不断调用各球的move_ball函数,实现位置刷新self.root.after(50, self.run_screen_saver)# 停止运行# 此处e只是利用了事件处理机制,际上并不关心事件的类型def myquit(self, e):# 扩展:# 此屏保程序扩展成,一旦捕获事件,则判断屏保不退出# 显示一个Button,Button上显示事件类型,点击Button后屏保才退出if tkinter.messagebox.askokcancel("彩球碰撞", '确定退出?'):self.root.destroy()else:passif __name__ == '__main__':# 启动屏保ScreenSaver()

Python实战:利用Tkinter实现屏保程序相关推荐

  1. python3.6小程序_python3.6 tkinter实现屏保小程序

    本文实例为大家分享了python3.6 tkinter实现屏保小程序,供大家参考,具体内容如下 该小程序是在闲着没事的时候,随便写的,就当打发无聊了. 该程序是用python3.6写的,调用了pyth ...

  2. python写背单词软件_python实现屏保程序(适用于背单词)

    今天要给大家分享的是一款自己写的屏保程序,大学大家最头疼的就是四六级的考试了,上次考试做阅读的时候,情不自禁的发呆,想着如果我能在电脑上写一个屏保程序,那么就可以天天记单词了! 开始 首先:我们使用的 ...

  3. 用python开发一个背单词软件-python实现屏保程序(适用于背单词)

    今天要给大家分享的是一款自己写的屏保程序,大学大家最头疼的就是四六级的考试了,上次考试做阅读的时候,情不自禁的发呆,想着如果我能在电脑上写一个屏保程序,那么就可以天天记单词了! 开始 首先:我们使用的 ...

  4. python:程序猿的方式在元宵佳节之际,带你设计【东方明珠】动画浪漫烟花秀(python编程利用Tkinter+PIL库)

    python:程序猿的方式在元宵佳节之际,带你设计[东方明珠]动画浪漫烟花秀(python编程利用Tkinter+PIL库) 目录 设计动画展示 设计思路 核心代码 设计动画展示 设计思路 核心代码 ...

  5. Linux下屏保程序

    http://www.openswc.com/forum.php?mod=viewthread&tid=560 利用一些便捷的小软件把自己的数码相片做成绚烂多彩的屏保,放在自己的电脑上该是多么 ...

  6. python画完图 程序暂停运行_[Python实战]你也能写的计时器程序

    文章地址:[Python实战]你也能写的计时器程序 上次,公众号介绍了如何使用 Pyqt5 制作猜数游戏界面,并介绍了如何在 Pycharm 中使用 Qt Designer 生成 UI 文件.这次,我 ...

  7. 自定义设置一个屏保程序

    用C语言写一个简单的窗口程序,目的是生成一个可视化的图形窗口,需要用到EasyX库,可在文章末尾的网盘链接中下载.该程序退出需左击鼠标,否则无法退出. #include<stdio.h> ...

  8. From .1:从屏保到Win平台开发 - 一个可运行的C#屏保程序

    有一天在微信里看见了微软的Fluent Design系统(腾讯翻译为浸流设计系统)界面设计的一张图片,觉得非常好看,顿时想,这么好看的界面,如果能是一个屏保该有多好.这样的话,用户坐在电脑前也不会忍心 ...

  9. 学以致用——Java源码——使用随机几何图形制作屏保程序(Screen Saver with Shapes Using the Java 2D API)

    程序功能: 使用随机输出的几何图形作为屏保程序,用户可随时指定屏幕上要显示的图形元素的数量. 运行示例: 源码: 1. 实体类 import java.awt.Graphics; import jav ...

最新文章

  1. NLP-基础知识-001
  2. 中国影视股,越补贴,越萎靡
  3. MySql取得日期(前一天、某一天)
  4. ios8 定位问题解决思路
  5. Drawable Resources
  6. 2017.10.16 水管局长水管局长数据加强版 思考记录
  7. 问题:There are no packages available for installation 问题的解决办法
  8. 自己手写一个Spring MVC框架
  9. yum安装Jenkins
  10. 【原】oracle11g 客户端安装检测失败问题
  11. cdr X6 64位32位缩略图补丁包
  12. Microsoft SQL Server 2008 R2 Express
  13. 学校邮箱的pop服务器地,澳门大学的邮件服务器(POP)是多少
  14. Win11怎么加入工作组?Win11加入局域网工作组的方法
  15. 计算机数控编程特点,什么是数控图像编程系统有哪些特点
  16. C#理论 —— 文件操作、委托和事件
  17. imple-unpack---攻防世界
  18. 详解如何路由器设置自动拨号上网
  19. 【以太坊】ubuntu安装以太坊ethereum的测试网络ropsten-net以及雷电网络raiden-network环境
  20. 回放线上流量利器-GoReplay

热门文章

  1. npm ERR gyp verb `which` failed Error: not found: python2
  2. 2021.3.12日报:修复miniblink vip版本的性能问题
  3. IE浏览器兼容jsp问题
  4. element input=number 限制输入长度,输入数字的大小和禁止输入e
  5. RED5流媒体服务器作为客户端转发流至另一个RED5服务器
  6. windows录屏html文件,录音、录屏、共享屏幕怎么玩?
  7. 51单片机外接ADC0808制作简易电压表
  8. 碳中和丨InVEST模型高级进阶及在生态系统服务供需、碳中和等领域中的具体应用
  9. 根据ip限制访问网页
  10. Ubuntu20.04下安装显卡驱动