python利用tkinter实现屏保


Posted in Python onJuly 30, 2019

本文实例为大家分享了python利用tkinter实现屏保的具体代码,供大家参考,具体内容如下

import random
import tkinter

class RandomBall():
 '''
 运动的球
 '''
 def __init__(self, canvas, scrn_width,scrn_heigh):
  '''
  球的构造函数
  :param canvas: 传入画布,在画布上进行球的构造
  :param scrn_width: 传入屏幕宽度
  :param scrn_heigh: 传入屏幕高度
  '''
  #x,y表示出现的球的圆心
  self.ball_x = random.randint(20, int(scrn_width - 20)) #球出现的随机x坐标
  self.ball_y = random.randint(10, int(scrn_heigh - 10)) #球出现的随机y坐标
  #模拟运动:就是不断地重画球,不断地更新球的位置
  self.x_move = random.randint(4, 30) #模拟x方向运动
  self.y_move = random.randint(5, 20) #模拟y方向运动
  #定义宽度和高度和画布
  self.canvas = canvas
  self.scrn_width = scrn_width
  self.scrn_heigh = scrn_heigh
  #球的大小随机
  self.rad = random.randint(20, 150) #用半径rad表示球的大小
  #定义颜色
  c = lambda : random.randint(0, 255)
  self.color = "#%02x%02x%02x"%(c(), c(), c())

 def creat_ball(self):
  '''
  用构造函数中的值创建一个球
  :return:
  '''
  #tkinter没有画圆函数,只有椭圆函数
  #但在正方形里面画的椭圆就是正圆
  #已知圆心坐标和半径,则圆心坐标减半径能求出正方形左上角
  #圆心坐标加上半径,能求出右下角
  #已知左上角和右上角,可以画出
  x1 = self.ball_x - self.rad #左上角的x坐标
  y1 = self.ball_y - self.rad #左上角的y坐标
  x2 = self.ball_x + self.rad #右下角的x坐标
  y2 = self.ball_y + self.rad #右下角的y坐标
  #在有对角坐标的情况下就可以创建圆
  self.item = self.canvas.create_oval(x1, y1, x2, y2, fill = self.color, outline = self.color)

  # 球动
 def move_ball(self):
  self.ball_x += self.x_move #球移动后的新x坐标
  self.ball_y += self.y_move #球移动后的新y坐标
  # 碰壁回弹判断
  if self.ball_x + self.rad >= self.scrn_width: #撞到了右边的墙
   self.x_move = -self.x_move
  if self.ball_x - self.rad <= 0: #撞到了左边的墙
   self.x_move = -self.x_move
  if self.ball_y + self.rad >= self.scrn_heigh: #撞到下面的墙
   self.y_move = -self.y_move
  if self.ball_y - self.rad <= 0: #撞到上面的墙
   self.y_move = -self.y_move
  self.canvas.move(self.item, self.x_move, self.y_move) #利用x,y的移动距离控制球的移动快慢

class ScreenSaver():
 '''
 可以被启动的屏保
 '''
 #创建一个list装创建的球

 def __init__(self):
  self.balls = list()
  self.nums_balls = random.randint(6, 20) #产生随机数量的球
  self.baseFrame = tkinter.Tk() #启动界面
  self.baseFrame.overrideredirect(1) #取消边框
  #移动鼠标则退出屏保
  self.baseFrame.bind("<Motion>", self.my_quit)
  self.baseFrame.attributes('-alpha', 1)
  #键盘任意键退出屏保
  self.baseFrame.bind("<Key>",self.my_quit)
  #得到屏幕的宽和高
  w = self.baseFrame.winfo_screenwidth()
  h = self.baseFrame.winfo_screenheight()
  #创建画布
  self.canvas = tkinter.Canvas(self.baseFrame, width = w, height = h)
  self.canvas.pack()

  #在画布上画球
  for i in range(self.nums_balls):
   ball = RandomBall(self.canvas, scrn_width = w, scrn_heigh = h)
   ball.creat_ball()
   self.balls.append(ball)

  self.run_screen_saver()
  self.baseFrame.mainloop()
 #球动函数
 def run_screen_saver(self):
  for ball in self.balls:
   ball.move_ball()
  #在sleep100ms以后启动第二个参数函数,相当于100ms动一次
  self.canvas.after(100, self.run_screen_saver)
 #当事件发生时,传入event,退出屏保
 def my_quit(self, event):
  #析构(退出)屏保
  self.baseFrame.destroy()
