想好了吗?

背景

如今,我们日常生活中对电子产品的依赖越来越大。面对互联网上及电子产品本身的种种诱惑,我们有时会不知不觉地陷入其中,无法自拔。当自己突然意识到整天都在玩手机或电脑时,恐怕为时已晚。

为了保持眼睛健康,我写出了这款程序来约束自己。通过限制(根据用户具体需要)使用电脑的时间,可以减少对电脑的过度依赖,这样就有更多的时间来做其它有意义的事了!

简介

被打开后,一个窗口呈现在你眼前。你需要做的事情有两件:我要用电脑做什么呢?我要用多久呢?然后分别填到两个输入框里,就可以点击「确认」键了。这个时候,程序会自动将你输入的内容写入文档里(.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

  1. 新增功能:「立即关机」,并且会将实际的关机时间记录下来
  2. 文件将保存在 C:\Users\(User name)\文档\电脑使用情况
  3. 文件头行会有版本标识:Version: XXX,方便后续版本升级兼容等
  4. 在「关于」界面里提供了我的网站(下个版本整上超链接吧)

修复的 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值