Windows_Wallpaper_Script 详解:用 Python 一键提取 Windows 10 锁屏壁纸到本地
【免费下载链接】PythonMy Python Examples项目地址: https://gitcode.com/gh_mirrors/py/Python
本篇文章围绕仓库 Windows_Wallpaper_Script 目录中的锁屏壁纸提取脚本展开,讲解它如何把 Windows 10 锁屏(Spotlight)推送的精美壁纸自动导入到脚本所在文件夹,并完成扩展名修复、分辨率过滤与桌面/手机分类。读完本文,你将掌握该脚本的完整工作流程、核心源码 的每一处实现细节,以及借助 Windows 任务计划程序实现定时自动抓取新壁纸的落地方法。
一、这个脚本解决什么问题
Windows 10 的锁屏界面支持"Windows 聚焦"(Spotlight)模式,系统会联网不定期推送高质量风景、建筑、动物等主题壁纸。这些壁纸会缓存在本地磁盘中,但由于它们以无扩展名的二进制文件形式存放,普通用户无法直接双击查看或另存为桌面壁纸。
本目录中的 wallpaper_extract.py 正是为解决这一痛点而编写:它将缓存目录中的壁纸文件全部复制到脚本所在目录的Wallpapers文件夹,自动补上.jpg扩展名,剔除不符合壁纸分辨率的杂项图片,并按宽度把横屏壁纸与竖屏壁纸分别归入desktop、mobile两个子目录。由于锁屏壁纸会在联网状态下持续更新,原文档(ReadMe.md)给出的建议是:每次在锁屏上发现新壁纸后重新运行一次脚本,或者用 Windows 任务计划程序定时自动运行,把抓取过程完全自动化。
二、环境要求
按照 ReadMe.md 的说明,运行该脚本需要满足:
| 依赖 | 说明 |
|---|---|
| 操作系统 | Windows 10 PC(脚本依赖 Windows 10 的 Spotlight 缓存路径) |
| Python | Python 3.x |
| 第三方库 | Pillow(PIL 模块的 Python 3 兼容版本) |
安装 Pillow 一行命令即可:
pip install Pillow安装完成后,在脚本所在目录执行:
python wallpaper_extract.py脚本运行完毕会在终端打印一个 ASCII 艺术风格的DONE横幅(源码 wallpaper_extract.py),随后自动退出,提取结果即出现在Wallpapers目录中。
三、整体工作流程:四步流水线
整个脚本被设计为一条四步流水线,每一步对应一个静态方法,最终由exec_all()按顺序串联执行(wallpaper_extract.py):
copy_wallpapers() 复制缓存文件 │ ▼ change_ext() 为无扩展名文件补上 .jpg │ ▼ extract_wall() 用 PIL 验证图片并剔除非 1920/1080 宽度的文件 │ ▼ arr_desk_wallpapers() 按宽度把壁纸归入 desktop / mobile 子目录 │ ▼ 输出 DONE 横幅,结束对应到源码入口,脚本末尾实例化Wallpaper类并立即触发全流程(wallpaper_extract.py):
wall = Wallpaper() wall.exec_all()每一步之间还通过time_gap()(wallpaper_extract.py)打印类似Copying Wallpapers..的延时提示,营造"正在处理"的进度感,便于观察执行阶段。
四、源码逐模块解读
4.1 路径配置:源目录与目标目录
脚本用类级字典file_urls统一管理所有路径(wallpaper_extract.py):
username = os.environ["USERNAME"] file_urls = { "wall_src": "C:\\Users\\" + username + "\\AppData\\Local\\Packages\\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\\" + "LocalState\\Assets\\", "wall_dst": os.path.dirname(os.path.abspath(__file__)) + "\\Wallpapers\\", "wall_mobile": os.path.dirname(os.path.abspath(__file__)) + "\\Wallpapers\\mobile\\", "wall_desktop": os.path.dirname(os.path.abspath(__file__)) + "\\Wallpapers\\desktop\\", }wall_src:Spotlight 壁纸缓存目录。路径通过os.environ["USERNAME"]动态拼接,自动适应当前 Windows 登录用户,无需手工修改。该目录由Microsoft.Windows.ContentDeliveryManager包管理,其中除了锁屏壁纸外,还混杂着大量小尺寸图标、Logo 等资源,这正是后续需要分辨率过滤的原因。wall_dst/wall_mobile/wall_desktop:目标目录均基于os.path.dirname(os.path.abspath(__file__))计算,即脚本自身所在目录,与文档中"导入到脚本所在当前文件夹"的描述一致。输出结构为Wallpapers/desktop(1920 宽)与Wallpapers/mobile(1080 宽)两个子目录。
4.2 复制壁纸:copy_wallpapers()
for filename in os.listdir(w.file_urls["wall_src"]): shutil.copy(w.file_urls["wall_src"] + filename, w.file_urls["wall_dst"])该方法(wallpaper_extract.py)遍历缓存源目录中的所有文件,用shutil.copy逐个复制到Wallpapers根目录。此时复制出的文件没有扩展名,需要在下一步处理。
4.3 补全扩展名:change_ext()
for filename in os.listdir(w.file_urls["wall_dst"]): base_file, ext = os.path.splitext(filename) if ext == "": if not os.path.isdir(w.file_urls["wall_dst"] + filename): os.rename(w.file_urls["wall_dst"] + filename, w.file_urls["wall_dst"] + filename + ".jpg")该方法(wallpaper_extract.py)扫描目标目录,对没有扩展名的文件统一追加.jpg。os.path.isdir的判断保证了只处理普通文件、跳过子目录。
4.4 分辨率过滤:extract_wall()
im = Image.open(w.file_urls["wall_dst"] + filename) ... if list(im.size)[0] != 1920 and list(im.size)[0] != 1080: im.close() os.remove(w.file_urls["wall_dst"] + filename)该方法(wallpaper_extract.py)是整条流水线的"质检"环节:
- 用 Pillow 的
Image.open打开每一个.jpg文件,IOError说明该文件并非有效图片,会打印This isn't a picture.; - 读取图片宽度(
im.size的第一个元素),只有宽度为 1920(对应横屏桌面壁纸,如 1920×1080)或 1080(对应竖屏手机壁纸,如 1080×1920)的文件才被保留,其余全部删除。
这一步有效过滤掉了 Spotlight 缓存目录里大量非壁纸的小尺寸素材。仓库中 Wallpapers/desktop 目录下的示例图片正是 1920×1080 横屏图,Wallpapers/mobile 目录下的示例图片则是 1080×1920 竖屏图,与源码的宽度判定逻辑完全对应。
4.5 桌面/手机分类:arr_desk_wallpapers()
if list(im.size)[0] == 1920: os.rename(w.file_urls["wall_dst"] + filename, w.file_urls["wall_desktop"] + filename) elif list(im.size)[0] == 1080: os.rename(w.file_urls["wall_dst"] + filename, w.file_urls["wall_mobile"] + filename)该方法(wallpaper_extract.py)把经过过滤的壁纸按宽度移动归位:
- 宽度1920→ 移入
Wallpapers\desktop\(桌面壁纸); - 宽度1080→ 移入
Wallpapers\mobile\(手机壁纸); - 若目标位置已存在同名文件,会捕获
FileExistsError并打印File Already Exists!,同时删除源目录中的重复文件,避免重复运行脚本时产生堆积。
4.6 编排入口:exec_all()
@staticmethod def exec_all(): w = Wallpaper w.copy_wallpapers() w.change_ext() w.extract_wall() w.arr_desk_wallpapers() print(w.msg) time.sleep(2)(wallpaper_extract.py)按顺序调用上述四个方法,最后打印DONE横幅并暂停 2 秒,整个提取流程结束。
五、运行结果与输出目录结构
脚本运行完成后,得到如下目录结构(仓库中已附带提取成果样本):
Windows_Wallpaper_Script/ ├── ReadMe.md ├── wallpaper_extract.py └── Wallpapers/ ├── desktop/ # 1920×1080 横屏壁纸 └── mobile/ # 1080×1920 竖屏壁纸此后你可以进入 Windows_Wallpaper_Script/Wallpapers/desktop,把喜欢的横屏壁纸直接设置为 Windows 桌面壁纸;竖屏图片则适合作为手机壁纸素材。
六、进阶:用 Windows 任务计划程序实现定时自动抓取
原文档(ReadMe.md)特别指出,锁屏壁纸会随联网持续更新,因此推荐配合 Windows 任务计划程序定时运行脚本,并在系统设置中把桌面壁纸文件夹指向脚本的输出目录,实现壁纸库的持续自增长。可按下述步骤配置:
- 按
Win + R输入taskschd.msc回车,或在开始菜单搜索"任务计划程序"; - 在右侧操作栏点击"创建基本任务",命名为
Wallpaper Extractor; - 触发器选择"每天",并在后续步骤中通过"高级"选项设置重复间隔(如每 6 小时执行一次,或按需设为一周一次);
- 操作选择"启动程序":
- 程序或脚本:填入
python.exe的完整路径(可用where python查询,例如C:\Users\<用户名>\AppData\Local\Programs\Python\Python310\python.exe); - 添加参数:填入脚本的绝对路径,例如
D:\Windows_Wallpaper_Script\wallpaper_extract.py; - 起始于:填入脚本所在目录;
- 程序或脚本:填入
- 点击完成即可。之后每次锁屏出现新壁纸,任务计划程序都会在指定时间自动把新壁纸抓取到
Wallpapers目录; - 最后在 Windows 10"设置 → 个性化 → 背景"中,将壁纸文件夹指定为 Wallpapers/desktop 目录,即可让桌面自动轮播提取到的壁纸。
七、注意事项与已知限制
基于对源码的逐行分析,实际使用时有以下几点值得留意:
- 目标目录需预先存在:脚本本身并未调用
os.makedirs创建Wallpapers、Wallpapers\mobile、Wallpapers\desktop目录。首次运行前需要手工创建这三个目录(仓库已自带),否则shutil.copy或os.rename会因目录不存在而报错。 - 缓存目录依赖 Windows 10 特定包路径:源路径中写死了包名
Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy。从源码结构看,该路径适用于常见的 Windows 10 Spotlight 缓存布局;若系统更新后路径发生变化,需要同步修改file_urls中的wall_src。 - 非图片文件的健壮性:
extract_wall()中若Image.open抛出IOError,只会打印提示而不会中断后续代码,紧接着对im.size的访问在异常场景下可能触发NameError。此外 Assets 缓存中若存在无法被 Pillow 识别为 JPEG 的.jpg文件,也会进入同一分支,如有需要可自行增加continue或try/except保护。 - 重复运行的幂等性:脚本对已存在的同名壁纸通过
FileExistsError分支打印提示并清理重复文件,多次运行不会无限堆积,可以放心配合任务计划程序使用。
八、小结
Windows_Wallpaper_Script 虽然是一个小巧的单文件脚本,却完整覆盖了"复制缓存 → 补全扩展名 → 分辨率过滤 → 分类归档"这一套实用的文件处理流水线:路径基于USERNAME环境变量与__file__动态解析,过滤逻辑以图片宽度 1920/1080 作为桌面/手机壁纸的判定标准,再配合 Windows 任务计划程序即可实现壁纸库的自动维护。如果你长期使用 Windows 10 的"Windows 聚焦"锁屏并被那些精美壁纸吸引,这个脚本是零成本、可立即上手的最优解。
【免费下载链接】PythonMy Python Examples项目地址: https://gitcode.com/gh_mirrors/py/Python
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考