Python实战:利用Tkinter实现屏保程序
利用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实现屏保程序相关推荐
- python3.6小程序_python3.6 tkinter实现屏保小程序
本文实例为大家分享了python3.6 tkinter实现屏保小程序,供大家参考,具体内容如下 该小程序是在闲着没事的时候,随便写的,就当打发无聊了. 该程序是用python3.6写的,调用了pyth ...
- python写背单词软件_python实现屏保程序(适用于背单词)
今天要给大家分享的是一款自己写的屏保程序,大学大家最头疼的就是四六级的考试了,上次考试做阅读的时候,情不自禁的发呆,想着如果我能在电脑上写一个屏保程序,那么就可以天天记单词了! 开始 首先:我们使用的 ...
- 用python开发一个背单词软件-python实现屏保程序(适用于背单词)
今天要给大家分享的是一款自己写的屏保程序,大学大家最头疼的就是四六级的考试了,上次考试做阅读的时候,情不自禁的发呆,想着如果我能在电脑上写一个屏保程序,那么就可以天天记单词了! 开始 首先:我们使用的 ...
- python:程序猿的方式在元宵佳节之际,带你设计【东方明珠】动画浪漫烟花秀(python编程利用Tkinter+PIL库)
python:程序猿的方式在元宵佳节之际,带你设计[东方明珠]动画浪漫烟花秀(python编程利用Tkinter+PIL库) 目录 设计动画展示 设计思路 核心代码 设计动画展示 设计思路 核心代码 ...
- Linux下屏保程序
http://www.openswc.com/forum.php?mod=viewthread&tid=560 利用一些便捷的小软件把自己的数码相片做成绚烂多彩的屏保,放在自己的电脑上该是多么 ...
- python画完图 程序暂停运行_[Python实战]你也能写的计时器程序
文章地址:[Python实战]你也能写的计时器程序 上次,公众号介绍了如何使用 Pyqt5 制作猜数游戏界面,并介绍了如何在 Pycharm 中使用 Qt Designer 生成 UI 文件.这次,我 ...
- 自定义设置一个屏保程序
用C语言写一个简单的窗口程序,目的是生成一个可视化的图形窗口,需要用到EasyX库,可在文章末尾的网盘链接中下载.该程序退出需左击鼠标,否则无法退出. #include<stdio.h> ...
- From .1:从屏保到Win平台开发 - 一个可运行的C#屏保程序
有一天在微信里看见了微软的Fluent Design系统(腾讯翻译为浸流设计系统)界面设计的一张图片,觉得非常好看,顿时想,这么好看的界面,如果能是一个屏保该有多好.这样的话,用户坐在电脑前也不会忍心 ...
- 学以致用——Java源码——使用随机几何图形制作屏保程序(Screen Saver with Shapes Using the Java 2D API)
程序功能: 使用随机输出的几何图形作为屏保程序,用户可随时指定屏幕上要显示的图形元素的数量. 运行示例: 源码: 1. 实体类 import java.awt.Graphics; import jav ...
最新文章
- NLP-基础知识-001
- 中国影视股,越补贴,越萎靡
- MySql取得日期(前一天、某一天)
- ios8 定位问题解决思路
- Drawable Resources
- 2017.10.16 水管局长水管局长数据加强版 思考记录
- 问题:There are no packages available for installation 问题的解决办法
- 自己手写一个Spring MVC框架
- yum安装Jenkins
- 【原】oracle11g 客户端安装检测失败问题
- cdr X6 64位32位缩略图补丁包
- Microsoft SQL Server 2008 R2 Express
- 学校邮箱的pop服务器地,澳门大学的邮件服务器(POP)是多少
- Win11怎么加入工作组?Win11加入局域网工作组的方法
- 计算机数控编程特点,什么是数控图像编程系统有哪些特点
- C#理论 —— 文件操作、委托和事件
- imple-unpack---攻防世界
- 详解如何路由器设置自动拨号上网
- 【以太坊】ubuntu安装以太坊ethereum的测试网络ropsten-net以及雷电网络raiden-network环境
- 回放线上流量利器-GoReplay
热门文章
- npm ERR gyp verb `which` failed Error: not found: python2
- 2021.3.12日报:修复miniblink vip版本的性能问题
- IE浏览器兼容jsp问题
- element input=number 限制输入长度,输入数字的大小和禁止输入e
- RED5流媒体服务器作为客户端转发流至另一个RED5服务器
- windows录屏html文件,录音、录屏、共享屏幕怎么玩?
- 51单片机外接ADC0808制作简易电压表
- 碳中和丨InVEST模型高级进阶及在生态系统服务供需、碳中和等领域中的具体应用
- 根据ip限制访问网页
- Ubuntu20.04下安装显卡驱动