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翻译软件实现代码(使用google api完成)
Nov 26 Python
浅析python 内置字符串处理函数的使用方法
Jun 11 Python
Python中str.format()详解
Mar 12 Python
python实现周期方波信号频谱图
Jul 21 Python
Python 判断奇数偶数的方法
Dec 20 Python
Python Datetime模块和Calendar模块用法实例分析
Apr 15 Python
Python @property使用方法解析
Sep 17 Python
Python flask路由间传递变量实例详解
Jun 03 Python
Keras自定义实现带masking的meanpooling层方式
Jun 16 Python
python 通过 pybind11 使用Eigen加速代码的步骤
Dec 07 Python
python 第三方库paramiko的常用方式
Feb 20 Python
python反编译教程之2048小游戏实例
Mar 03 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
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
合并table相同单元格的jquery插件分享(很精简)
2011/06/20 Javascript
jQuery阻止同类型事件小结
2013/04/19 Javascript
HTML长文本截取含有HTML代码同样适用的两种方法
2013/07/31 Javascript
JavaScript中对象属性的添加和删除示例
2014/05/12 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
JQuery中的事件及动画用法实例
2015/01/26 Javascript
jQuery实现延迟跳转的方法
2015/06/05 Javascript
jQuery实现点击按钮弹出可关闭层的浮动层插件
2015/09/19 Javascript
javascript给span标签赋值的方法
2015/11/26 Javascript
基于javascript实现文字无缝滚动效果
2016/03/22 Javascript
JS数组去重(4种方法)
2017/03/27 Javascript
js实现微信/QQ直接跳转到支付宝APP打开口令领红包功能
2018/01/09 Javascript
vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单
2018/09/14 Javascript
如何制作一个Node命令行图像识别工具
2018/12/12 Javascript
详解element-ui中el-select的默认选择项问题
2019/08/02 Javascript
JS内置对象和Math对象知识点详解
2020/04/03 Javascript
Javascript如何实现扩充基本类型
2020/08/26 Javascript
javascript实现放大镜功能
2020/12/09 Javascript
从源码角度来回答keep-alive组件的缓存原理
2021/01/18 Javascript
[27:02]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第三场
2014/05/24 DOTA
[00:52]黑暗之门更新 新英雄孽主驾临DOTA2
2016/08/24 DOTA
使用Python设计一个代码统计工具
2018/04/04 Python
tensorflow tf.train.batch之数据批量读取方式
2020/01/20 Python
如何用css3实现switch组件开关的方法
2018/02/09 HTML / CSS
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
Spartoo瑞典:鞋子、包包和衣服
2018/09/15 全球购物
以思科路由器为例你写下单臂路由的配置命令
2013/08/03 面试题
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
2014年元旦联欢会活动策划方案
2014/02/16 职场文书
幼儿园六一活动总结
2014/08/27 职场文书
2016年“我们的节日·中秋节”活动总结
2016/04/05 职场文书
关于springboot配置druid数据源不生效问题(踩坑记)
2021/09/25 Java/Android
zabbix自定义监控nginx状态实现过程
2021/11/01 Servers
【海涛dota解说】一房久违的影魔魂守二连发
2022/04/01 DOTA
关于JS中的作用域中的问题思考分享
2022/04/06 Javascript