Ubuntu写python脚本实现自定义壁纸幻灯片:Vue法字符串拼接法minidom法

Posted hans774882968

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ubuntu写python脚本实现自定义壁纸幻灯片:Vue法字符串拼接法minidom法相关的知识,希望对你有一定的参考价值。

文章目录

环境

Windows10、虚拟机Ubuntu20.04

本文juejin:https://juejin.cn/post/7129080519945355277/

本文52pojie:https://www.52pojie.cn/thread-1672344-1-1.html

本文CSDN:https://blog.csdn.net/hans774882968/article/details/126215309

作者:hans774882968以及hans774882968

配置文件何在

查阅资料可知,控制壁纸幻灯片的文件是:/usr/share/backgrounds/contest/focal.xml

如果权限不够,就修改一下:

sudo chmod 777 focal.xml

配置文件写法

原有内容结构如下:

<background>
  <starttime>
    <year>2020</year>
    <month>04</month>
    <day>01</day>
    <hour>00</hour>
    <minute>00</minute>
    <second>00</second>
  </starttime>
  <!-- This animation will start at midnight. -->
  <!-- 剩下的是主体部分,省略 -->
</background>

观察原有内容,我们归纳得出,控制一张图片的xml如下:

  <static>
    <duration>25.0</duration>
    <file>/home/xxx/图片/壁纸1.png</file>
  </static>
  <transition>
    <duration>2.0</duration>
    <from>/home/xxx/图片/壁纸1.png</from>
    <to>/home/xxx/图片/壁纸2.png</to>
  </transition>

因此,我们只需要提供:static持续的时间、transition持续的时间(均以秒为单位)、当前图片和下一张图片。

脚本

Vue也可以很方便地生成xml

传送门

字符串拼接版

关于脚本:

  1. file_template.xml的主体部分,用%s表示。求好主体部分imgs_xml后,用file_template % imgs_xml来添加。
  2. 注意编码指定为utf-8
  3. 这种直接拼接字符串的方式保证缩进完全正确是比较麻烦的。可以试试用minidom再实现一次,对比实现难度。

使用时:

  1. 只需要修改files数组。
  2. 运行完毕,文件生成后,自行替换/usr/share/backgrounds/contest/focal.xml的原有内容。
  3. 修改后不会立刻生效,目前我是用重启解决这个问题的。如果能找到对应的进程,手动重启它,就更好了。
def get_file_template():
    import sys
    try:
        with open('file_template.xml', 'r', encoding='utf-8') as f:
            return f.read().strip()
    except Exception as e:
        print(e)
        sys.exit(-1)


def get_imgs_xml():
    static_duration = 25.0
    transition_duration = 2.0
    files = [
        # 你的图片的绝对路径,如'/home/xxx/图片/1.png'
    ]
    one_img_template = '''
  <static>
    <duration>static_duration</duration>
    <file>cur_path</file>
  </static>
  <transition>
    <duration>transition_duration</duration>
    <from>cur_path</from>
    <to>next_path</to>
  </transition>
'''.lstrip('\\n')
    a = []
    for i, cur_path in enumerate(files):
        next_path = files[(i + 1) % len(files)]
        a.append(one_img_template.format(
            cur_path=cur_path, next_path=next_path,
            static_duration=static_duration,
            transition_duration=transition_duration
        ))
    return ''.join(a)


if __name__ == '__main__':
    file_template = get_file_template()
    imgs_xml = get_imgs_xml()
    content = file_template % imgs_xml
    with open('focal.xml', 'w', encoding='utf-8') as f:
        f.write(content)

minidom版

命令式地操作xml,不符合直觉,感觉更难写!

from xml.dom.minidom import Document


def txt_node(txt):
    return doc.createTextNode(str(txt))


def sub_node(name, text):
    txt_nd = txt_node(text)
    node = doc.createElement(name)
    node.appendChild(txt_nd)
    return node


doc = Document()
root = doc.createElement('background')
doc.appendChild(root)
start_time = doc.createElement('starttime')
time_arr = [
    ('year', '2020'), ('month', '04'), ('day', '01'),
    ('hour', '00'), ('minute', '00'), ('second', '00')
]
for t in time_arr:
    txt = txt_node(t[1])
    t_node = doc.createElement(t[0])
    t_node.appendChild(txt)
    start_time.appendChild(t_node)
root.appendChild(start_time)

static_duration = 25.0
transition_duration = 2.0
files = [
    # 你的图片的绝对路径,如'/home/xxx/图片/1.png'
]
for i, cur_path in enumerate(files):
    # static node
    next_path = files[(i + 1) % len(files)]
    duration_node = sub_node('duration', static_duration)
    file_node = sub_node('file', cur_path)
    static_node = doc.createElement('static')
    static_node.appendChild(duration_node)
    static_node.appendChild(file_node)
    # transition node
    duration_node = sub_node('duration', transition_duration)
    from_node = sub_node('from', cur_path)
    to_node = sub_node('to', next_path)
    transition_node = doc.createElement('transition')
    transition_node.appendChild(duration_node)
    transition_node.appendChild(from_node)
    transition_node.appendChild(to_node)

    root.appendChild(static_node)
    root.appendChild(transition_node)
with open('focal_minidom.xml', 'w', encoding='utf-8') as f:
    f.write(doc.toprettyxml(indent='  ', encoding='utf-8').decode('utf-8'))

以上是关于Ubuntu写python脚本实现自定义壁纸幻灯片:Vue法字符串拼接法minidom法的主要内容,如果未能解决你的问题,请参考以下文章

Vue+element_ui生成Ubuntu自定义壁纸幻灯片的核心xml文本

Vue+element_ui生成Ubuntu自定义壁纸幻灯片的核心xml文本

ubuntu 下用python写了个生成动态壁纸的脚本,如果通过代码实现使用这个xml,而不是通过桌面->背景->添加

适用于Ubuntu 18.04的4款最佳壁纸自动切换软件

桌面太单调?一起用Python做个自定义动态壁纸,竟然还可以放视频!

Android自定义动态壁纸开发