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实现异步回调机制代码分享
Jan 10 Python
Python简单调用MySQL存储过程并获得返回值的方法
Jul 20 Python
Python文件夹与文件的相关操作(推荐)
Jul 25 Python
基于ID3决策树算法的实现(Python版)
May 31 Python
Python中optparser库用法实例详解
Jan 26 Python
Python中偏函数用法示例
Jun 07 Python
python实现多进程按序号批量修改文件名的方法示例
Dec 30 Python
python 使用elasticsearch 实现翻页的三种方式
Jul 31 Python
Python hashlib和hmac模块使用方法解析
Dec 08 Python
python实现简单文件读写函数
Feb 25 Python
python numpy中setdiff1d的用法说明
Apr 22 Python
python 实现两个变量值进行交换的n种操作
Jun 02 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
福利彩票幸运号码自动生成器
2006/10/09 PHP
基于php常用正则表达式的整理汇总
2013/06/08 PHP
解析PHP将对象转换成数组的方法(兼容多维数组类型)
2013/06/21 PHP
php+js实现异步图片上传实例分享
2014/06/02 PHP
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
thinkPHP下ueditor的使用方法详解
2015/12/26 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
input+select(multiple) 实现下拉框输入值
2009/05/21 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
nodejs批量修改文件编码格式
2015/01/22 NodeJs
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
js实现商城星星评分的效果
2015/12/29 Javascript
jQuery实现的兼容性浮动层示例
2016/08/02 Javascript
AngularJs表单验证实例代码解析
2016/11/29 Javascript
微信小程序 页面跳转如何实现传值
2017/04/05 Javascript
微信小程序实现滑动切换自定义页码的方法分析
2018/12/29 Javascript
jquery.pager.js分页实现详解
2019/07/29 jQuery
js实现日历
2020/11/07 Javascript
在Linux下调试Python代码的各种方法
2015/04/17 Python
Python基于sftp及rsa密匙实现远程拷贝文件的方法
2016/09/21 Python
Vue的el-scrollbar实现自定义滚动
2018/05/29 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
详解python中groupby函数通俗易懂
2020/05/14 Python
详解纯CSS3制作的20种loading动效
2017/07/05 HTML / CSS
html5读取本地文件示例代码
2014/04/22 HTML / CSS
全球领先的在线cosplay服装商店:RoleCosplay
2020/01/18 全球购物
几个Shell Script面试题
2014/04/18 面试题
幼儿园长自我鉴定
2013/10/17 职场文书
上班玩手机检讨书
2014/02/17 职场文书
毕业生求职信
2014/06/10 职场文书
运动会标语
2014/06/21 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
慰问信格式规范
2015/03/23 职场文书
辞职报告(范文三篇)
2019/08/27 职场文书
复制别人的成功真的会成功吗?
2019/10/17 职场文书
mysql 生成连续日期及变量赋值
2022/03/20 MySQL