hans7 发表于 2022-8-7 18:39

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

本帖最后由 hans7 于 2022-8-9 01:58 编辑

### 环境

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

**作者:(https://blog.csdn.net/hans774882968)以及(https://juejin.cn/user/1464964842528888)**

### 配置文件何在

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

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

```
sudo chmod 777 focal.xml
```

### 配置文件写法

原有内容结构如下:

```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如下:

```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

[传送门](https://juejin.cn/post/7129561844678656007)

#### 字符串拼接版

关于脚本:

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. 修改后不会立刻生效,目前我是用重启解决这个问题的。如果能找到对应的进程,手动重启它,就更好了。

```python
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,不符合直觉,感觉更难写!

```python
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)
    t_node = doc.createElement(t)
    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'))
```

tlpking 发表于 2022-8-8 07:48

思维敏捷,高手

唐子啊 发表于 2022-8-8 10:20

思维敏捷,高手

virsnow 发表于 2022-10-2 15:09

好好来学习一下
页: [1]
查看完整版本: Ubuntu写python脚本实现自定义壁纸幻灯片:Vue法、字符串拼接法、minidom法