Python 实现macOS Catalina 动态壁纸定时设置

前言

很不幸,我的电脑只能装 macOS High Sierra ,但是看他们的 Catalina 和 Mojave 的壁纸好炫酷,据说还可以根据日出时间切换壁纸和暗黑模式?!尽管条件限制,我还是想体验一下动态壁纸。(想试试的戳这里,Github有相同的说明)本人刚学Python 2秒,大佬轻喷,Github也没啥项目

Windows 也能用啦:戳这里

Here we go

实现方法

  1. 计算日出时间
    需要一点天文学知识,具体请看代码(文末有,百度来的)
  2. 定时任务
    为了保持轻量化原则,使用自带的 sched
  3. 开机自启动
    macOS 很贴心的加入了启动项功能,不用鼓捣命令行
  4. 设置壁纸
    这里不太好弄,windows 下的方法不少,mac 上可以使用 appscript 模块(是在是没有办法轻量化了)
    from appscript import app, mactypes
    
    def set_bg(path): #注意这里的 path 是相对于项目路径的
        app('Finder').desktop_picture.set(mactypes.File(path))
    # Windows version
    import win32con, win32api, win32gui
    import os
    
    def set_bg(path):
        path2 = ''
        for c in path: #为了兼容上面的代码,采取相对路径path,再转换为绝对路径path2
            if c=='/':
                path2+='\\'
            else:
                path2+=c
        # get file path
        pic = os.getcwd()+'\\'+path2
        # open register
        regKey = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER,"Control Panel\\Desktop",0,win32con.KEY_SET_VALUE)
        win32api.RegSetValueEx(regKey,"WallpaperStyle", 0, win32con.REG_SZ, "0")
        win32api.RegSetValueEx(regKey, "TileWallpaper", 0, win32con.REG_SZ, "0")
        # refresh screen
        win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, pic, win32con.SPIF_SENDWININICHANGE)

     

安装方法

Github 仓库地址(mac OS)

Github 仓库地址(Windows)

安装说明 (mac)

保证拥有 Python3 运行环境

  • 在终端执行(当然你也可以pip3 install appscript && python3 Main.py)
git clone https://github.com/HelloWorldZTR/py-background.git

cd py-background && sudo chmod +x install.sh start.sh

./install.sh
  • 会要求输入经纬度用以计算日出日落时间(float 最好)
  • Ctrl + C 退出终端
  • 将 start.sh 添加到开机启动项(方法在此)

 

配置说明

config.json

{
    "SunSet": {
        "-01:00": "BackgroundImage/evening.jpeg",
        "+00:00": "BackgroundImage/night.jpg"
    },
    "SunRise": {
        "-01:00": "BackgroundImage/evening.jpeg",
        "+00:00": "BackgroundImage/day.jpg"
    }
}

SunSet / SunRise 是日落日出; -01:00 是之前一小时,+01:00 是之后一小时

所以,

"SunSet": {
    "-01:00": "BackgroundImage/evening.jpeg"
}

指的是在日落前1小时,将壁纸换成BackgroundImage/evening.jpeg(相对于项目路径)

config.json 同时也存储 longitude 和 latitude

后话

看完这篇文章,要不再看看这篇关于黑苹果的文章?

Github地址: 

  • https://github.com/HelloWorldZTR/py-background
  • https://github.com/HelloWorldZTR/py-background-for-win

uploading.4e448015.gif正在上传…重新上传取消

还会有windows 版的

计算日出日落时间的代码

import math


def getsunrise(year, month, day, latitude, longitude):
    zenith = 90.83333333
    N1 = math.floor(275 * month / 9)
    N2 = math.floor((month + 9) / 12)
    N3 = (1 + math.floor((year - 4 * math.floor(year / 4) + 2) / 3))
    dayOfYear = N1 - (N2 * N3) + day - 30
    localOffset = math.floor(-1 * longitude * 24/360)
    lngHour = longitude / 15
    t = dayOfYear + ((6 - lngHour) / 24)
    M = (0.9856 * t) - 3.289
    L = M + (1.916 * math.sin(M * 3.1415926 / 180)) + \
        (0.020 * math.sin(2 * M * 3.1415926 / 180)) + 282.634
    L = L - 360
    RA = (180/3.1415926) * math.atan(0.91764 * math.tan(L * 3.1415926 / 180))
    Lquadrant = (math.floor(L/90)) * 90
    RAquadrant = (math.floor(RA/90)) * 90
    RA = RA + (Lquadrant - RAquadrant)
    RA = RA / 15
    sinDec = 0.39782 * math.sin(L * 3.1415926 / 180)
    cosDec = math.cos(math.asin(sinDec))
    cosH = (math.cos(zenith * 3.1415926 / 180) - (sinDec * math.sin(latitude *
                                                                    3.1415926 / 180))) / (cosDec * math.cos(latitude * 3.1415926 / 180))
    if (cosH < -1):
        sunsetT = 0
        return sunsetT
    if (cosH > 1):
        sunriseT = 0
        return sunriseT
    H = 360 - 180/3.1415926 * math.acos(cosH)
    H = H / 15
    T = H + RA - (0.06571 * t) - 6.622
    UT = T - lngHour
    sunriseT = UT - localOffset
    return sunriseT


def getsunset(year, month, day, latitude, longitude):
    zenith = 90.83333333
    N1 = math.floor(275 * month / 9)
    N2 = math.floor((month + 9) / 12)
    N3 = (1 + math.floor((year - 4 * math.floor(year / 4) + 2) / 3))
    dayOfYear = N1 - (N2 * N3) + day - 30
    localOffset = math.floor(-1 * longitude * 24/360)
    lngHour = longitude / 15
    t = dayOfYear + ((6 - lngHour) / 24)
    M = (0.9856 * t) - 3.289
    L = M + (1.916 * math.sin(M * 3.1415926 / 180)) + \
        (0.020 * math.sin(2 * M * 3.1415926 / 180)) + 282.634
    L = L - 360
    RA = (180/3.1415926) * math.atan(0.91764 * math.tan(L * 3.1415926 / 180))
    Lquadrant = (math.floor(L/90)) * 90
    RAquadrant = (math.floor(RA/90)) * 90
    RA = RA + (Lquadrant - RAquadrant)
    RA = RA / 15
    sinDec = 0.39782 * math.sin(L * 3.1415926 / 180)
    cosDec = math.cos(math.asin(sinDec))
    cosH = (math.cos(zenith * 3.1415926 / 180) - (sinDec * math.sin(latitude *
                                                                    3.1415926 / 180))) / (cosDec * math.cos(latitude * 3.1415926 / 180))
    if (cosH < -1):
        sunsetT = 0
        return sunsetT
    if (cosH > 1):
        sunriseT = 0
        return sunriseT
    H = 180/3.1415926 * math.acos(cosH)
    H = H / 15
    T = H + RA - (0.06571 * t) - 6.622
    UT = T - lngHour
    sunsetT = UT - localOffset
    return sunsetT


def format_time(timeT):
    if timeT > 0:
        h = int(timeT)
        m = int((timeT-int(timeT))*60)
    else:
        h = 24+int(timeT)-1
        m = int(math.fabs(timeT-int(timeT))*60)
    return {'hour': h, 'minute': m}

 

你可能感兴趣的:(瞎搞,macos,python)