当前位置:网站首页>想好了吗?
想好了吗?
2022-08-04 05:24:00 【黎明前的霓虹】
背景
如今,我们日常生活中对电子产品的依赖越来越大。面对互联网上及电子产品本身的种种诱惑,我们有时会不知不觉地陷入其中,无法自拔。当自己突然意识到整天都在玩手机或电脑时,恐怕为时已晚。
为了保持眼睛健康,我写出了这款程序来约束自己。通过限制(根据用户具体需要)使用电脑的时间,可以减少对电脑的过度依赖,这样就有更多的时间来做其它有意义的事了!
简介
被打开后,一个窗口呈现在你眼前。你需要做的事情有两件:我要用电脑做什么呢?我要用多久呢?然后分别填到两个输入框里,就可以点击「确认」键了。这个时候,程序会自动将你输入的内容写入文档里(.usage,用普通记事本就可以打开),以便后面查询。你输入的「要使用的时间」(第二个输入框里的数字)将会成为电脑关机的倒计时,所以所你计划使用多长时间的电脑,它就真的给你兑现。
但是突然想反悔了怎么办呢?没关系,只需要再点开程序(关了的情况下),点击「取消关机」就行啦!
但是,如果你已经点过了「确定」却再次点击的话,程序就会提示你不能这样做哟!同理,取消关机也是一样的。(没都没有关机任务怎么能取消关机呢??)
当你提前完成了任务,准备关机时,只需要再进入程序,点击「立即关机」就可以关机了!
待能力提升后,会加入更多的功能的!敬请期待!
具体用法
方法一:直接下载程序
首先下载我提供的下载链接下载程序,杀毒软件可能会报错,不理它。然后将这个程序放进系统的启动目录C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp里,大功告成!
方法二:自编译程序
首先将我的源码复制到 .py 文件里面来。然后 pip install pyinstaller。找一个全英文的文件夹
(最好是,否则很可能会报错),文件也改成全英文的。在这个文件夹内 右击+右键,点击「在此处打开 Powershell 窗口」(也可以是 命令行窗口),输入pyinstaller -F -w (file_name)[-i name_of_icon](pyinstaller -F -w 文件的全称,后面那个是加图标,注意只能是 16×16 的尺寸!)
之后会说Building EXE from EXE-00.toc completed successfully.后打开文件夹内的 dist 文件夹,这就是打包后的程序啦!后面的操作参照方法一的后半段。
这里只提供简单的步骤,可能还会遇上各种各样的问题。请自行百度。
截图
这个版本因为时间原因,暂时没有截图。
彩蛋(菜单)
悄悄告诉你,轻轻点一下菜单栏上的 about 有惊喜哟!
源码
import os
import getpass
import datetime
import tkinter as tk
from tkinter import messagebox
dir_name = "C:\\Users\\" + getpass.getuser() + "\\Documents\\电脑使用情况"
date = datetime.datetime.now().strftime("%Y-%m-%d")
def tip(a, b):
"""判断"""
if a and b:
try:
mins = int(b)
return mins
except:
messagebox.showwarning("警告", "请在第二个框内输入有效的值!")
return False
else:
messagebox.showwarning("警告", "请输入有效的值!")
return False
def write_data(started_time, thing, minute):
"""写入文件数据 started_time: 点击「确定」时的时间,thing: 第一个输入框, minute: 第二个输入框"""
''' 写入数据 '''
global date, dir_name
is_exists = os.path.exists(dir_name)
if not is_exists:
os.makedirs(dir_name)
file = open(dir_name + "\\" + date + ".usage", "w", encoding="utf-8")
file.write("Version: 1.2.0_release\n")
file.write("开始使用时间: " + started_time + "\n")
file.write("将要做的事情: " + thing + "\n")
file.write("计划时间: " + str(minute))
file.close()
def get_info():
"""开机时程序功能 There isn't any arguments that need to be brought into this func."""
thing = en_gonna_do.get()
y = en_anticipated_time.get()
minute = tip(thing, y)
if not minute:
return
started_time = datetime.datetime.now()
end_time = (started_time + datetime.timedelta(minutes =
minute)).strftime("%H:%M")
situ = os.system("shutdown -s -t {}".format(str(minute * 60)))
if situ != 0:
messagebox.showerror("提示", "当前已有关机的计划。请勿重复!")
return
messagebox.showinfo("提示", "将于 {} 关闭计算机".format(end_time))
write_data(started_time.strftime("%H:%M"), thing, minute)
def shutdown_now(wd_root):
"""立即关机,实际关机时间将会被写入文档 传一个 Tk 类的主窗口进来即可"""
global date, dir_name
result1 = messagebox.askokcancel("立即关机",
"未保存的工作将不会被还原。你确定要立即关机?")
if result1 == True:
stopped_time = datetime.datetime.now().strftime("%H:%M")
file = open(dir_name + "\\" + date + ".usage", "a", encoding="utf-8")
file.write("\n\n实际关机时间: " + stopped_time)
file.close()
wd_root.destroy()
os.system("shutdown -s -t 100")
def about():
"""关于程序的窗口 There isn't any arguments that need to be brought into this func."""
wd_about = tk.Tk()
wd_about.title("想好了吗?")
wd_about.geometry("450x260")
tk.Label(wd_about, width = 100, font = ("黑体", 40),
text = "想好了吗?").pack(pady = 10)
tk.Label(wd_about, font = ("Times New Roman", 15),
width = 100, text = "\nRegistered to DawnNeon")
tk.Label(wd_about, font = ("Times New Roman", 15),
text = "Copyright 2020-2021 Little Window Ltd.").pack()
tk.Label(wd_about, font = ("Times New Roman", 15),
text = "Version Release 1.2.0, August 24 2021").pack()
tk.Label(wd_about, font = ("Times New Roman", 13),
wraplength = 400, text = "From the bottom of my heart, \
I thank all those who gives me much help like the brightest stars \
even in the darkest time!").pack()
tk.Label(wd_about, text = "Website & Support: \
https://www.cnblogs.com/DawnNeon/\nhttps://blog.csdn.net/Dawn_Neon").pack()
wd_about.mainloop()
'''欲查看更新内容,请关注我哟!'''
def exit_prog(wd_root):
"""用户确认是否退出程序 传一个 Tk 类的主窗口进来即可"""
result2 = messagebox.askokcancel("退出程序", "你确定要退出程序?")
if result2 == True:
wd_root.destroy()
def cancel_shutdown():
"""取消关机 There isn't any arguments that need to be brought into this func."""
result = messagebox.askokcancel("确认", "你确定要取消关闭计算机吗?")
if result:
situ2 = os.system("shutdown -a")
if situ2 != 0:
messagebox.showerror("提示", "当前没有任何进行中的关机过程!")
return
wd_root = tk.Tk()
wd_root.title("想好了吗")
wd_root.resizable(False, False)
tk.Label(wd_root, text = "1. 我要用电脑做什么?",
font = ("黑体", 30)).grid(column = 1, row = 1,
pady = 10, padx = 10, sticky = "w", columnspan = 2)
en_gonna_do = tk.Entry(wd_root, font = ("微软雅黑", 20),
justify = "left", relief = "groove", width = 37)
en_gonna_do.grid(column = 1, row = 2, sticky = "w",
pady = 10, padx = 48, columnspan = 2)
tk.Label(wd_root, text = "2. 我要用多长时间?(单位:分钟)",
font = ("黑体", 30)).grid(column = 1, row = 3, pady = 10, padx = 10,
sticky = "w", columnspan = 2)
en_anticipated_time = tk.Entry(wd_root, font = ("微软雅黑", 20),
justify = "left", relief = "groove", width = 37)
en_anticipated_time.grid(column = 1, row = 4, sticky = "w",
pady = 10, padx = 48, columnspan = 2)
tk.Button(wd_root, text = "确认", font = ("宋体", 30), width = 15,
relief = "groove", command = get_info).grid(column = 1,
row = 5, padx = 10, pady = 10)
tk.Button(wd_root, text = "取消关机", font = ("宋体", 30), width = 15,
relief = "groove", command = cancel_shutdown).grid(column = 2, row = 5,
padx = 10, pady = 10)
tk.Button(wd_root, text = "立即关机", font = ("宋体", 20), width = 30,
relief = "groove", command = lambda:shutdown_now(wd_root)).grid(column = 1, row = 6,
padx = 10, pady = 10, columnspan = 2)
tk.Button(wd_root, text = "退出程序", font = ("宋体", 20), width = 30,
relief = "groove", command = lambda:exit_prog(wd_root)).grid(column = 1, row = 7,
padx = 10, pady = 10, columnspan = 2)
menubar = tk.Menu(wd_root)
mu_others = tk.Menu(menubar, tearoff = False)
menubar.add_cascade(label = "其它", menu = mu_others)
mu_others.add_command(label = "关于", command = about)
wd_root.config(menu = menubar)
wd_root.mainloop()
2021年8月20日更新 · Release 1.1.0
- 现在写入的文件会保存在一个叫做 Computer usage 的文件夹里面了
2021年8月24日更新 · Release 1.2.0
- 新增功能:「立即关机」,并且会将实际的关机时间记录下来
- 文件将保存在
C:\Users\(User name)\文档\电脑使用情况 - 文件头行会有版本标识:Version: XXX,方便后续版本升级兼容等
- 在「关于」界面里提供了我的网站(下个版本整上超链接吧)
修复的 Bug:
- 把打包后的程序放在启动目录
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp下,每次启动后输入相关内容点确定,将不会有任何反应。原因是因为没有管理员权限(我还使劲钻研呢,后来发现没有那个必要)
未修复的 Bug
- 打包后,每次点击「确定」或「取消关机」后,都会出现控制台窗口且一闪而过(我是用 pyinstaller -F -w .py 来打包的啊,途中出过很多次错)。希望有大佬提出宝贵建议!
写在最后
说实话,这可能是我写的最后一个程序了。暑假里因为写程序耽误了太多时间和精力,甚至被父母骂哭过!那是因为我没有搞清楚主次啊。所以为了纪念我的编程「生涯」(只有两年有余)——一年学了一阵 C++ 的算法,可是都已经忘得差不多了。然后又转来学 Python。虽然对算法及面向对象的思想一概不知(所以我写 Tkinter GUI 都不会用封装之类的 class),但我依然愿意接受新知识。我即将迈进初中的第二个年头,也祝我学业「顺利」(会吗?)!
作者:DawnNeon
若要转载请标明出处:https://blog.csdn.net/Dawn_Neon/article/details/119888595
边栏推荐
- Typora 使用保姆级教程 | 看这一篇就够了 | 历史版本已被禁用
- 代码重构:面向单元测试
- Can‘t connect to MySQL server on ‘localhost3306‘ (10061) 简洁明了的解决方法
- npm安装依赖报错npm ERR! code ENOTFOUNDnpm ERR! syscall getaddrinfonpm ERR! errno ENOTFOUND
- el-Select 选择器 底部固定
- 力扣:70. 爬楼梯
- 震惊,99.9% 的同学没有真正理解字符串的不可变性
- 读者让我总结一波 redis 面试题,现在肝出来了
- leetcode 12. 整数转罗马数字
- Uni-app 小程序 App 的广告变现之路:全屏视频广告
猜你喜欢
![[One step in place] Jenkins installation, deployment, startup (complete tutorial)](/img/f2/15fb546eb864d7ff40b5507d5c7aa5.png)
[One step in place] Jenkins installation, deployment, startup (complete tutorial)

