import os
import sys
import time
import datetime
import winsound
import win32api
import win32serviceutil
import win32service
import win32event
import win32evtlogutil
import socket
import servicemanager
class MyService(win32serviceutil.ServiceFramework):
_svc_name_ = 'liuxs@上课提醒'
_svc_display_name_ = 'liuxs@上课和下课提醒软件'
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
self.is_running = True
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
self.is_running = False
def SvcDoRun(self):
win32evtlogutil.ReportEvent(
self._svc_name_,
servicemanager.PYS_SERVICE_STARTED,
0,
servicemanager.EVENTLOG_INFORMATION_TYPE,
(self._svc_name_, '')
)
self.main()
def main(self):
current_time = time.strftime("%H:%M")
while self.is_running:
if current_time == "09:00" or current_time == "10:00" or current_time == "11:00":
self.show_notification("上课提醒", "上课时间到了!")
self.play_sound()
self.remind()
elif current_time == "09:45" or current_time == "10:45" or current_time == "11:45":
# 下课时间
self.show_notification("下课时间", "现在是下课时间,请休息一下!")
self.play_sound()
self.remind()
time.sleep(60) # 每隔60秒检查一次
def show_notification(self, title, message):
win32api.MessageBox(0, message, title, 0x40)
def remind(self):
winsound.PlaySound('sound.wav', winsound.SND_FILENAME) # 播放声音文件
def play_sound(self):
frequency = 440
duration = 1000
winsound.Beep(frequency, duration)
if __name__ == '__main__':
if len(sys.argv) == 1:
servicename = os.path.splitext(os.path.basename(sys.argv[0]))[0]
servicename = servicename if len(servicename) <= 32 else servicename[:32]
servicename = f"{servicename}Service"
argv = [sys.argv[0], 'install', servicename, '--startup', 'auto']
win32serviceutil.HandleCommandLine(MyService, argv=argv)
else:
win32serviceutil.HandleCommandLine(MyService)
'''
python D:\python_bin\alarm\上课提醒.py install
python D:\python_bin\alarm\上课提醒.py start
'''
你可以将以上代码保存为一个Python脚本(例如上课提醒.py),然后通过以下命令来安装和启动服务:
python reminder.py install
python reminder.py start
这样,服务就会在Windows开机后自动启动,并每隔60秒检查一次时间,如果处于上述指定时间段,就会弹出上课提醒的弹窗和播放声音。
AttributeError: module 'servicemanager' has no attribute 'ServiceFramework'
这个错误是由于servicemanager
模块中确实没有ServiceFramework
属性引起的。为了解决这个问题,可以使用pywin32
库中的win32serviceutil
模块来替代servicemanager
模块。