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中的filter()函数的用法
Apr 27 Python
Python中DJANGO简单测试实例
May 11 Python
python 生成器生成杨辉三角的方法(必看)
Apr 10 Python
Python正则表达式非贪婪、多行匹配功能示例
Aug 08 Python
基于Python os模块常用命令介绍
Nov 03 Python
在Windows中设置Python环境变量的实例讲解
Apr 28 Python
Python操作mongodb的9个步骤
Jun 04 Python
Jacobi迭代算法的Python实现详解
Jun 29 Python
python实现发送form-data数据的方法详解
Sep 27 Python
python实现信号时域统计特征提取代码
Feb 26 Python
python mysql 字段与关键字冲突的解决方式
Mar 02 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
Oct 15 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使用memcache存储session的详解
2013/06/25 PHP
Linux php 中文乱码的快速解决方法
2016/05/13 PHP
PHP 闭包详解及实例代码
2016/09/28 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
Javascript条件判断使用小技巧总结
2008/09/08 Javascript
Jquery优化效率 提升性能解决方案
2010/09/06 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
javaScript(JS)替换节点实现思路介绍
2013/04/17 Javascript
用正则表达式替换图片地址img标签
2013/11/22 Javascript
jQuery表单域属性过滤器用法分析
2015/02/10 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
2016/02/25 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
详解基于webpack和vue.js搭建开发环境
2017/04/05 Javascript
JS XMLHttpRequest原理与使用方法深入详解
2020/04/30 Javascript
[49:07]VGJ.T vs Optic Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
python 第三方库的安装及pip的使用详解
2017/05/11 Python
磁盘垃圾文件清理器python代码实现
2020/08/24 Python
Django跨域请求问题的解决方法示例
2018/06/16 Python
python3监控CentOS磁盘空间脚本
2018/06/21 Python
Python简单读写Xls格式文档的方法示例
2018/08/17 Python
Python2和Python3之间的str处理方式导致乱码的讲解
2019/01/03 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
2019/04/04 Python
专门出售各种儿童读物的网站:Put Me In The Story
2016/08/07 全球购物
Pretty Little Thing爱尔兰:时尚女性服饰
2017/03/27 全球购物
美国运动鞋类和服装零售连锁店:Shoe Palace
2019/08/13 全球购物
视图的作用
2014/12/19 面试题
优秀学生干部个人的自我评价
2013/10/04 职场文书
公关关系专员的自我评价分享
2013/11/20 职场文书
大学开学计划书
2014/04/30 职场文书
施工安全标语
2014/06/07 职场文书
计划生育汇报材料
2014/12/26 职场文书
忠诚与背叛观后感
2015/06/04 职场文书
寒假生活随笔
2015/08/15 职场文书
2016年小学“我们的节日·中秋节”活动总结
2016/04/05 职场文书
如何理解及使用Python闭包
2021/06/01 Python
Java SSM配置文件案例详解
2021/08/30 Java/Android