経緯
日頃貯めている画像たちをWindowsの背景にスライドで頻繁に切り替えたくなった。
当然Windowsのスライドショー機能を試したが2つの問題があった。
- 切り替えの時間を秒単位に指定できない
- モニタ2個使っていると交互に切り替わる
ノートパソコンのモニタと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じゃなくてショートカットキーとかでいつでも止められるようにしたい
お願い
コーディングの指摘大募集です。
よろしくお願いします。