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中的全局变量用法分析
Jun 09 Python
python装饰器与递归算法详解
Feb 18 Python
用python实现简单EXCEL数据统计的实例
Jan 24 Python
Python3处理HTTP请求的实例
May 10 Python
python获取url的返回信息方法
Dec 17 Python
学习python可以干什么
Feb 26 Python
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
Jun 19 Python
python二元表达式用法
Dec 04 Python
Python中如何将一个类方法变为多个方法
Dec 30 Python
python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)
Mar 18 Python
python requests模块的使用示例
Apr 07 Python
pytorch中的 .view()函数的用法介绍
Mar 17 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 文件夹删除、php清除缓存程序
2009/08/25 PHP
PHP sprintf()函数用例解析
2011/05/18 PHP
php各种编码集详解和以及在什么情况下进行使用
2011/09/11 PHP
编写兼容IE和FireFox的脚本
2009/05/18 Javascript
JavaScript弹簧振子超简洁版 完全符合能量守恒,胡克定理
2009/10/25 Javascript
javascript 得到变量类型的函数
2010/05/19 Javascript
jQuery Ajax方法调用 Asp.Net WebService 的详细实例代码
2011/04/27 Javascript
js中根据字数截取字符串,不能截断url
2012/01/12 Javascript
Javascript中3个需要注意的运算符
2015/04/02 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
2016/12/27 Javascript
详解vue-resource promise兼容性问题
2017/06/20 Javascript
Canvas放置反弹效果随机图形(实例)
2017/08/17 Javascript
Express使用html模板的详细代码
2017/09/18 Javascript
vue实现在表格里,取每行的id的方法
2018/03/09 Javascript
nodejs 日志模块winston的使用方法
2018/05/02 NodeJs
让Vue也可以使用Redux的方法
2018/05/23 Javascript
回顾Javascript React基础
2019/06/15 Javascript
微信小程序上传图片并等比列压缩到指定大小的实例代码
2019/10/24 Javascript
[14:50]2018DOTA2亚洲邀请赛开幕式
2018/04/03 DOTA
[57:53]Secret vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python中几种导入模块的方式总结
2017/04/27 Python
python 用lambda函数替换for循环的方法
2018/06/09 Python
Python实现某论坛自动签到功能
2019/08/20 Python
关于python中plt.hist参数的使用详解
2019/11/28 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
HTML5 新旧语法标记对我们有什么好处
2012/12/13 HTML / CSS
公司董事长职责
2013/12/12 职场文书
推荐信模板
2014/05/09 职场文书
应用外语系自荐信
2014/06/26 职场文书
合作协议书格式
2014/08/19 职场文书
党员三严三实对照检查材料
2014/10/13 职场文书
优秀团支部申报材料
2014/12/26 职场文书
环境建议书
2015/02/04 职场文书
2019年房屋委托租赁合同范本(通用版)!
2019/07/17 职场文书
SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例
2021/07/07 SQL Server