• Ubuntu写python脚本实现自定义壁纸幻灯片:字符串拼接法、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
    
    • 1

    配置文件写法

    原有内容结构如下:

    <background>
      <starttime>
        <year>2020year>
        <month>04month>
        <day>01day>
        <hour>00hour>
        <minute>00minute>
        <second>00second>
      starttime>
      
      
    background>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

      <static>
        <duration>25.0duration>
        <file>/home/xxx/图片/壁纸1.pngfile>
      static>
      <transition>
        <duration>2.0duration>
        <from>/home/xxx/图片/壁纸1.pngfrom>
        <to>/home/xxx/图片/壁纸2.pngto>
      transition>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    因此,我们只需要提供: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}
        {cur_path}
      
      
        {transition_duration}
        {cur_path}
        {next_path}
      
    '''.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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    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'))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
  • 相关阅读:
    短视频矩阵系统源代码开发,独立saas系统搭建oem源码部署
    4本建模必读的书籍,每天学一点,获益匪浅
    马来酰亚胺聚谷氨酸天冬氨酸聚合物药物载顺铂/mPEg-PGA纳米微球的制备
    C++:继承、模板、CRTP:谈谈C++多态设计模式(二)
    (详解)Vue自定义指令
    【【萌新的riscV的学习之关于risc指令集的学习使用总五】】
    使用 SAP UI5 绘制 Business Rule Control
    B端产品经理和C端产品经理,做哪个更好?
    ELK下载(Elasticsearch、Logstash、Kibana)
    [学习笔记] 概率与期望及其应用
  • 原文地址:https://blog.csdn.net/hans774882968/article/details/126215309