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中的正则表达式的用法
Apr 09 Python
在Python中操作列表之list.extend()方法的使用
May 20 Python
python中itertools模块zip_longest函数详解
Jun 12 Python
python matlibplot绘制3D图形
Jul 02 Python
pycharm重置设置,恢复默认设置的方法
Oct 22 Python
python绘制散点图并标记序号的方法
Dec 11 Python
python实现连续图文识别
Dec 18 Python
python3+selenium实现126邮箱登陆并发送邮件功能
Jan 23 Python
浅谈Python的方法解析顺序(MRO)
Mar 05 Python
Django操作session 的方法
Mar 09 Python
Python如何在main中调用函数内的函数方式
Jun 01 Python
pycharm全局搜索的具体步骤
Jul 28 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/06/29 PHP
php多次include后导致全局变量global失效的解决方法
2015/02/28 PHP
PHP无限极分类函数的实现方法详解
2017/04/15 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
2017/05/26 PHP
HTML-CSS群中单选引发的“事件”
2007/03/05 Javascript
基于jquery跨浏览器显示的file上传控件
2011/10/24 Javascript
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
jquery设置元素的readonly和disabled的写法
2013/09/22 Javascript
JS父页面与子页面相互传值方法
2014/03/05 Javascript
vue中如何引入jQuery和Bootstrap
2017/04/10 jQuery
react router4+redux实现路由权限控制的方法
2018/05/03 Javascript
JS正则表达式封装与使用操作示例
2019/05/15 Javascript
JS异步处理的进化史深入讲解
2019/08/25 Javascript
vue中使用WX-JSSDK的两种方法(推荐)
2020/01/18 Javascript
Bootstrap告警框(alert)实现弹出效果和短暂显示后上浮消失的示例代码
2020/08/27 Javascript
使用Python的PEAK来适配协议的教程
2015/04/14 Python
使用Python3制作TCP端口扫描器
2017/04/17 Python
机器学习python实战之手写数字识别
2017/11/01 Python
详解Python安装scrapy的正确姿势
2018/06/26 Python
python实现Dijkstra静态寻路算法
2019/01/17 Python
Django 解决上传文件时,request.FILES为空的问题
2020/05/20 Python
python os.listdir()乱码解决方案
2021/01/31 Python
美国隐形眼镜零售商:LensPure
2019/03/10 全球购物
中兴通讯全球官方网站:ZTE
2020/12/26 全球购物
Linux中如何用命令创建目录
2015/01/12 面试题
大客户销售经理职责
2013/12/04 职场文书
大学学习个人的自我评价
2014/02/18 职场文书
家居装修公司创业计划书范文
2014/03/20 职场文书
保险公司开门红口号
2014/06/21 职场文书
房屋租赁合同解除协议书
2014/10/11 职场文书
学校运动会开幕词
2016/03/03 职场文书
担保书范文
2019/07/09 职场文书
人事行政部各岗位职责说明书!
2019/07/15 职场文书
Python机器学习之底层实现KNN
2021/06/20 Python
python入门学习关于for else的特殊特性讲解
2021/11/20 Python
pnpm对npm及yarn降维打击详解
2022/08/05 Javascript