Help us understand the problem. What is going on with this article?

Windowsの壁紙スライダーをpythonで作ってみた

経緯

日頃貯めている画像たちをWindowsの背景にスライドで頻繁に切り替えたくなった。
当然Windowsのスライドショー機能を試したが2つの問題があった。

  • 切り替えの時間を秒単位に指定できない
  • モニタ2個使っていると交互に切り替わる

背景設定.png

ノートパソコンのモニタとHDMIで外部接続のモニタの2つを使っていると片方ずつ切り替わるようで、2分に1回ずつ切り替わる。
外部接続のモニタは「デジタルフォトフレーム」のようにしたかった。

探せばツールがあると思うがpythonの勉強がてら作ってみることにした。

使ってみたい方はこちら

https://github.com/HyunwookPark/background-slider

確認環境

  • Windows10 Pro
  • python3

動き

指定ディレクトリの画像をWindowsの背景として3秒おきに切り替える。
順序はファイル名の昇順。
プログラムを止めると実行前の背景に戻る。たぶん。

使い方

1. 画像が入っているディレクトリパスをtxtに記載

path.txtというファイルが入っているので好きなディレクトリに書き換える。

ex.

D:\あんな画像やこんな画像のディレクトリ

※日本語ディレクトリ名OK
※ディレクトリ名のうしろは\ありでもなしでもOK

2. メインのプログラムを実行

> python bg.py

コードはこちら。

import ctypes
import os
import glob
import time
import threading
import random
import codecs
import sys

INTERVAL_SEC = 3


class BgSlider():
    def __init__(self):
        self.index = 0
        self.directory = None

    def setup(self):
        global off
        with codecs.open('path.txt', 'r', 'utf-8') as f:
            lines = f.readlines()
            self.directory = lines[0].strip()

    def worker(self):
        path = self.directory + r'\*.jpg'
        path.replace('\\\\', '\\')
        files = glob.glob(path)
        # [print(file) for file in files] # ファイルリストをコンソールにまとめて出力するときに使う
        # file = files[random.randint(0, len(files) - 1)] # ランダムにしたい場合はここを使う
        files = sorted(files) # 順番に表示したい場合はここを使う
        file = files[self.index] # 順番に表示したい場合はここを使う
        print(file)
        ctypes.windll.user32.SystemParametersInfoW(20, 0, file, 0)
        if self.index == len(files) - 1:
            self.index = 0
        else:
            self.index += 1
        time.sleep(INTERVAL_SEC)

    def schedule(self, interval, f, wait=True):
        base_time = time.time()
        next_time = 0
        while True:
            try:
                t = threading.Thread(target=f)
                t.start()
                if wait:
                    t.join()
                next_time = ((base_time - time.time()) % interval) or interval
                time.sleep(next_time)
            except KeyboardInterrupt:
                exit()


if __name__ == "__main__":
    try:
        bg = BgSlider()
        bg.setup()
        bg.schedule(INTERVAL_SEC, bg.worker, False)
    finally:
        ctypes.windll.user32.SystemParametersInfoW(20, 0, None, 0)

3. 止め方

Ctrl + C

※ボスがきたらこれ。

注意

このプログラムで切り替えた画像はWindowsの背景設定で画像の履歴として残る。

作ったときのメモ

参考

https://qiita.com/lobmto/items/6d3649e6c00b98553ca2
https://qiita.com/kurogelee/items/0e5fd8b6a1d1f169179a

地味にハマったところ

txtからパスを読み込んで使おうとしたところ、ファイルリストが取得できなかった。
原因は最後に改行コードが含まれていたため。

path = self.directory + r'\*.jpg'

このように*.jpgと連結時に改行込みになってしまっていた。

背景設定を色だけにできなかった

プログラム止めたときに背景を画像じゃなくて色だけにしたかったが
ctypes.windll.user32.SystemParametersInfoWをつかって
色だけ指定する方法がわからなかった。

機能追加予定

  • スライドの順序をランダム/昇順/降順選択できるようにしたい
  • Ctrl + Cじゃなくてショートカットキーとかでいつでも止められるようにしたい

お願い

コーディングの指摘大募集です。
よろしくお願いします。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away