admin 管理员组

文章数量: 1184232

我的电脑有个顽疾:经常关机后会自动重启,带来很多不便。后来,我发现,自动重启的现象与电脑使用时间有关,只要不用太久,就不会有这个问题,所以,我就写了一个简单的 Python 脚本,来应付这个问题。源代码如下:

import wx
import time
import os
from queue import Queue
from threading import Thread
class Timer(object):
    def __init__(self, time, func):
        self.time = time
        self.func = func
        self.queue = Queue()
    
    def start(self):
        def f(queue: Queue):
            time.sleep(self.time)
            if queue.get():
                self.func()
        self.queue.put(True)
        th = Thread(target=f, args=(self.queue,))
        th.start()
    
    def stop(self):
        try:
            self.queue.get_nowait()
        except:
            return False
        else:
            self.queue.put(False)
            return True
class MyFrame(wx.Frame):
    def __init__(self, *args, **kw):
        super().__init__(*args, **kw)
        self.panel = wx.Panel(self)
        self.label = wx.StaticText(self.panel, label='即将在10秒后自动关机!')
        font = self.label.GetFont()
        font.SetPointSize(font.GetPointSize() + 4)
        self.label.SetFont(font)
        self.btn = wx.Button(self.panel, label='取消')
        self.btn.SetFont(font)
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        borderSize = 30
        self.sizer.Add(self.label, 1, wx.ALIGN_CENTER | wx.TOP | wx.LEFT | wx.RIGHT, borderSize)
        self.sizer.Add(self.btn, 3, wx.EXPAND | wx.ALL, borderSize)
        self.panel.SetSizer(self.sizer)
        self.Bind(wx.EVT_BUTTON, self.OnBtnClick, self.btn)
        self.Bind(wx.EVT_CLOSE, self.OnClose, self)
        self.timer = Timer(10, lambda : os.system('shutdown -s -t 0'))
        self.timer.start()
        self.sizer.Fit(self)
    
    def OnBtnClick(self, event):
        self.Close()
    
    def OnClose(self, event):
        self.timer.stop()
        event.Skip()
path = r'D:\Temp\time_record.txt'
f = open(path, 'r')
t = int(f.read())
f.close()
if time.time() - t < 150:
    app = wx.App()
    frame = MyFrame(None, title='自动关机')
    frame.Show()
    app.MainLoop()
while True:
    f = open(path, 'w')
    f.write(str(int(time.time())))
    f.close()
    time.sleep(1)

其原理十分简单:每隔1秒,就在一个文件里写入当前时间,这样,就能知道关机时,电脑的时间,第二次启动时,查看当前时间与上一次关机的时间,如果间隔小于一定值(这里我定为2分半),就自动关机。

保存时,要把脚本的后缀名改成 .pyw,这样就不会有控制台窗口,可以在后台静默运行。

最后就是要把这个脚本设置成开机启动,只需要把脚本放在"C:\Users\<你的用户名>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup"这个文件夹里,就可以了。

虽然这个方法很暴力,但是确实解决了问题。

本文标签: 从新手到 大神的进 编程