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入门及进阶笔记 Python 内置函数小结
Aug 09 Python
浅谈MySQL中的触发器
May 05 Python
Python 爬虫学习笔记之正则表达式
Sep 21 Python
Python创建二维数组实例(关于list的一个小坑)
Nov 07 Python
python opencv之SURF算法示例
Feb 24 Python
在python中只选取列表中某一纵列的方法
Nov 28 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
Aug 13 Python
django中使用事务及接入支付宝支付功能
Sep 15 Python
在tensorflow中实现去除不足一个batch的数据
Jan 20 Python
TensorFlow梯度求解tf.gradients实例
Feb 04 Python
在脚本中单独使用django的ORM模型详解
Apr 01 Python
浅析Python requests 模块
Oct 09 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
PHP学习笔记 用户注册模块用户类以及验证码类
2011/09/20 PHP
Zend Framework数据库操作方法实例总结
2016/12/11 PHP
thinkphp关于简单的权限判定方法
2017/04/03 PHP
Yii2语言国际化的配置教程
2018/08/19 PHP
PHP 代码简洁之道(小结)
2019/10/16 PHP
Mootools 1.2教程(3) 数组使用简介
2009/09/14 Javascript
AJAX 网页保留浏览器前进后退等功能
2011/02/12 Javascript
capacityFixed 基于jquery的类似于新浪微博新消息提示的定位框
2011/05/24 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
2017/02/21 Javascript
Vue 父子组件的数据传递、修改和更新方法
2018/03/01 Javascript
vue+iview+less 实现换肤功能
2018/08/17 Javascript
vue项目中引入vue-datepicker插件的详解
2019/05/14 Javascript
自定义Vue组件打包、发布到npm及使用教程
2019/05/22 Javascript
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
2019/09/17 Javascript
JavaScript的console命令使用实例
2019/12/03 Javascript
js实现简单放大镜效果
2020/03/07 Javascript
vue项目中使用rem,在入口文件添加内容操作
2020/11/11 Javascript
[05:28]刀塔密之一:团结则存
2014/07/03 DOTA
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
python3实现短网址和数字相互转换的方法
2015/04/28 Python
Python标准库06之子进程 (subprocess包) 详解
2016/12/07 Python
python文本数据相似度的度量
2018/03/12 Python
python实现自动发送报警监控邮件
2018/06/21 Python
python脚本开机自启的实现方法
2019/06/28 Python
使用pyecharts生成Echarts网页的实例
2019/08/12 Python
python对Excel按条件进行内容补充(推荐)
2019/11/24 Python
基于TensorFlow中自定义梯度的2种方式
2020/02/04 Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
2020/04/22 Python
使用Python项目生成所有依赖包的清单方式
2020/07/13 Python
教育专业个人求职信
2013/12/02 职场文书
自我评价正确写法范文
2013/12/10 职场文书
团购业务员岗位职责
2014/03/15 职场文书
《第一次抱母亲》教学反思
2014/04/16 职场文书
学习优秀共产党员先进事迹思想报告
2014/09/17 职场文书
2015年财务人员工作总结
2015/04/10 职场文书
Nginx本地目录映射实现代码实例
2021/03/31 Servers