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中的fabs()方法的使用
May 14 Python
python检查字符串是否是正确ISBN的方法
Jul 11 Python
使用Python编写一个最基础的代码解释器的要点解析
Jul 12 Python
python通过tcp发送xml报文的方法
Dec 28 Python
Python File(文件) 方法整理
Feb 18 Python
Python的条件锁与事件共享详解
Sep 12 Python
python能否java成为主流语言吗
Jun 22 Python
零基础学Python之前需要学c语言吗
Jul 21 Python
Python unittest生成测试报告过程解析
Sep 08 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
Nov 13 Python
Python datetime模块的使用示例
Feb 02 Python
Python数组变形的几种实现方法
May 30 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 mkdir()定义和用法
2009/01/14 PHP
php中static静态变量的使用方法详解
2010/06/04 PHP
PHP MemCached高级缓存配置图文教程
2010/08/05 PHP
那些年一起学习的PHP(一)
2012/03/21 PHP
destoon之一键登录设置
2014/06/21 PHP
PHP把数字转成人民币大写的函数分享
2014/06/30 PHP
php中Array2xml类实现数组转化成XML实例
2014/12/08 PHP
php创建无限级树型菜单
2015/11/05 PHP
yii2分页之实现跳转到具体某页的实例代码
2016/06/02 PHP
PHP使用phpunit进行单元测试示例
2019/09/23 PHP
实现超用户体验 table排序javascript实现代码
2009/06/22 Javascript
JavaScript Event学习第七章 事件属性
2010/02/07 Javascript
JQuery操作Select的Options的Bug(IE8兼容性视图模式)
2013/04/21 Javascript
JavaScript实现维吉尼亚(Vigenere)密码算法实例
2013/11/22 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
2014/02/19 Javascript
jquery删除数据记录时的弹出提示效果
2014/05/06 Javascript
jQuery中slideUp()方法用法分析
2014/12/24 Javascript
深入探寻javascript定时器
2015/01/02 Javascript
node模块机制与异步处理详解
2016/03/13 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
2017/01/04 Javascript
vue2.0s中eventBus实现兄弟组件通信的示例代码
2017/10/25 Javascript
vue实现的仿淘宝购物车功能详解
2019/01/27 Javascript
微信小程序 setData 对 data数据影响问题
2019/04/18 Javascript
python 正则表达式 概述及常用字符
2009/05/04 Python
浅析Python中的多进程与多线程的使用
2015/04/07 Python
python实现用于测试网站访问速率的方法
2015/05/26 Python
对Python的zip函数妙用,旋转矩阵详解
2018/12/13 Python
在Django model中设置多个字段联合唯一约束的实例
2019/07/17 Python
python中常见错误及解决方法
2020/06/21 Python
详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据
2020/12/13 Python
iframe与window.onload如何使用详解
2020/05/07 HTML / CSS
Too Faced官网:美国知名彩妆品牌
2017/03/07 全球购物
高中美术教学反思
2014/01/19 职场文书
表决心的诗句大全
2014/03/11 职场文书
Java获取e.printStackTrace()打印的信息方式
2021/08/07 Java/Android
JavaScript原型链中函数和对象的理解
2022/06/16 Javascript