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自动化构建工具scons使用入门笔记
Mar 10 Python
在Python中使用SQLite的简单教程
Apr 29 Python
Python编程之属性和方法实例详解
May 19 Python
python日志记录模块实例及改进
Feb 12 Python
每天迁移MySQL历史数据到历史库Python脚本
Apr 13 Python
python3 pandas 读取MySQL数据和插入的实例
Apr 20 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
May 25 Python
python将处理好的图像保存到指定目录下的方法
Jan 10 Python
PyQt+socket实现远程操作服务器的方法示例
Aug 22 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
Nov 19 Python
Python requests获取网页常用方法解析
Feb 20 Python
Python threading.local代码实例及原理解析
Mar 16 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执行速率优化技巧小结
2008/03/15 PHP
解析yahoo邮件用phpmailer发送的实例
2013/06/24 PHP
Laravel 4.2 中队列服务(queue)使用感受
2014/10/30 PHP
typecho插件编写教程(六):调用接口
2015/05/28 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
Laravel下生成验证码的类
2017/11/15 PHP
随机显示经典句子或诗歌的javascript脚本
2007/08/04 Javascript
基于jquery的多功能软键盘插件
2012/07/25 Javascript
js生成缩略图后上传并利用canvas重绘
2014/05/15 Javascript
node.js中的dns.getServers方法使用说明
2014/12/08 Javascript
微信支付 JS API支付接口详解
2016/07/11 Javascript
JS ES6多行字符串与连接字符串的表示方法
2017/04/26 Javascript
JS正则表达式常见用法实例详解
2018/06/19 Javascript
Layui给数据表格动态添加一行并跳转到添加行所在页的方法
2018/08/20 Javascript
jquery图片预览插件实现方法详解
2019/07/18 jQuery
vue 对axios get pust put delete封装的实例代码
2020/01/05 Javascript
JS实现碰撞检测效果
2020/03/12 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
2020/04/26 Javascript
Vue通过Blob对象实现导出Excel功能示例代码
2020/07/31 Javascript
探究Python多进程编程下线程之间变量的共享问题
2015/05/05 Python
详解django的serializer序列化model几种方法
2018/10/16 Python
Pandas中Series和DataFrame的索引实现
2019/06/27 Python
利用python实现逐步回归
2020/02/24 Python
python实现自动打卡的示例代码
2020/10/10 Python
CSS实现雨滴动画效果的实例代码
2019/10/08 HTML / CSS
《月光启蒙》教学反思
2014/03/01 职场文书
党课培训主持词
2014/04/01 职场文书
毕业设计说明书
2014/05/07 职场文书
2014班子成员自我剖析材料思想汇报
2014/10/01 职场文书
道德模范事迹材料
2014/12/20 职场文书
2016特色励志班级口号
2015/12/24 职场文书
初中体育课教学反思
2016/02/16 职场文书
导游词之西江千户苗寨
2019/12/24 职场文书
Pygame Rect区域位置的使用(图文)
2021/11/17 Python
以MySQL5.7为例了解一下执行计划
2022/04/13 MySQL
Mysql开启外网访问
2022/05/15 MySQL