python
import time
import logging
import os
import subprocess
import winreg
from datetime import datetime
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# 应用程序路径
APP_PATHS = {
'qqbrowser': r'C:\Program Files\Tencent\QQBrowser\QQBrowser.exe',
'snipaste': r'C:\Program Files\Snipaste\Snipaste.exe',
'pycharm': r'C:\Program Files\JetBrains\PyCharm Community Edition X.Y.Z\bin\pycharm64.exe'
}
# 备忘录文件路径
NOTEPAD_PATH = r'C:\Windows\system32\notepad.exe'
NOTES_FILE_PATH = r'C:\Users\YourUsername\Documents\notes.txt'
# 工作日志文件路径
WORKLOG_FILE_PATH = r'C:\Users\YourUsername\Documents\worklog.txt'
def launch_app(app_name):
"""启动指定的应用程序"""
if app_name in APP_PATHS:
app_path = APP_PATHS[app_name]
logging.info(f"Launching {app_name}...")
try:
subprocess.Popen([app_path], shell=True)
logging.info(f"{app_name} launched successfully.")
except FileNotFoundError:
logging.error(f"File not found: {app_path}")
except Exception as e:
logging.error(f"An error occurred while launching {app_name}: {e}")
else:
logging.error(f"Application {app_name} is not supported.")
def open_notes():
"""打开备忘录文件"""
try:
subprocess.Popen([NOTEPAD_PATH, NOTES_FILE_PATH])
logging.info("Notepad opened with notes file.")
except FileNotFoundError:
logging.error(f"File not found: {NOTES_FILE_PATH}")
except Exception as e:
logging.error(f"An error occurred while opening notes: {e}")
def write_log_entry(log_file_path):
"""写入今天的日期、时间和编程记录"""
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
log_entry = (
f"Date and Time: {current_time}\n"
f"Action: 开始编程\n"
f"Note: 今天开始进行编程工作的记录。\n\n"
)
try:
with open(log_file_path, 'a') as log_file:
log_file.write(log_entry)
logging.info(f"Log entry written to {log_file_path}")
except IOError as e:
logging.error(f"Failed to write to log file: {e}")
def open_log_file():
"""打开工作日志文件,并写入今天的日期和时间"""
try:
subprocess.Popen([NOTEPAD_PATH, WORKLOG_FILE_PATH])
logging.info("Notepad opened with work log file.")
write_log_entry(WORKLOG_FILE_PATH)
except FileNotFoundError:
logging.error(f"File not found: {WORKLOG_FILE_PATH}")
except Exception as e:
logging.error(f"An error occurred while opening log file: {e}")
def launch_all_apps():
"""等待一段时间后启动所有应用程序并打开备忘录和工作日志"""
logging.info("Waiting 30 seconds before launching applications and opening notes/log...")
time.sleep(30) # Wait for 30 seconds
open_notes()
open_log_file()
for app_name in APP_PATHS.keys():
launch_app(app_name)
def set_startup(exe_path):
"""设置程序开机启动"""
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER,
r'Software\Microsoft\Windows\CurrentVersion\Run', 0,
winreg.KEY_ALL_ACCESS)
winreg.SetValueEx(key, "LaunchAppsAtStartup", 0, winreg.REG_SZ, exe_path)
winreg.CloseKey(key)
logging.info("Setup complete. Your application will now start at login.")
def main():
# 获取当前脚本的绝对路径
script_path = os.path.abspath(__file__)
# 设置开机启动
set_startup(script_path)
# 立即启动所有应用程序、打开备忘录和工作日志(仅用于测试)
# launch_all_apps()
if __name__ == "__main__":
main()
改进点
-
代码结构:
- 将不同功能封装到单独的函数中,提高了代码的可读性和可维护性。
-
日志记录:
- 使用
logging
模块记录详细的日志信息,包括启动成功、失败和错误信息。
- 使用
-
错误处理:
- 增强了错误处理机制,确保在文件不存在或写入失败时能够记录错误信息。
-
路径变量命名:
- 更改了工作日志文件路径变量名,使其更具描述性。
-
测试模式:
- 可以通过取消注释
launch_all_apps()
来立即启动所有应用程序、打开备忘录和工作日志,用于测试。
- 可以通过取消注释
打包 .exe
文件
使用 PyInstaller
将脚本打包成 .exe
文件:
bash
pyinstaller --onefile --icon=your_icon.ico launch_apps.py
这将在 dist
文件夹中生成一个 .exe
文件。
测试与验证
-
生成
.exe
文件:- 确保
.exe
文件生成成功。
- 确保
-
设置开机启动:
- 第一次运行
.exe
文件时,会自动设置开机启动。
- 第一次运行
-
测试开机启动:
- 重启计算机,等待 30 秒后检查应用程序是否自动启动,并检查备忘录和工作日志是否自动打开并写入记录。
这样,代码更加清晰、模块化,并且具有更好的错误处理机制,易于维护和扩展。