python tkinter库实现气泡屏保和锁屏


Posted in Python onJuly 29, 2019

本文实例为大家分享了python tkinter库实现气泡屏保和锁屏的具体代码,供大家参考,具体内容如下

显示效果如下:

python tkinter库实现气泡屏保和锁屏

代码: 

import random
import tkinter
import threading
from ctypes import *
 
 
class RandomBall(object):
 """
 定义关于球的类
 """
 def __init__(self, canvas, screen_width, screen_height):
  """初始化画布和屏幕尺寸"""
  self.item = None
  self.canvas = canvas
  # 定义球的初始位置(x,y),此坐标为球的圆心,位置随机生成
  self.x_pos = random.randint(10, int(screen_width) - 20)
  self.y_pos = random.randint(10, int(screen_height) - 20)
  # 定义球在x、y方向上的移动速度,速度随机给定
  self.x_velocity = random.randint(6, 12)
  self.y_velocity = random.randint(6, 12)
  # 将屏幕尺寸的形参赋给函数内部
  self.screen_width = screen_width
  self.screen_height = screen_height
  # 定义球的半径,半径大小随机给定
  self.radius = random.randint(40, 70)
  # 定义球的颜色
  c = lambda: random.randint(0, 255)
  self.color = '#%02x%02x%02x' % (c(), c(), c())
 
 def create_ball(self):
  """ 创建球的函数"""
  # 通过圆心,获取一矩形左上角和右下角的坐标
  x1 = self.x_pos - self.radius
  y1 = self.y_pos - self.radius
  x2 = self.x_pos + self.radius
  y2 = self.y_pos + self.radius
  # tkinter没有创建圆的函数,通过创建椭圆的方式来生成圆
  self.item = self.canvas.create_oval(x1, y1, x2, y2, fill=self.color, outline=self.color)
 
 def move_ball(self):
  """创建球移动的函数"""
  # 球的(x,y)坐标根据速度变化不断更新
  self.x_pos += self.x_velocity
  self.y_pos += self.y_velocity
  # 当球撞到屏幕边界后,反弹的算法判断
  if self.x_pos + self.radius >= self.screen_width:
   self.x_velocity = -self.x_velocity
  if self.x_pos - self.radius <= 0:
   self.x_velocity = -self.x_velocity
  if self.y_pos + self.radius >= self.screen_height:
   self.y_velocity = -self.y_velocity
  if self.y_pos - self.radius <= 0:
   self.y_velocity = -self.y_velocity
  # 在画布上移动图画
  self.canvas.move(self.item, self.x_velocity, self.y_velocity)
 
 
class ScreenSaver(object):
 """
 定义屏保的类
 """
 def __init__(self):
  self.balls = []
  # 每次启动程序,球的数量随机
  self.num_balls = random.randint(20, 60)
  # 生成root主窗口
  self.root = tkinter.Tk()
  # 获取屏幕尺寸,作为主窗口尺寸
  self.width = self.root.winfo_screenwidth()
  self.height = self.root.winfo_screenheight()
  # 取消边框
  self.root.overrideredirect(1)
  # 调整背景透明度
  self.root.attributes('-alpha', 1)
  # 点击鼠标、移动鼠标、敲击键盘时退出程序
  # self.root.bind('<Motion>', self.my_quit)
  # self.root.bind('<Any-Button>', self.my_quit)
  self.root.bind('<Control-Shift-KeyPress-L>', self.my_quit)
  # 创建画布,包括画布的归属、尺寸和背景颜色
  self.canvas = tkinter.Canvas(self.root, width=self.width, height=self.height, bg="black")
  self.canvas.pack()
 
  # 根据num_balls随机生成的数值,在画布上生成球
  for i in range(self.num_balls):
   # 调用RandomBall函数,自动初始化出不同大小、位置和颜色的球
   ball = RandomBall(self.canvas, screen_width=self.width, screen_height=self.height)
   # 调用生成球的函数
   ball.create_ball()
   self.balls.append(ball)
  self.run_screen_saver()
  self.root.mainloop()
 
 def run_screen_saver(self):
  """调动球运动的函数"""
  for ball in self.balls:
   ball.move_ball()
  # after函数是每200毫秒后启动一个函数,第二个参数为需启动的函数,类似于递归
  self.canvas.after(50, self.run_screen_saver)
 
 def my_quit(self, event):
  """定义一个停止运行的函数"""
  self.root.destroy()
  print(event)
 
 
