文章目录

  • 初衷
  • 设计
    • 1.实现锁屏
    • 2.实现计时秒表
    • 3.重新分析需求。
    • 4.输入时间
    • 5.集成测试
    • 6.打包成exe文件
  • debug和优化
    • exe循环锁屏
    • 占用资源优化
    • 最新代码
  • 闲谈
    • 锁屏木马

初衷

突发奇想写定时锁屏软件,是想限制连续专注时间,做到劳逸结合。最好是每45分钟休息一下,读篇文章/散个步/聊聊天。

操作系统Win10,
语言版本Python3.7.6
开发环境Pycharm

设计

1.实现锁屏

  代码:

# -*- coding: UTF-8 -*-
from ctypes import *user32 = windll.LoadLibrary('user32.dll')
user32.LockWorkStation()

  测试效果:运行.py文件,系统会直接进入锁屏状态,需要输入锁屏密码来解锁。

 参考:《用python写个一键锁屏的小脚本》,
地址https://editor.csdn.net/md/?articleId=112380986

2.实现计时秒表

要求:
  计时可见。
  通过GUI(图形用户界面)进行操作。

计算时间差:
  time.time()返回当前时间的时间戳。

tkinter库:
  tkinter是一个使用Python语言构建的GUI工具包。允许采用GUI的方式执行你的Python脚本。

英文教程地址:
  https://python-textbok.readthedocs.io/en/1.0/Introduction_to_GUI_Programming.html介绍的部分原文:

  事件的监听:Anything that happens in a user interface is an event.

  窗口的组件:GUI elements, such as buttons, menus and various kinds of entry fields and display areas.
  We call these elements widgets.

  窗口的树型结构:We are going to construct a tree of widgets for our GUI – each widget will have a parent widget, all the way up to the root window of our application.

Python中文版官方文档:

  tkinter教程地址,https://www.docs4dev.com/docs/zh/python/3.7.2rc1/all/library-tk.html。(感谢该项目的创建者和维护者)

(2)文档可以慢读,程序可以先写

  测试程序:

import tkinter
import timestar = time.time()def gettime():elap = time.time() - star  # 获取时间差hours = int(elap / 3600)minutes = int(elap / 60 - hours * 60.0)seconds = int(elap - minutes * 60.0)var.set('%02d:%02d:%02d' % (hours, minutes, seconds))root.after(1, gettime)  # 每隔1ms调用函数自身获取时间root = tkinter.Tk()
root.title('电子时钟')
var = tkinter.StringVar()
lb = tkinter.Label(root, textvariable=var, fg='orange', font=("微软雅黑", 100))  # 设置字体大小颜色
lb.pack()
gettime()
root.mainloop()

  测试效果:

  使用到的tkinter内容:

tk = tkinter.TK()   # 创建一个窗口的实例对象
tk.title()  # 设置窗口标题tkinter.Stringvar() # 窗口变量
lb = tkinter.Label(text="", fg="", bg="") # 窗口标签,包含窗口变量
lb.pack()   # 一种理解是绑定事件
tk.mainloop()   # 进入事件循环,保持监听事件

3.重新分析需求。

  实现了计时器、锁屏的基本功能,接下来重新分析需求。

分析需求:
  需要输入时间吗,或采用定长时间锁屏?定长。
突然想到输入时间,可以有包时的效果,更改需求为输入时间。
  需要暂停或终止计时吗?不需要。

4.输入时间

  测试代码:

def get_text():global setimesetime = int(entry1.get())root2.destroy()def time_set():global entry1, root2, setimeroot2 = tkinter.Tk()root2.title('设置时间')root2.geometry('300x300')lb = tkinter.Label(root2, text="输入锁屏Minutes:")lb.pack()entry1 = tkinter.Entry(root2)entry1.pack()anniu = tkinter.Button(root2, text='GO', command=get_text)anniu.pack()root2.mainloop()

  参考:《python:从输入框中读取》,地址https://blog.csdn.net/hzliyaya/article/details/9321493?utm_source=blogxgwz0

5.集成测试

  测试代码(较单元测试略有修改):

