居家学习python自制闹铃小助手
生活随笔
收集整理的這篇文章主要介紹了
居家学习python自制闹铃小助手
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
鬧鈴小助手
為了建立學(xué)習(xí)的儀式感,我自己寫(xiě)了一套程序,盡可能讓自己避免外界因素的干擾,以達(dá)到專(zhuān)注的目的。現(xiàn)在我把代碼寫(xiě)到博客上,與大家一起分享一下。
注意:windows下使用playsound需要修改一下源碼,源碼有點(diǎn)小問(wèn)題,文末有改后的源碼。
1.導(dǎo)入所需模塊
import sys import time import playsound as pl from multiprocessing import Process2.主函數(shù),設(shè)置時(shí)間的安排,函數(shù)執(zhí)行從上到下依次執(zhí)行,這個(gè)需要自己定好這段時(shí)間自己打算做什么。
def main():work(minutes=20, todo='blog')work(minutes=30, todo='recite words')rest(minutes=10)work(minutes=60, todo='programming')例如上述代碼,寫(xiě)blog20分鐘,背單詞30分鐘,休息10分鐘,編程60分鐘,以此類(lèi)推。只要指定參數(shù)即可。
3.開(kāi)始工作:使用時(shí)間進(jìn)程和工作進(jìn)程。
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.開(kāi)始休息:使用時(shí)間進(jìn)程和休息進(jìn)程。
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.時(shí)間、工作、休息三個(gè)進(jìn)程對(duì)應(yīng)的函數(shù):
def startWorking(todo):print('開(kāi)始干活啦!!')print('todo:', todo)pl.playsound('piano.mp3') # 音樂(lè)響起def startRest():print('開(kāi)始休息啦!!')pl.playsound('exercise.mp3') # 音樂(lè)響起def timePassing(minutes):print('=' * 20, '開(kāi)始計(jì)時(shí)', '=' * 20)seconds = minutes * 60for i in range(round(seconds))[::-1]:time.sleep(1)sys.stdout.write(f'\r倒計(jì)時(shí):{i // 60}分{i % 60}秒')sys.stdout.flush()print('\n' + '=' * 20, '計(jì)時(shí)結(jié)束', '=' * 20)播放的音樂(lè)可以自己指定哦。
這個(gè)是修改之后的playsound源碼,可以直接拷貝導(dǎo)入使用。
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])總結(jié)
以上是生活随笔為你收集整理的居家学习python自制闹铃小助手的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 测试面试题-如何测试朋友圈
- 下一篇: python 操作word教程_Pyth