A4纸笔记法是一种可以培养逻辑思维的方法,具体做法是将一张A4纸横放,第一行写主题和日期,后续每行把这个主题对应的想法写出来,时间控制在60s内,详细参考A4纸笔记法 - 简书。由于手头没有A4纸,想用Python实现windows下自动保存A4笔记的程序。
实现的效果:.py文件执行后,自动新建文本文档,自动用记事本打开文本文档,手动将笔记写入记事本后,按Crtl+S保存,自动按照主题和时间重命名,保存在指定目录,方便后续记录,笔记写完发通知告知用户笔记记录时长。
话不多说,上代码
#coding:utf-8
import time
import os
import subprocess
def text_create(filedir): #创建filedir文件
file = open(filedir,'w',encoding='gbk')
file.close()
#模拟windows通知
def send_notifycation (content: str = '', title: str = 'New notifycation',
tip_type: str = 'None', duration: int = 3) -> None:
"""
模拟windows发系统通知
参数
content: str 必选,通知内容
title: str 可选,通知标题
tip_type: str 可选,通知类型[None|Info|Warning|Error]
duration: int 可选,停留时长,单位(秒)
"""
d = {}
for c in (65, 97):
for i in range(26):
d[chr(i+c)] = chr((i+13) % 26 + c)
s = ''
s += "shapgvba Fraq-Abgvsvpngvba{cnenz ([Fgevat] $pbagrag='Abgvsvpngvbaf',"
s += "[Fgevat] $gvc_gvgyr='Arj abgvsvpngvba',[Fgevat] $gvc_glcr='Abar',"
s += "[Vag32] $qhengvba=3);cebprff{Nqq-Glcr -NffrzoylAnzr Flfgrz.Jvaqbjf"
s += ".Sbezf;$nffrzoyl='Flfgrz.Jvaqbjf.Sbezf.AbgvslVpba';$abgvsl=Arj-"
s += "Bowrpg $nffrzoyl -Cebcregl @{Vpba=[Flfgrz.Qenjvat.FlfgrzVpbaf]::"
s += "Vasbezngvba;OnyybbaGvcVpba=$gvc_glcr;OnyybbaGvcGvgyr=$gvc_gvgyr;"
s += "OnyybbaGvcGrkg=$pbagrag;Ivfvoyr=$gehr};$abgvsl.FubjOnyybbaGvc"
s += "($qhengvba)}};Fraq-Abgvsvpngvba -pbagrag '%f' -gvc_gvgyr '%f' "
s += "-gvc_glcr '%f' -qhengvba %f"
subprocess.Popen(["PowerShell", '-ep', 'Unrestricted', '-nop',
'-win', 'Hidden', '-c', '& {%s}' % (
"".join([d.get(c, c) for c in (s)]) % (
content, title, tip_type, duration))
])
savePath = os.path.abspath(os.path.dirname(__file__)) #获取.py文件的上级路径
noteDir = os.path.join(savePath ,'A4笔记文件夹') #文件夹名称路径
noteName = os.path.join(noteDir,'新建笔记文档.txt') #创建新笔记文件路径
if os.path.exists(noteDir): #判断是否存在noteDir文件夹
pass #存在此文件夹就跳过
else:
os.mkdir(noteDir) #如果不存在文件夹就创建文件夹
text_create(noteName) # 创建txt笔记文件
TextPopenObj = subprocess.Popen(['notepad',noteName]) #生成笔记Popen对象
startTime = time.time() #记录初始时间
while True:
time.sleep(0.5) #每隔0.5s判断retcode
retcode = TextPopenObj.poll() #笔记Popen对象调用poll判断子线程是否执行完, 执行结束返回0
if retcode == 0: #retcode==0代表子线程运行结束,进入后续处理逻辑
endTime = time.time() #记录结束时间
txtTime=endTime - startTime #记录笔记时间
with open(noteName,'r',encoding='gbk') as fo: #以读的方式,打开保存的笔记文件
#读取第一行的内容,把特殊字符替换成用字符串替换空字符
oneLine = fo.readline().replace(':','_').replace('\n','').replace('/','').replace('\\','').replace('*','').replace('?','').replace('"','').replace('<','').replace('>','').replace('|','')
renameNewName = os.path.join(noteDir,oneLine)+'.txt' #把重命名的笔记路径重新拼接
if oneLine=='': #如果第一行为空,代表没有保存任何字符,不改名不做处理
pass
else:
os.rename(noteName,renameNewName) #调用os.rename改名
send_notifycation(content=f'耗时{txtTime:.1f}秒\n{renameNewName}', title=f'笔记记录完成') #发送windows通知
break
用到三个内置库,把.py改名成.pyw执行不显示黑框,显示效果: