居家学习python自制闹铃小助手
生活随笔
收集整理的這篇文章主要介紹了
居家学习python自制闹铃小助手
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
鬧鈴小助手
為了建立學習的儀式感,我自己寫了一套程序,盡可能讓自己避免外界因素的干擾,以達到專注的目的。現在我把代碼寫到博客上,與大家一起分享一下。
注意:windows下使用playsound需要修改一下源碼,源碼有點小問題,文末有改后的源碼。
1.導入所需模塊
import sys import time import playsound as pl from multiprocessing import Process2.主函數,設置時間的安排,函數執行從上到下依次執行,這個需要自己定好這段時間自己打算做什么。
def main():work(minutes=20, todo='blog')work(minutes=30, todo='recite words')rest(minutes=10)work(minutes=60, todo='programming')例如上述代碼,寫blog20分鐘,背單詞30分鐘,休息10分鐘,編程60分鐘,以此類推。只要指定參數即可。
3.開始工作:使用時間進程和工作進程。
def work(minutes, todo):working = Process(target=startWorking, name=todo, args=(todo,))timing = Process(target=timePassing, args=(minutes,), name='timePassing')working.start()timing.start()timing.join()working.join()working.close()timing.close()4.開始休息:使用時間進程和休息進程。
def rest(minutes):timing = Process(target=timePassing, args=(minutes,), name='timePassing')resting = Process(target=startRest, name='startWorking')resting.start()timing.start()timing.join()resting.join()resting.close()timing.close()5.時間、工作、休息三個進程對應的函數:
def startWorking(todo):print('開始干活啦!!')print('todo:', todo)pl.playsound('piano.mp3') # 音樂響起def startRest():print('開始休息啦!!')pl.playsound('exercise.mp3') # 音樂響起def timePassing(minutes):print('=' * 20, '開始計時', '=' * 20)seconds = minutes * 60for i in range(round(seconds))[::-1]:time.sleep(1)sys.stdout.write(f'\r倒計時:{i // 60}分{i % 60}秒')sys.stdout.flush()print('\n' + '=' * 20, '計時結束', '=' * 20)播放的音樂可以自己指定哦。
這個是修改之后的playsound源碼,可以直接拷貝導入使用。
import logging logger = logging.getLogger(__name__)class PlaysoundException(Exception):passdef _canonicalizePath(path):"""Support passing in a pathlib.Path-like object by converting to str."""import sysif sys.version_info[0] >= 3:return str(path)else:# On earlier Python versions, str is a byte string, so attempting to# convert a unicode string to str will fail. Leave it alone in this case.return pathdef _playsoundWin(sound, block = True):'''Utilizes windll.winmm. Tested and known to work with MP3 and WAVE onWindows 7 with Python 2.7. Probably works with more file formats.Probably works on Windows XP thru Windows 10. Probably works with allversions of Python.Inspired by (but not copied from) Michael Gundlach <gundlach@gmail.com>'s mp3play:https://github.com/michaelgundlach/mp3playI never would have tried using windll.winmm without seeing his code.'''sound = _canonicalizePath(sound)if any((c in sound for c in ' "\'()')):from os import close, removefrom os.path import splitextfrom shutil import copyfrom tempfile import mkstempfd, tempPath = mkstemp(prefix = 'PS', suffix = splitext(sound)[1]) # Avoid generating files longer than 8.3 characters.logger.info('Made a temporary copy of {} at {} - use other filenames with only safe characters to avoid this.'.format(sound, tempPath))copy(sound, tempPath)close(fd) # mkstemp opens the file, but it must be closed before MCI can open it.try:_playsoundWin(tempPath, block)finally:remove(tempPath)returnfrom ctypes import c_buffer, windllfrom time import sleepdef winCommand(*command):bufLen = 600buf = c_buffer(bufLen)command = ' '.join(command)errorCode = int(windll.winmm.mciSendStringW(command, buf, bufLen - 1, 0)) # use widestring version of the functionif errorCode:errorBuffer = c_buffer(bufLen)windll.winmm.mciGetErrorStringW(errorCode, errorBuffer, bufLen - 1) # use widestring version of the functionexceptionMessage = ('\n Error ' + str(errorCode) + ' for command:''\n ' + command +'\n ' + errorBuffer.raw.decode('utf-16').rstrip('\0'))logger.error(exceptionMessage)raise PlaysoundException(exceptionMessage)return buf.valueif '\\' in sound:sound = '"' + sound + '"'try:logger.debug('Starting')winCommand(u'open {}'.format(sound))winCommand(u'play {}{}'.format(sound, ' wait' if block else ''))logger.debug('Returning')finally:try:winCommand(u'close {}'.format(sound))except PlaysoundException:logger.warning(u'Failed to close the file: {}'.format(sound))# If it fails, there's nothing more that can be done...passdef _handlePathOSX(sound):sound = _canonicalizePath(sound)if '://' not in sound:if not sound.startswith('/'):from os import getcwdsound = getcwd() + '/' + soundsound = 'file://' + soundtry:# Don't double-encode it.sound.encode('ascii')return sound.replace(' ', '%20')except UnicodeEncodeError:try:from urllib.parse import quote # Try the Python 3 import first...except ImportError:from urllib import quote # Try using the Python 2 import before giving up entirely...parts = sound.split('://', 1)return parts[0] + '://' + quote(parts[1].encode('utf-8')).replace(' ', '%20')def _playsoundOSX(sound, block = True):'''Utilizes AppKit.NSSound. Tested and known to work with MP3 and WAVE onOS X 10.11 with Python 2.7. Probably works with anything QuickTime supports.Probably works on OS X 10.5 and newer. Probably works with all versions ofPython.Inspired by (but not copied from) Aaron's Stack Overflow answer here:http://stackoverflow.com/a/34568298/901641I never would have tried using AppKit.NSSound without seeing his code.'''try:from AppKit import NSSoundexcept ImportError:logger.warning("playsound could not find a copy of AppKit - falling back to using macOS's system copy.")sys.path.append('/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC')from AppKit import NSSoundfrom Foundation import NSURLfrom time import sleepsound = _handlePathOSX(sound)url = NSURL.URLWithString_(sound)if not url:raise PlaysoundException('Cannot find a sound with filename: ' + sound)for i in range(5):nssound = NSSound.alloc().initWithContentsOfURL_byReference_(url, True)if nssound:breakelse:logger.debug('Failed to load sound, although url was good... ' + sound)else:raise PlaysoundException('Could not load sound with filename, although URL was good... ' + sound)nssound.play()if block:sleep(nssound.duration())def _playsoundNix(sound, block = True):"""Play a sound using GStreamer.Inspired by this:https://gstreamer.freedesktop.org/documentation/tutorials/playback/playbin-usage.html"""sound = _canonicalizePath(sound)# pathname2url escapes non-URL-safe charactersfrom os.path import abspath, existstry:from urllib.request import pathname2urlexcept ImportError:# python 2from urllib import pathname2urlimport gigi.require_version('Gst', '1.0')from gi.repository import GstGst.init(None)playbin = Gst.ElementFactory.make('playbin', 'playbin')if sound.startswith(('http://', 'https://')):playbin.props.uri = soundelse:path = abspath(sound)if not exists(path):raise PlaysoundException(u'File not found: {}'.format(path))playbin.props.uri = 'file://' + pathname2url(path)set_result = playbin.set_state(Gst.State.PLAYING)if set_result != Gst.StateChangeReturn.ASYNC:raise PlaysoundException("playbin.set_state returned " + repr(set_result))# FIXME: use some other bus method than poll() with block=False# https://lazka.github.io/pgi-docs/#Gst-1.0/classes/Bus.htmllogger.debug('Starting play')if block:bus = playbin.get_bus()try:bus.poll(Gst.MessageType.EOS, Gst.CLOCK_TIME_NONE)finally:playbin.set_state(Gst.State.NULL)logger.debug('Finishing play')def _playsoundAnotherPython(otherPython, sound, block = True, macOS = False):'''Mostly written so that when this is run on python3 on macOS, it can invokepython2 on macOS... but maybe this idea could be useful on linux, too.'''from inspect import getsourcefilefrom os.path import abspath, existsfrom subprocess import check_callfrom threading import Threadsound = _canonicalizePath(sound)class PropogatingThread(Thread):def run(self):self.exc = Nonetry:self.ret = self._target(*self._args, **self._kwargs)except BaseException as e:self.exc = edef join(self, timeout = None):super().join(timeout)if self.exc:raise self.excreturn self.ret# Check if the file exists...if not exists(abspath(sound)):raise PlaysoundException('Cannot find a sound with filename: ' + sound)playsoundPath = abspath(getsourcefile(lambda: 0))t = PropogatingThread(target = lambda: check_call([otherPython, playsoundPath, _handlePathOSX(sound) if macOS else sound]))t.start()if block:t.join()from platform import system system = system()if system == 'Windows':playsound = _playsoundWin elif system == 'Darwin':playsound = _playsoundOSXimport sysif sys.version_info[0] > 2:try:from AppKit import NSSoundexcept ImportError:logger.warning("playsound is relying on a python 2 subprocess. Please use `pip3 install PyObjC` if you want playsound to run more efficiently.")playsound = lambda sound, block = True: _playsoundAnotherPython('/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python', sound, block, macOS = True) else:playsound = _playsoundNixif __name__ != '__main__': # Ensure we don't infinitely recurse trying to get another python instance.try:import gigi.require_version('Gst', '1.0')from gi.repository import Gstexcept:logger.warning("playsound is relying on another python subprocess. Please use `pip install pygobject` if you want playsound to run more efficiently.")playsound = lambda sound, block = True: _playsoundAnotherPython('/usr/bin/python3', sound, block, macOS = False)del systemif __name__ == '__main__':# block is always True if you choose to run this from the command line.from sys import argvplaysound(argv[1])總結
以上是生活随笔為你收集整理的居家学习python自制闹铃小助手的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 测试面试题-如何测试朋友圈
- 下一篇: WSL2中 使用jupyter lab