# -*- coding: UTF-8 -*-import tkinter
import time
from ctypes import *def gettime():elap = time.time() - star  # 获取时间差hours = int(elap / 3600)minutes = int(elap / 60 - hours * 60.0)seconds = int(elap - minutes * 60.0)var.set('%02d:%02d:%02d' % (hours, minutes, seconds))root.after(1, gettime)  # 每隔1ms调用函数自身获取时间if minutes > setime-1:user32 = windll.LoadLibrary('user32.dll')user32.LockWorkStation()exit(0)def timing():       # 计时器global root, var, starstar = time.time()root = tkinter.Tk()root.title('计时器')var = tkinter.StringVar()lb = tkinter.Label(root, textvariable=var, fg='orange', font=("微软雅黑", 100))  # 设置字体大小颜色lb.pack()gettime()root.mainloop()def get_text():global setimesetime = int(entry1.get())root2.destroy()def time_set():global entry1, root2, setimeroot2 = tkinter.Tk()root2.title('设置时间')root2.geometry('300x300')lb = tkinter.Label(root2, text="输入锁屏Minutes:")lb.pack()entry1 = tkinter.Entry(root2)entry1.pack()anniu = tkinter.Button(root2, text='GO', command=get_text)anniu.pack()root2.mainloop()if __name__ == '__main__':time_set()timing()

测试图:

   输入0会立即锁屏

   输入2则关闭第一个窗口,打开第二个窗口开始计时:

6.打包成exe文件

  命令行执行:pyinstaller -w lock.py
  在打包生成的dist目录中找到lock.exe,即为最终exe程序。
运行lock.exe,如图:

debug和优化

exe循环锁屏

遇到一个奇怪的情况,打包脚本生成的exe文件会循环锁屏。做了一个对比测试,如下图。

运行方式 输入时间 是否循环锁屏
直接运行py脚本 0 ×
直接运行py脚本 1 ×
直接运行py脚本 2 ×
运行exe文件 0 ×
运行exe文件 1

蛮难受的问题,临时/最终解决方式:直接运行py脚本。

占用资源优化

发现问题,是因为开启脚本电脑风扇就会启动,说明CPU利用率提高。

对比CPU利用率如下,观察进程发现CPU占用率在20%初头。

  • 开启py脚本前,CPU和磁盘文件利用率基本都在10%以内。

  • 开启py脚本后,CPU利用率在20%-30%

原因分析:root.after(1, gettime),每隔1ms都会获取一次时间。

解决方式:每隔1秒获取一次时间,也就是1000毫秒。
(一分钟获取一次,计时器看上去就不是实时的,体验不好)

root.after(1000, gettime)

效果:进程的CPU占用率在1%以内。

最新代码

# -*- coding: UTF-8 -*-import tkinter
import time
from ctypes import *def gettime():elap = time.time() - star  # 获取时间差hours = int(elap / 3600)minutes = int(elap / 60 - hours * 60.0)seconds = int(elap - minutes * 60.0)var.set('%02d:%02d:%02d' % (hours, minutes, seconds))root.after(1000, gettime)  # 每隔1ms调用函数自身获取时间if minutes > setime-1:user32 = windll.LoadLibrary('user32.dll')user32.LockWorkStation()exit(0)def timing():       # 计时器global root, var, starstar = time.time()root = tkinter.Tk()root.title('计时器')var = tkinter.StringVar()lb = tkinter.Label(root, textvariable=var, fg='orange', font=("微软雅黑", 100))  # 设置字体大小颜色lb.pack()gettime()root.mainloop()def get_text():global setimesetime = int(entry1.get())root2.destroy()def time_set():global entry1, root2, setimeroot2 = tkinter.Tk()root2.title('设置时间')root2.geometry('300x300')lb = tkinter.Label(root2, text="输入锁屏Minutes:")lb.pack()entry1 = tkinter.Entry(root2)entry1.pack()anniu = tkinter.Button(root2, text='GO', command=get_text)anniu.pack()root2.mainloop()if __name__ == '__main__':time_set()timing()

闲谈

锁屏木马

  编写锁屏程序的过程中,由于没有做好循环控制,碰到了0秒循环锁屏的情况。幸好CSDN会自动保存草稿,心态被救。

  循环锁屏的情况是通过重启电脑的手段解决的,如果把该锁屏程序设置为开机自启呢?联想冰河木马修改注册表、自启动的方式,以及最近的incaseformat蠕虫病毒,这个锁屏程序似乎也可以写成一个木马。

  想象锁屏木马的效果,开机即无限锁屏。
如果像冰河木马一样修改注册表,单纯删除文件是无法清除的。
可以通过U盘、网页flash等方式传播这个恶作剧小程序。

  最简单直接的解决方式,就是重装操作系统。

