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中使用mongoengine操作MongoDB教程
Apr 24 Python
Python基于回溯法子集树模板解决选排问题示例
Sep 07 Python
Python学习之Anaconda的使用与配置方法
Jan 04 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
Jun 14 Python
Python for循环与range函数的使用详解
Mar 23 Python
如何利用Pyecharts可视化微信好友
Jul 04 Python
简单了解python gevent 协程使用及作用
Jul 22 Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
Jul 02 Python
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
Jul 30 Python
社区版pycharm创建django项目的方法(pycharm的newproject左侧没有项目选项)
Sep 23 Python
如何设置PyCharm中的Python代码模版(推荐)
Nov 20 Python
Pytest之测试命名规则的使用
Apr 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
ThinkPHP控制器里javascript代码不能执行的解决方法
2014/11/22 PHP
php插入排序法实现数组排序实例
2015/02/16 PHP
1亿条数据如何分表100张到Mysql数据库中(PHP)
2015/07/29 PHP
详解php设置session(过期、失效、有效期)
2015/11/12 PHP
PHP完全二叉树定义与实现方法示例
2017/10/09 PHP
浅谈PHP5.6 与 PHP7.0 区别
2019/10/09 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
基于jquery的用鼠标画出可移动的div
2012/09/06 Javascript
js实现单行文本向上滚动效果实例代码
2013/11/28 Javascript
轻松创建nodejs服务器(7):阻塞操作的实现
2014/12/18 NodeJs
基于jQuery制作小图标上下滑动特效
2017/01/18 Javascript
Vue表单验证插件的制作过程
2017/04/01 Javascript
javascript 中关于array的常用方法详解
2017/05/05 Javascript
Node.js 使用命令行工具检查更新
2017/06/08 Javascript
使用classList来实现两个按钮样式的切换方法
2018/01/24 Javascript
ssm+vue前后端分离框架整合实现(附源码)
2020/07/08 Javascript
[04:50]DOTA2亚洲邀请赛小组赛第四日 TOP10精彩集锦
2015/02/02 DOTA
[01:34:42]NAVI vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[33:19]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第一场 11.26
2020/11/30 DOTA
python里对list中的整数求平均并排序
2014/09/12 Python
Python中的tuple元组详细介绍
2015/02/02 Python
python学习之第三方包安装方法(两种方法)
2015/07/30 Python
Python实现的批量修改文件后缀名操作示例
2018/12/07 Python
Python 按字典dict的键排序,并取出相应的键值放于list中的实例
2019/02/12 Python
Python编写打字训练小程序
2019/09/26 Python
HTML 5.1来了 9月份正式发布 更新内容预览
2016/04/26 HTML / CSS
春节联欢会主持词
2014/03/24 职场文书
工作说明书格式
2014/07/29 职场文书
大客户经理岗位职责
2015/04/09 职场文书
2015年车间安全管理工作总结
2015/05/13 职场文书
大学生暑期实践报告
2015/07/13 职场文书
运动会通讯稿100字
2015/07/20 职场文书
浅谈Python响应式类库RxPy
2021/06/14 Python
浅谈JavaScript作用域
2021/12/06 Javascript
Vue组件化(ref,props, mixin,.插件)详解
2022/05/15 Vue.js
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python