if __name__ == "__main__":
 #启动屏保
 ScreenSaver()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
几个提升Python运行效率的方法之间的对比
Apr 03 Python
举例讲解Python中metaclass元类的创建与使用
Jun 30 Python
python中快速进行多个字符替换的方法小结
Dec 15 Python
python中MethodType方法介绍与使用示例
Aug 03 Python
利用python编写一个图片主色转换的脚本
Dec 07 Python
Python+matplotlib绘制不同大小和颜色散点图实例
Jan 19 Python
在CMD命令行中运行python脚本的方法
May 12 Python
如何在django里上传csv文件并进行入库处理的方法
Jan 02 Python
python超时重新请求解决方案
Oct 21 Python
Python使用type动态创建类操作示例
Feb 29 Python
python实现飞船大战
Apr 24 Python
Python更改pip镜像源的方法示例
Dec 01 Python
django 微信网页授权登陆的实现
Jul 30 #Python
python tkinter库实现气泡屏保和锁屏
Jul 29 #Python
django迁移数据库错误问题解决
Jul 29 #Python
python实现桌面托盘气泡提示
Jul 29 #Python
python实现桌面气泡提示功能
Jul 29 #Python
pycharm设置鼠标悬停查看方法设置
Jul 29 #Python
django rest framework vue 实现用户登录详解
Jul 29 #Python
You might like
laravel migrate初学常见错误的解决方法
2017/10/11 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
2019/03/29 PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
2019/04/17 PHP
PHP接入支付宝接口失效流程详解
2020/11/10 PHP
JavaScipt基本教程之JavaScript语言的基础
2008/01/16 Javascript
javascript 全等号运算符使用说明
2010/05/31 Javascript
nodejs通过phantomjs实现下载网页
2015/05/04 NodeJs
自己动手写的jquery分页控件(非常简单实用)
2015/10/28 Javascript
简介AngularJS中$http服务的用法
2016/02/06 Javascript
老生常谈javascript的类型转换
2016/10/12 Javascript
easyUI combobox实现联动效果
2017/01/17 Javascript
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
2017/08/23 jQuery
JQ图片文件上传之前预览功能的简单实例(分享)
2017/11/12 Javascript
element-ui 文件上传修改文件名的方法示例
2019/11/05 Javascript
JS实现前端动态分页码代码实例
2020/06/02 Javascript
Vue中引入svg图标的两种方式
2021/01/14 Vue.js
[01:12:27]EG vs Secret 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
bpython 功能强大的Python shell
2016/02/16 Python
Python tkinter的grid布局及Text动态显示方法
2018/10/11 Python
python接口自动化(十六)--参数关联接口后传(详解)
2019/04/16 Python
mac系统下Redis安装和使用步骤详解
2019/07/09 Python
python3图片文件批量重命名处理
2019/10/31 Python
pycharm激活码快速激活及使用步骤
2020/03/12 Python
Python requests模块cookie实例解析
2020/04/14 Python
Python如何把十进制数转换成ip地址
2020/05/25 Python
Python下载网易云歌单歌曲的示例代码
2020/08/12 Python
利用python制作拼图小游戏的全过程
2020/12/04 Python
存储过程的优点有哪些
2012/09/27 面试题
通息工程毕业生自荐信
2013/10/16 职场文书
实习自我鉴定范文
2013/10/30 职场文书
自荐信怎么写好
2013/11/11 职场文书
大学四年职业生涯规划书范文
2014/01/02 职场文书
后备干部培训方案
2014/05/22 职场文书
承诺书模板大全
2015/05/04 职场文书
施工安全责任协议书
2016/03/23 职场文书
Python 内置函数速查表一览
2021/06/02 Python