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中实现字符串类型与字典类型相互转换的方法
Aug 18 Python
python利用正则表达式排除集合中字符的功能示例
Oct 10 Python
Python异常处理操作实例详解
Aug 28 Python
浅析python参数的知识点
Dec 10 Python
详解python编译器和解释器的区别
Jun 24 Python
python打包exe开机自动启动的实例(windows)
Jun 28 Python
python使用PIL和matplotlib获取图片像素点并合并解析
Sep 10 Python
selenium中get_cookies()和add_cookie()的用法详解
Jan 06 Python
python3 sorted 如何实现自定义排序标准
Mar 12 Python
Anaconda+Pycharm环境下的PyTorch配置方法
Mar 13 Python
使用已经得到的keras模型识别自己手写的数字方式
Jun 29 Python
解决pycharm下载库时出现Failed to install package的问题
Sep 04 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 magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
解决PHP在DOS命令行下却无法链接MySQL的技术笔记
2010/12/29 PHP
PHP提取字符串中的图片地址[正则表达式]
2011/11/12 PHP
php实现的二叉树遍历算法示例
2017/06/15 PHP
DB.ASP 用Javascript写ASP很灵活很好用很easy
2011/07/31 Javascript
jQuery 一个图片切换的插件
2011/10/09 Javascript
javascript操作html控件实例(javascript添加html)
2013/12/02 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
文本框倒叙输入让输入框的焦点始终在最开始的位置
2014/09/01 Javascript
简单谈谈javascript代码复用模式
2015/01/28 Javascript
js实现文本框选中的方法
2015/05/26 Javascript
在jQuery中处理XML数据的大致方法
2015/08/14 Javascript
JS 日期与时间戮相互转化的简单实例
2016/06/22 Javascript
Angular实现购物车计算示例代码
2017/02/21 Javascript
Javascript中click与blur事件的顺序详析
2017/04/25 Javascript
在vue中获取dom元素内容的方法
2017/07/10 Javascript
JavaScript实现购物车基本功能
2017/07/21 Javascript
javascript中UMD规范的代码推演
2018/08/29 Javascript
webpack4简单入门实例
2018/09/06 Javascript
JS闭包原理与应用经典示例
2018/12/20 Javascript
详解Vue webapp项目通过HBulider打包原生APP(vue+webpack+HBulider)
2019/02/02 Javascript
node.js基于socket.io快速实现一个实时通讯应用
2019/04/23 Javascript
前端js中的事件循环eventloop机制详解
2019/05/15 Javascript
浅谈Vue 函数式组件的使用技巧
2020/06/16 Javascript
[20:57]Ti4主赛事第三天开幕式
2014/07/21 DOTA
[01:11:27]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Optic
2018/04/03 DOTA
python算法表示概念扫盲教程
2017/04/13 Python
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
2019/04/01 Python
Django用户身份验证完成示例代码
2020/04/03 Python
PIP和conda 更换国内安装源的方法步骤
2020/09/21 Python
Pandas的数据过滤实现
2021/01/15 Python
IGK Hair官网:喷雾、洗发水、护发素等
2020/11/03 全球购物
质量月口号
2014/06/20 职场文书
学校领导班子成员查摆问题及整改措施
2014/10/28 职场文书
2016年党员学习廉政准则心得体会
2016/01/20 职场文书