高性能高可靠性高扩展性分布式防火墙架构

部署LVS-DR群集【实验】

【一步到位】Jenkins的安装、部署、启动(完整教程)

Performance testing with Loadrunner

DP4398:国产兼容替代CS4398立体声24位/192kHz音频解码芯片

MySQL log articles, binlog log of MySQL log, detailed explanation of binlog log

【评价类模型】Topsis法(优劣解距离法)

sql server如何得到本条记录与上一条记录的差异,即变动值

Programming hodgepodge (4)
随机推荐
8.03 Day34---BaseMapper查询语句用法
【一步到位】Jenkins的安装、部署、启动(完整教程)
MySQL日志篇,MySQL日志之binlog日志,binlog日志详解
想低成本保障软件安全?5大安全任务值得考虑
What are the functions of mall App development?
How to view sql execution plan offline collection
npm安装依赖报错npm ERR! code ENOTFOUNDnpm ERR! syscall getaddrinfonpm ERR! errno ENOTFOUND
8.03 Day34---BaseMapper query statement usage
The symbol table
力扣:509. 斐波那契数
Can 't connect to MySQL server on' localhost3306 '(10061) simple solutions
如何将 DevSecOps 引入企业?
4.2 声明式事务概念
The idea setting recognizes the .sql file type and other file types
败给“MySQL”的第60天,我重振旗鼓,四面拿下蚂蚁金服offer
9. Dynamic SQL
MySql数据恢复方法个人总结
Landing, the IFC, GFC, FFC concept, layout rules, forming method, use is analysed
有趣的 Kotlin 0x0E:DeepRecursiveFunction
【评价类模型】Topsis法(优劣解距离法)