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通过wxPython打开一个音频文件并播放的方法
Mar 25 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
Aug 30 Python
Python实现从log日志中提取ip的方法【正则提取】
Mar 31 Python
python使用PIL模块获取图片像素点的方法
Jan 08 Python
python 对字典按照value进行排序的方法
May 09 Python
python中metaclass原理与用法详解
Jun 25 Python
处理python中多线程与多进程中的数据共享问题
Jul 28 Python
python 实现在shell窗口中编写print不向屏幕输出
Feb 19 Python
python 生成任意形状的凸包图代码
Apr 16 Python
利用python做表格数据处理
Apr 13 Python
Python批量将csv文件转化成xml文件的实例
May 10 Python
浅谈Python数学建模之线性规划
Jun 23 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执行速度全攻略(下)
2006/10/09 PHP
php入门小知识
2008/03/24 PHP
PHP中extract()函数的妙用分析
2012/07/11 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
2019/05/27 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
PHP文件操作简单介绍及函数汇总
2020/12/11 PHP
jquery动画3.创建一个带遮罩效果的图片走廊
2012/08/24 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
Nodejs实战心得之eventproxy模块控制并发
2015/10/27 NodeJs
WEB前端开发都应知道的jquery小技巧及jquery三个简写
2015/11/15 Javascript
jQuery EasyUI基础教程之EasyUI常用组件(推荐)
2016/07/15 Javascript
利用JavaScript阻止表单提交的两种方法
2016/08/11 Javascript
解决vue点击控制单个样式的问题
2018/09/05 Javascript
vue调试工具vue-devtools安装及使用方法
2018/11/07 Javascript
详解从0开始搭建微信小程序(前后端)的全过程
2019/04/15 Javascript
vue.js多页面开发环境搭建过程
2019/04/24 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
基于Vue SEO的四种方案(小结)
2019/07/01 Javascript
微信小程序实现组件顶端固定或底端固定效果(不随滚动而滚动)
2020/04/09 Javascript
[13:18]《一刀刀一天》之DOTA全时刻21:详解TI新赛制 A队再露獠牙
2014/06/24 DOTA
Python自动调用IE打开某个网站的方法
2015/06/03 Python
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
实例解析Python设计模式编程之桥接模式的运用
2016/03/02 Python
Python实现TCP/IP协议下的端口转发及重定向示例
2016/06/14 Python
Django视图之ORM数据库查询操作API的实例
2017/10/27 Python
Python如何抓取天猫商品详细信息及交易记录
2018/02/23 Python
python+opencv识别图片中的圆形
2020/03/25 Python
Flask框架模板继承实现方法分析
2019/07/31 Python
Python通过Tesseract库实现文字识别
2020/03/05 Python
Python文件名匹配与文件复制的实现
2020/12/11 Python
澳洲最大的时尚奢侈品电商平台:Cettire
2020/06/15 全球购物
初中班级口号
2014/06/09 职场文书
全国爱眼日活动总结
2015/02/27 职场文书
JavaScript实现复选框全选功能
2021/04/11 Javascript
解析目标检测之IoU
2021/06/26 Python