windows自带幻灯片壁纸功能,但我发现它有时会导致一个叫"Shell Infrastructure Host"的进程占用大量CPU资源。为了平衡一个阿宅对CPU和二次元的需求,敲点代码代替它。

功能:选择文件夹,定时随机切换壁纸。可以通过托盘图标修改参数或即时切换。

原理是很简单的,只用到一个api,只不过为了方便和美观做了些改进。

用到的第三方库有 easygui, pystray, APScheduler和configparser, 分别是用来提供对话框、托盘图标(算作提供一个操作入口,不过像windows那样在桌面右键菜单里加选项似乎更方便一点)、定时任务调度和参数解析。

不想打包的话可以把py文件后缀改成pyw,这样就没有控制台窗口了。

from easygui import diropenbox,integerbox,boolbox # 简单对话框
from random import randint # 随机数
from os import listdir # 读取文件名
from os.path import join # 合并路径
from PIL.Image import open as openImage # 读取图片
from pystray import MenuItem,Icon # 托盘图标
from ctypes import windll # 设置壁纸的api
from apscheduler.schedulers.background import BackgroundScheduler # 定时任务
from datetime import datetime # 提供now()函数以即时触发任务
from configparser import ConfigParser # 读取参数class WallpaperChanger:def __init__(self):self.initConfig() # 初始化参数self.setScheduler() # 设置调度器self.setIcon() # 设置托盘def initConfig(self):self.index = 0try:self.readConfig()except:self.config = Noneself.path = ''self.timeSep = 360self.random = Falseself.setConfig(setRandom=False) # 为了方便,默认不开启随机def readConfig(self):# 读取参数print('读取参数...')self.config = ConfigParser()self.config.read('config.ini')self.path = self.config['DEFAULT']['path']print('图片路径: %s' % self.path)self.timeSep = self.config['DEFAULT'].getint('timeSep')print('时间间隔: %s' % self.displayMinute(self.timeSep))self.random = self.config['DEFAULT'].getboolean('random')print('随机: %s' % self.random)def setConfig(self,setPath=True,setTimeSep=True,setRandom=True):# 更改参数if setPath:path = ''while not path:path = diropenbox(msg='选择壁纸所在的文件夹',\default=self.path)self.path = self.config['DEFAULT']['path'] = pathprint('图片路径设置为: %s' % path)if setTimeSep:timeSep = integerbox(msg='切换壁纸的时间间隔(分钟)',\title='输入时间间隔',default=self.timeSep,lowerbound=1,upperbound=43200)# 默认6个小时换一次。设置下限和上限。if timeSep:self.timeSep = timeSepself.config['DEFAULT']['timeSep'] = str(self.timeSep)print('时间间隔设置为: %s' % self.displayMinute(self.timeSep))if setRandom:self.random = not self.random# 通过勾选菜单来更改随机选择,只需要每次更改时取反即可self.config['DEFAULT']['random'] = str(self.random)print('随机设置为: %s' % self.random)with open('config.ini','w') as file:self.config.write(file)def setWallpaper(self):# 更改墙纸imgs = list(map(lambda img:join(self.path,img),listdir(self.path)))if self.random:self.index = randint(0,len(imgs)-1)else:self.index = (self.index+1) % len(imgs)# 取模运算实现数列循环img = imgs[self.index]windll.user32.SystemParametersInfoW(20,0,img,0)# 我没搞清这几个参数的作用print('壁纸已更改为:%s' % img)def displayMinute(self,minutes):# 由minutes选择合适的时间单位days=minutes//1440minutes=minutes%1440hours=minutes//60minutes=minutes%60output=''if days:output += '%d天' % daysif hours:output += '%d小时' % hoursif minutes:output += '%d分钟' % minutesreturn outputdef setScheduler(self):# 设置调度器self.scheduler = BackgroundScheduler(timezone='Asia/Shanghai')self.job = self.scheduler.add_job(func=self.setWallpaper,trigger='interval',minutes=self.timeSep)def setIcon(self):# 设置托盘def next():self.job.modify(next_run_time=datetime.now())def random():self.setConfig(False,False,True)def timeSep():self.setConfig(False,True,False)self.timeSepMenu = MenuItem('时间间隔: %s' % self.displayMinute(self.timeSep),timeSep)self.icon.menu = (self.nextMenu,self.randomMenu,self.timeSepMenu,self.pathMenu,self.exitMenu)# 更新菜单文本self.job.reschedule(trigger='interval',minutes=self.timeSep)# 更新任务def path():self.setConfig(True,False,False)def exit():if boolbox('确定退出吗?',choices=('是','否'),default_choice='否',cancel_choice='否'):self.stop()self.nextMenu = MenuItem('下一张',next)self.randomMenu = MenuItem('随机',random,checked=lambda item:self.random)self.timeSepMenu = MenuItem('时间间隔: %s' % self.displayMinute(self.timeSep),timeSep)self.pathMenu = MenuItem('文件路径',path)self.exitMenu = MenuItem('退出',exit)menu = (self.nextMenu,self.randomMenu,self.timeSepMenu,self.pathMenu,self.exitMenu)self.icon = Icon('',openImage('icon.ico'),'wallpaper changer',menu)def run(self):self.scheduler.start()self.icon.run()def stop(self):self.scheduler.shutdown()self.icon.stop()if __name__ == '__main__':wallpaperChanger = WallpaperChanger()wallpaperChanger.run()