使用Python写一个定时锁屏软件相关推荐

  1. 用python写个一键锁屏的小脚本

    前言 如果电脑账户设置了密码,为了隐私,我们在暂时离开电脑时都会锁屏.  一般来讲,使用快捷键:屏幕键+L就可以了.但是,有时候你忘记了快捷键了怎么办?不想记快捷键怎么办?键盘坏掉了怎么办?现在我们就 ...

  2. 儿童玩耍电脑时间限制软件,定时锁屏软件,免费开源

    1. 背景与介绍 孩子一玩电脑就忘记时间,造成游戏过度,眼睛近视,故写了一个软件来限制儿童玩电脑时间(大人也可以用).功能有,设置允许玩耍开始时间和结束时间,允许玩耍时长等,到时间自动关机锁屏等. 2 ...

  3. 用python写一个windows下的定时关机脚本

    由于本人经常使用笔记本共享WiFi,但是又不想笔记本开机一夜(为了低碳环保嘛 ~_~!),所以每次都要用使用DOS命令关机,感觉好麻烦.正好最近在学习python,于是决定用python写一个定时关机 ...

  4. python定时开关机的代码_用python写一个windows下的定时关机脚本(推荐)

    由于本人经常使用笔记本共享WiFi,但是又不想笔记本开机一夜(为了低碳环保嘛 ~_~!),所以每次都要用使用DOS命令关机,感觉好麻烦.正好最近在学习Python,于是决定用python写一个定时关机 ...

  5. 帮我写个定时抢票软件

    您好!写一个定时抢票软件不是很难,你可以使用某些编程语言,如Python,来实现它.首先,您需要了解网站的API,以便您可以编写代码来抓取有关机票信息的数据.然后,您可以使用定时器功能,在特定的时间点 ...

  6. python软件界面-用Python写一个语音播放软件

    原标题:用Python写一个语音播放软件 单位经常使用广播进行临时事项的通知(将文字转换为语音然后通过功放广播),但是市面上多数语音播放软件都是收费的,要么发音失真,要么不够稳定--经常出现莫名其妙的 ...

  7. python编写一个软件-python写一个随机点名软件的实例

    最近有个随机点名软件的需求,故写了一个,上代码:github地址 # -*- coding: utf-8 -*- # @Time : 18-12-31 下午4:21 # @Author : Felix ...

  8. python写软件实例-python写一个随机点名软件的实例

    最近有个随机点名软件的需求,故写了一个,上代码:github地址 # -*- coding: utf-8 -*- # @Time : 18-12-31 下午4:21 # @Author : Felix ...

  9. python爬虫抢火车票_如何用python写一个简单的12306抢票软件|python 爬火车票 教程...

    python 如果抓取验证码图片 类似12306的登录验证码图片 这个以前做次.最大的麻烦是码的识别算法的识别率太低.12306那种网站登陆错3次就限制你20分钟.所以除非你有33%以上的识别率否则不 ...

  10. python软件代码示例-用Python写一个模拟qq聊天小程序的代码实例

    Python 超简单的聊天程序 客户端: import socket, sys host = '10.248.27.23' # host = raw_input("Plz imput des ...

最新文章

  1. 本地MySQL数据库要访问远程MySQL数据库的表中的数据的实现
  2. Spark2.2.0分布式集群安装(StandAlone模式)
  3. 学文科的优势_男生学文科,出路在哪里?带了十几年文科的班主任道出了实情...
  4. python代码大全下载-最全Python算法实现资源汇总!
  5. html 图片布局,CSS 布局图片
  6. 从原理上搞懂如何设置线程池参数大小?
  7. C语言实现lu分解lu decompose算法(附完整源码)
  8. 把Springboot项目部署到服务器上和结束运行
  9. 索引 mysql_深入理解MySQL索引
  10. 管道符、重定向、环境变量
  11. 比赛打分展示系统_《评委计分系统-双屏标准版》典型赛事案例图片展示-省直机关歌咏比赛
  12. FZU - 1601 - Alibaba's treasures
  13. 在线Excel:SpreadJS 15.0 中文版
  14. HashMap 的Value排序
  15. 3dmax2016卸载/安装失败/如何彻底卸载清除干净3dmax2016注册表和文件的方法
  16. PayPal个人账户不能提现了吗?怎么解决?
  17. OSChina 周二乱弹 —— 基于现代生物化学的长生不老药炼制教程
  18. 软件人员kpi制定模板_软件公司员工月度KPI考核表
  19. 开源数据库postgreSQL13在麒麟v10sp1源码安装
  20. 华为大数据云管理平台实测

热门文章

  1. SWF文件反编译调试记录
  2. unity相关的javascript脚本:unity圣典学习笔记————MonoBehaviour
  3. 树莓派PICO:DS1302时钟芯片(MicroPython)
  4. css权威指南 读书笔记
  5. 手机自动化测试的原理
  6. 常见设计稿字体对应字重font-weight大小
  7. mysql在命令行执行sql脚本
  8. python下载显示文件丢失_python27.dll是什么文件|python27.dll丢失修复下载32/64位
  9. 网络安全实验---PGP 实现邮件加密和签名
  10. 传输线模型(分布参数模型)