每日一成不变的壁纸感到厌倦呢?.cn

[复制链接]
查看1352 | 回复0 | 2023-1-2 17:56:28 | 显示全部楼层 |阅读模式
欢迎你们光临我的博客,大家一起交流进步~chenjingjiu.cn

不知道你们是否对每日一成不变的墙纸倍感厌烦呢?反正对于我个人来说,如果每晚打开笔记本映入眼帘的都是不同的画面,那么科研热情就会被充分迸发,从而提升自己的劳动生产力。

原来使用的是Deepin系统,自己写了一个爬虫爬取每日必应图片,然后调用系统函数更换桌面,并借助crontab实现每日10点手动运行的功能。

可是linux和windows的word有区别,无法嵌入公式功能,最终还是让我滚回了windows阵营。因此有了将linux下的脚本移植到windows的看法。

1.说干就干,首先是爬取必应的每日图片,代码如下:

<p><pre>    <code class="language-text">import urllib
import requests
import re
import time
def get_image():
    url = &#39;http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&nc=1361089515117&FORM=HYLH1&#39;
    time = time.strftime("%Y.%m.%d")
    content = urllib.urlopen(url).read().decode(&#39;utf-8&#39;)
    reg = re.compile(&#39;"url":"(.*?)","urlbase"&#39;, re.S)
    text = re.findall(reg, content)  
    img_url = &#39;http://cn.bing.com&#39; + text[0]
    image = requests.get(img_url).content
file_name = &#39;C:\Users\xxxx\Desktop\screen\%s.bmp&#39;%local
    f = open(file_name, &#39;wb&#39;)
    f.write(image)
    f.close()
    return file_name
</code></pre></p>
该函数实现了爬取每日必应图片的功能,然后将图片保存在本地桌面的screen文件夹内,命名格式是当日的年.月.日.bmp,最后将该文件名返回,这个主要是为了下一步设置墙纸用的。需要使用本代码的同学可以把file_name改成你想保存的位置就行。

2.之后接下来是更换墙纸功能,代码如下:

<p><pre>    <code class="language-text">import win32api,win32con,win32gui
def setWallPaper(pic_path):
    key = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER,"Control Panel\\Desktop",0,win32con.KEY_SET_VALUE)
    win32api.RegSetValueEx(key, "WallpaperStyle", 0, win32con.REG_SZ, "2")
    win32api.RegSetValueEx(key, "TileWallpaper", 0, win32con.REG_SZ, "0")
    win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, pic_path, win32con.SPIF_SENDWININICHANGE)
</code></pre></p>
其中,RegOpenKeyEx用于打开指定的注册表键

<p><pre>    <code class="language-text">RegOpenKeyEx(
  HKEY hKey,         // 要打开的键值句柄
  LPCTSTR lpSubKey,  // 要打开的子键名
  DWORD ulOptions,   // 保留位置0
  REGSAM samDesired, // 一个访问掩码,它指定对密钥的期望访问权限。
  PHKEY phkResult    //指向变量的指针,该变量接收打开的键的句柄。
);


</code></pre></p>
RegSetValueEx函数在注册表项下设置指定值的数据和类型。

<p><pre>    <code class="language-text">LONG RegSetValueEx(
  HKEY hKey,           // 要设定的键值句柄
  LPCTSTR lpValueName, // 要设定的键值名称
  DWORD Reserved,      // 保留位置0
  DWORD dwType,        //要设定的键值类型,REG_SZ为普通文本类型
  CONST BYTE *lpData,  // 要设定的键值数据
  DWORD cbData         // 要设定的键值数据大小
);
</code></pre></p>
WallpaperStyle是设置用于填充墙纸周围剩余空间的Active Desktop款式,共有三个可以定义的值:0=居中、1=平铺、2=拉伸。

TileWallpaper是设置墙纸的显示方法,共有三个可以定义的值:0=居中、1=平铺、2=拉伸。

实际上,WallpaperStyle和TileWallpaper的通配符不需要更换,维持原值即可,如可以把WallpaperStyle的值保持为“2”,TileWallpaper的值保持为“0”。

SystemParametersInfo为设置系统级参数,可以获取和设置数目诸多的windows系统参数。这一步将桌面墙纸更换为本地图片,然后通知系统应用该修改。

3.最后是主程序,也就是将两个函数进行组合,代码如下:

<p><pre>    <code class="language-text">if __name__==&#39;__main__&#39;:
    file_name= get_image ()
    setWallPaper(file_name)
</code></pre></p>
上述代码已然可以完成我们想要的疗效,但是每次都须要自己自动更改,这肯定是难以忍受的,所以接下来进行window定时任务的设置

1.右键我的笔记本,选择管理

2.任务计划程序,创建任务

3.常规界面

4.触发器界面,新建,然后设置如下,点击确认

5.操作界面,点击新建,设置如下,点击确认

解释一下为何用pythonw.exe而不是python.exe,因为测试时发觉python.exe启动时会弹出黑框,执行完毕后手动关掉,而我们只想让其在后台工作,而不是弹出累赘的黑框,所以借助pythonw.exe。

6.条件界面,将所有的勾都取消

7.设置界面,勾选假如过了计划开始时间,立即启动任务

8.点击确定,然后可以从活动任务中找到刚刚我们设置的任务

9.双击以后,会出现下视口

10.点击运行,看看墙纸是否更换

本文实现了一个win10下的自定义美化功能,每日10点定时爬取必应每日图片,然后将其设置为桌面墙纸。涉及到了python网路爬虫知识、re正则知识、win32api知识、windows定时任务知识等。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则