class LockScreen(object):
 """定义锁屏的类"""
 def __init__(self):
  self.HWND_BROADCAST = 0xffff
  self.WM_SYS_COMMAND = 0x0112
  self.SC_MONITOR_POWER = 0xF170
  self.MonitorPowerOff = 2
  self.SW_SHOW = 5
 
 def win_dll(self):
  """调用windll函数"""
  windll.user32.PostMessageW(self.HWND_BROADCAST, self.WM_SYS_COMMAND,
         self.SC_MONITOR_POWER, self.MonitorPowerOff)
  shell32 = windll.LoadLibrary("shell32.dll")
  shell32.ShellExecuteW(None, 'open', 'rundll32.exe',
        'USER32,LockWorkStation', '', self.SW_SHOW)
 
 
if __name__ == '__main__':
 ScreenSaver()
 t = threading.Thread(target=LockScreen().win_dll())
 t.start()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中for循环控制语句用法实例
Jun 02 Python
Python 递归函数详解及实例
Dec 27 Python
深入理解Python对Json的解析
Feb 14 Python
python使用arcpy.mapping模块批量出图
Mar 06 Python
pygame实现弹力球及其变速效果
Jul 03 Python
wxPython的安装图文教程(Windows)
Dec 28 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
Oct 29 Python
用python标准库difflib比较两份文件的异同详解
Nov 16 Python
Python3按一定数据位数格式处理bin文件的方法
Jan 24 Python
Python pandas RFM模型应用实例详解
Nov 20 Python
Python脚本去除文件的只读性操作
Mar 05 Python
pandas数值排序的实现实例
Jul 25 Python
django迁移数据库错误问题解决
Jul 29 #Python
python实现桌面托盘气泡提示
Jul 29 #Python
python实现桌面气泡提示功能
Jul 29 #Python
pycharm设置鼠标悬停查看方法设置
Jul 29 #Python
django rest framework vue 实现用户登录详解
Jul 29 #Python
python实现倒计时小工具
Jul 29 #Python
django rest framework 实现用户登录认证详解
Jul 29 #Python
You might like
PHP 加密与解密的斗争
2009/04/17 PHP
ThinkPHP CURD方法之data方法详解
2014/06/18 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
JavaScript 字符串乘法
2009/08/20 Javascript
JS编程小常识很有用
2012/11/26 Javascript
js获得地址栏?问号后参数的方法
2013/08/08 Javascript
使用jQuery仿苹果官网焦点图特效
2014/12/23 Javascript
JavaScript中的null和undefined区别介绍
2015/01/01 Javascript
Node.js抓取中文网页乱码问题和解决方法
2015/02/10 Javascript
jQuery实现不断闪烁文字的方法
2015/05/15 Javascript
简述JavaScript对传统文档对象模型的支持
2015/06/16 Javascript
MVC Ajax Helper或Jquery异步加载部分视图
2015/11/29 Javascript
Angular.js如何从PHP读取后台数据
2016/03/24 Javascript
微信+angularJS的SPA应用中用router进行页面跳转,jssdk校验失败问题解决
2016/09/09 Javascript
jQuery web 组件 后台日历价格、库存设置的代码
2016/10/14 Javascript
JavaScript实现三级联动菜单效果
2017/08/16 Javascript
vue 移动端适配方案详解
2018/11/15 Javascript
微信小程序 轮播图实现原理及优化详解
2019/09/29 Javascript
vue-cli和v-charts实现可视化图表过程解析
2019/10/08 Javascript
浅谈如何优雅处理JavaScript异步错误
2019/11/12 Javascript
[12:29]2018国际邀请赛 开幕秀
2018/08/22 DOTA
[33:09]完美世界DOTA2联赛循环赛 Forest vs DM BO2第二场 10.29
2020/10/29 DOTA
Python进程间通信用法实例
2015/06/04 Python
Python实现快速多线程ping的方法
2015/07/15 Python
Python实现二叉搜索树
2016/02/03 Python
Django ORM框架的定时任务如何使用详解
2017/10/19 Python
Python从单元素字典中获取key和value的实例
2018/12/31 Python
Python测试框架:pytest学习笔记
2020/10/20 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
2020/10/22 Python
python boto和boto3操作bucket的示例
2020/10/30 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
2021/03/04 Python
《最可爱的人》教学反思
2014/02/14 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
承诺书模板大全
2015/05/04 职场文书
圆明园观后感
2015/06/03 职场文书
gojs实现蚂蚁线动画效果
2022/02/18 Javascript