代码中用到的 config.ini 文件内容如下。实际上不要这个东西也行…… 另外还需要一张图片 icon.ico 作为托盘图标。

[DEFAULT]
path = D:\Pictures\Desktop
timesep = 60
random = True

效果如图。


(我坦白了,我就是为了晒一下我的桌面才写了这个程序发这篇文章。)

github 地址 https://github.com/Luessiaw/WallpaperChanger

用python更换桌面壁纸相关推荐

  1. python 更换桌面壁纸 播放音乐

    python 改桌面壁纸 播放音乐 - win10可用. 注意: 1)打开 想关闭 直接关机 或者等自动关机 ,本程序无害,由python3编写并由 pyinstaller 打包 2)会在 c盘创建个 ...

  2. Python桌面自定义---实现定时更换桌面壁纸

    Python桌面自定义---实现定时更换桌面壁纸 1 效果 2 获取大量壁纸 3 Python代码实现定时更换壁纸 1 效果   大致效果如下,设置过定时更换壁纸的应该都知道是啥场景. 2 获取大量壁 ...

  3. Python实现桌面壁纸设置

    Python实现桌面壁纸设置 思路 1.通过bing每日壁纸接口,获取图片地址 2.保存图片到绝对路径 3.设置该图片为壁纸 4.批处理壁纸自动切换 第一.获取图片地址 微软bing每日壁纸API接口 ...

  4. python修改桌面壁纸_python实现桌面壁纸切换功能

    本文实例为大家分享了python实现桌面壁纸切换功能的具体实现方法,供大家参考,具体内容如下 大体分为两个部分 一.利用爬虫爬取壁纸 第一部分爬取图片url地址并且下载至本地 爬虫针对http://i ...

  5. WINCE6.0更换桌面壁纸和图标

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  6. linux更改桌面壁纸的脚本,自动更换桌面壁纸的脚本,支持Ubuntu 18.04系统

    下面提供一个自动更换桌面壁纸的脚本,它支持Ubuntu 18.04.UbuntuKylin 18.04.Ubuntu Mate系统. 注意事项: 1.默认的壁纸通常在目录路径为/usr/share/b ...

  7. 通过快捷方式快速更换桌面壁纸(必应每日壁纸)

    通过快捷方式快速更换桌面壁纸(必应每日壁纸) 01 前言 02 正文 03 后记 01 前言 桌面壁纸,大家都懂的,换的不是壁纸,是寂寞 心情.市面上各种桌面美化软件就不提了,这里介绍一种高端非主流玩 ...

  8. 基于红帽的Linux(centOS/fedora/RHEL)gnome3.34桌面环境用命令行更换桌面壁纸

    GNOME桌面环境用命令行更换桌面壁纸 问题引入 这篇文章将向你介绍基于红帽的linux使用GNMOE桌面环境,使用命令行更改桌面壁纸的方法. 有人会问:用命令行更改壁纸岂不是无聊至极?其实并不无聊. ...

  9. 【Python爬虫案例】批量采集网站壁纸,实现自动更换桌面壁纸

    前言 美照天天换,才不会腻 不知道你们是不是这样,我的手机壁纸电脑壁纸,隔三岔五就喜欢换,看久了 我就腻了,索性就用python把这个网站的壁纸都采集下来,顺便再让电脑自动更换我的桌面壁纸 ~ 一篇文 ...

最新文章

  1. 下列不是python对文件的读操作方法是-小猿圈python之python期末考试测试题(一)...
  2. 华清远见智能小车视频服务器,华清远见版世界杯足球对抗赛,智能小车C位出道...
  3. VIM 高校实用配置实践
  4. 1ke android逆向助手_android: 使用android逆向助手反编译APK
  5. Spring 3.0参考之SpEL
  6. 使用枚举映射_用EnumMaps映射枚举键
  7. 编程中的移位运算符简单解释
  8. Go泛型草案设计简明指南
  9. C++ STL map集合的使用
  10. centos7桌面没有计算机图标,centos7下创建桌面图标的方法
  11. 【操作系统】第一章.操作系统引论思维导图
  12. matlab无法打开.m文件查看
  13. VS2012编译文件报错——error LNK2001: 无法解析的外部符号 __imp___CrtDbgReportW
  14. 可靠性试验(环境试验、机械试验、HALT试验等)
  15. Bootstrap实战 - 评论列表
  16. 【开发】微信公共帐号机器人WeBot
  17. 女生宿舍,男生请勿进
  18. MySQL查看数据库数据量
  19. maya渲染帧拷贝删除重命名插件 tjh_copy_same_frame1.1 下载及教程
  20. 前端CSS核心内容浮动

热门文章

  1. v90绝对值编码器回零_由“V90使用绝对值编码器掉电后位置丢失”所想到的
  2. 测试开发工程师成长心路
  3. Android虚拟sdcard
  4. QCA7000/QCA7005基于全志V3S Linux系统驱动移植
  5. laravel 多语言切换
  6. docker实战学习2022版本(七)之docker网络学习
  7. pyecharts绘制省级地图(Map地图、Geo动态涟漪散点图、Geo动态轨迹图)
  8. mysql c盘满了 怎么办_C盘满了如何清理
  9. 如何基于微信开放接口开发企业的微信 CRM?
  10. 被一些数字整除的数字的特征