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实现从web抓取文档的方法
Sep 26 Python
Python下载懒人图库JavaScript特效
May 28 Python
利用Python获取赶集网招聘信息前篇
Apr 18 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
Apr 19 Python
基于python 爬虫爬到含空格的url的处理方法
May 11 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
Jun 13 Python
详解Python安装scrapy的正确姿势
Jun 26 Python
详解flask表单提交的两种方式
Jul 21 Python
Python json模块dumps、loads操作示例
Sep 06 Python
PyTorch的深度学习入门之PyTorch安装和配置
Jun 27 Python
详解Python IO口多路复用
Jun 17 Python
如何向scrapy中的spider传递参数的几种方法
Nov 18 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函数utf8转gb2312编码
2006/12/21 PHP
CI框架中cookie的操作方法分析
2014/12/12 PHP
基础的WordPress插件制作教程
2015/11/24 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
javascript编程起步(第四课)
2007/01/10 Javascript
js实现DIV的一些简单控制
2007/06/04 Javascript
关于eval 与new Function 到底该选哪个?
2013/04/17 Javascript
12行javascript代码绘制一个八卦图
2015/04/02 Javascript
js实现超简单的展开、折叠目录代码
2015/08/28 Javascript
javascript数据结构之双链表插入排序实例详解
2015/11/25 Javascript
用JavaScript和jQuery实现瀑布流
2017/03/19 Javascript
React Native 搭建开发环境的方法步骤
2017/10/30 Javascript
浅谈angular4实际项目搭建总结
2017/12/01 Javascript
详解Vue 项目中的几个实用组件(ts)
2019/10/29 Javascript
vue实现拖拽效果
2019/12/23 Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
2020/11/04 Javascript
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
2015/04/05 Python
详解python进行mp3格式判断
2016/12/23 Python
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
python实现大文件分割与合并
2019/07/22 Python
python实现socket+threading处理多连接的方法
2019/07/23 Python
pandas的to_datetime时间转换使用及学习心得
2019/08/11 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
2020/02/18 Python
Python实现井字棋小游戏
2020/03/09 Python
python使用列表的最佳方案
2020/08/12 Python
selenium3.0+python之环境搭建的方法步骤
2021/02/01 Python
CSS3实现文本垂直排列的方法
2018/07/10 HTML / CSS
预备党员思想汇报范文
2014/01/11 职场文书
文明餐桌活动方案
2014/02/11 职场文书
诉讼代理人授权委托书
2014/04/08 职场文书
警示教育活动总结
2014/05/05 职场文书
学校百日安全生产活动总结
2014/07/05 职场文书
无财产无子女离婚协议书范文
2014/09/14 职场文书
2016党员党章学习心得体会
2016/01/14 职场文书
java objectUtils 使用可能会出现的问题
2022/02/28 Java/Android
关于Redis的主从复制及哨兵问题
2022/06/16 Redis