3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-09-11

経緯

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

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

背景設定.png

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

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

使ってみたい方はこちら

確認環境

  • 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をつかって
色だけ指定する方法がわからなかった。

ちなみに32bit版 Windowsの場合はこれを使うらしい

ctypes.windll.user32.SystemParametersInfoA

機能追加予定

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

お願い

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

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?