我想用 Qtile 每 10 分钟(或任何其他任意时间)更改桌面壁纸。我目前有一个用 bash 编写的脚本,用于feh
设置壁纸,但这并不理想,因为如果 Qtile 启动多次(注销、登录),则该脚本的多个实例将在后台运行。
所以,我想在 Qtile 的配置中实现这个。
Screen
Qtile 允许您通过属性设置对象的壁纸wallpaper_image
。它还有一个用于其脚本外壳的命令,允许您对其进行设置。
所以,我需要的是一个每 10 分钟运行一次的 Python 函数(当然不会停止整个操作系统)并设置它。我该怎么办?
答案1
我已经成功地用以下代码片段实现了这一点:
import os
import random
from libqtile import qtile
from typing import Callable
from settings import WALLPAPERS_PATH
class Timer():
def __init__(self, timeout: int, callback: Callable) -> None:
self.callback = callback
self.timeout = timeout
self.call()
def call(self) -> None:
self.callback()
self.setup_timer()
def setup_timer(self) -> None:
self.timer = qtile.call_later(self.timeout, self.call)
def set_random_wallpaper() -> None:
wallpapers = [
os.path.join(WALLPAPERS_PATH, x) for x in os.listdir(WALLPAPERS_PATH) if x[-4:] == ".jpg"
]
wallpaper = random.choice(wallpapers)
set_wallpaper(wallpaper)
def set_wallpaper(file_path: str) -> None:
for screen in qtile.screens:
screen.cmd_set_wallpaper(file_path, 'fill')
我创建一个Timer
类来自动设置它。您只需创建一个Timer
对象,一旦触发回调,它就会自行重新启动。它还会在创建时调用回调,但如果您愿意,更改起来很简单。
要在启动时运行它,请执行以下操作:
@hook.subscribe.startup_once
def setup_wallpaper_timer():
wallpaper.Timer(
WALLPAPER_TIMEOUT_MINUTES * 60, wallpaper.set_random_wallpaper)