はじめに
「その日によって流す画像を切り替えたい」
「推しの誕生日にお祝いスライドショーを流したい」
「家族や恋人との思い出の日々をスライドショーで振り返りたい」
これらを一度に実現できるフォトフレームカレンダーって、意外と見られないんですよね。
ということで、作っちゃいました。
使用言語はPython、Raspberry Pi上で動作させ、7インチディスプレイに出力させることを想定してます。
Pythonを使ったフォトフレームもしくはカレンダーの作り方は数多く公開されてますので、それらの技術をTkinter上で複合させてみました。
実装した機能
- カレンダーの日付が押しボタンになっている
- クリックするとその日の六曜、旧暦、祝日名、設定したイベント名を確認できる
- カレンダーの表示年月を自由に変更できる
- フォトフレームで、日毎に設定したイベントの写真を自動で切り替えられる
- イベントが複数重なってたら全部流す
- イベントを設定していない日には、月毎に共通で設定した画像を流す
折角Raspberry Pi上で動かすので、以下をおまけで追加
- アナログ時計
- 安眠用の渓流音を設定した時間帯に流す
使い方
インストール
1.動作させるPC上に上記リンクのリポジトリをクローン
2.動作に必要なライブラリをインストール
- Pillow
- pyaudio
- pyautogui
- schedule
- qreki(旧暦の出力、fgshun氏のqreki_pyを利用)
設定
settingsフォルダ内に配置しているConfigure.json及びEventDB.csvの内容を動作環境に応じて変更する。
{
"SlideShow": {
"Interval": 10,
"BaseFolder": "sampleimages",
"MonthComm": {
"1": "01_Common_Jan",
"2": "02_Common_Feb",
"3": "03_Common_Mar",
"4": "04_Common_Apr",
"5": "05_Common_May",
"6": "06_Common_Jun",
"7": "07_Common_Jul",
"8": "08_Common_Aug",
"9": "09_Common_Sep",
"10": "10_Common_Oct",
"11": "11_Common_Nov",
"12": "12_Common_Dec"
}
},
"StreamSound": {
"FileName": "stream.wav",
"Start": "00:00",
"End": "03:00"
}
}
- "Slideshow":スライドショーの設定
- "Interval":画像の切り替え間隔(単位:秒)
- "BaseFolder":画像を格納するルートフォルダのパス
- "MonthComm":月毎共通の画像格納フォルダ名(イベントを設定していない日に表示させる画像を格納、"BaseFolder"内に配置することが前提)
画像の切り替え間隔を5秒、Raspberry Piに接続したUSBメモリ(KIOXIA製)から画像を呼び出す場合の設定は以下の通り。
{
"SlideShow": {
"Interval": 5,
"BaseFolder": "/media/XXX/KIOXIA/",
(以下省略)
}
- "StreamSound":渓流音の設定
- "FileName":出力させる音声ファイル名(soundsフォルダ内に格納されているファイル名と一致させること)
- "Start":出力開始時刻
- "End":出力停止時刻
EventDB.csvには、下表のようにイベントの月日と名称、スライドショーに流す画像の格納フォルダ名を記入する。なお、格納フォルダはConfigure.jsonの"BaseFolder"に記入したフォルダへ配置することが前提。
格納フォルダ名を記載しない場合、日付詳細画面にイベント名が表示されるのみ。
Month | Day | Name | ImageFolder |
---|---|---|---|
月 | 日 | イベント名 | (スライドショーを流す場合のみ)画像格納フォルダ名 |
プログラム起動
上記のインストール及び設定を行った後、pythonコマンドでmain.pyを実行する。
python3 main.py
以下の画面が表示される。
起動直後は上記のように滝の画像(top_sample.jpg)が表示されるが、しばらくするとスライドショーに流す画像が表示される。
画面毎の機能説明
フォトフレームカレンダー画面(初期画面)
①:今月のカレンダー表示に戻すボタン
②:前月/翌月のカレンダーを表示するボタン
③:表示されているカレンダーの年月を表示及び選択。1900年~2100年まで選択できる
④:カレンダー。日付はボタンとなっており、押下することで下記の詳細画面に遷移する。今日のボタンは背景色が変わる
⑤:ディジタル時計
⑥:フォトフレーム。月毎及びEventDB.csvで設定した日によって流す画像を変えられる
日付詳細画面
①:カレンダーで選択した日付の詳細を表示。祝日名、干支、和暦、旧暦、六曜、二十四節季を表示する。EventDB.csvにイベントを設定している場合、イベント名を表示する(同日に複数のイベントを設定している場合、全て表示)
②:前日/翌日の詳細を表示するボタン
③:アナログ時計。針は外側から内側に向いている(元ネタは、ゲーム テイルズオブエクシリア2の主人公ルドガーの懐中時計)
アナログ時計の文字盤(clock_oval.jpg)は、リンクのフリー素材を加工して使用。
メニューバー
全画面で共通
プログラムは必ず「Screen Close」で停止すること。
安眠用渓流音
直接関係ない機能だが、Raspberry Piで動かすならついでに安眠用として渓流音流そうと思い追加。
Configure.jsonで音の種類及び再生時刻を自由に設定できるようにした。
デフォルトでは効果音ラボのフリー素材「渓流」をwavファイルに変換して使用。
別の音声ファイルを使用する場合、必ずWAVファイルを使用すること。
プロジェクト内フォルダ構成
TkinterPhotoFrameCalendar
├ AppCodes
| ├ ApplicationMain.py
| ├ BaseLibrary.py
| ├ CalendarWindow.py
| ├ Configuration.py
| ├ DayDetailWindow.py
| ├ ImportCommon.py
| └ OutputMedia.py
├ images
| ├ AnalogClock
| | └ clock_oval.jpg
| ├ Slideshow
| | ※スライドショー表示画像を保存。プログラム起動時に自動生成され、停止時に削除される
| └ top_sample.jpg
├ settings
| ├ Configure.json
| └ EventDB.csv
├ sounds
| └ stream.wav
└ main.py
スライドショー表示画像
テストイベント及び月毎共通画像のサンプルをリポジトリ内に保存している。
初期画像(top_sample.jpg)も含めて、Grokで生成。
TkinterPhotoFrameCalendar
├ TkinterPhotoFrameCalendar
└ sampleimages
├ 01_Common_Jan
├ 02_Common_Feb
├ 03_Common_Mar
├ 04_Common_Apr
├ 05_Common_May
├ 06_Common_Jun
├ 07_Common_Jul
├ 08_Common_Aug
├ 09_Common_Sep
├ 10_Common_Oct
├ 11_Common_Nov
├ 12_Common_Dec
├ Test_Event_1
├ Test_Event_2
└ Test_Event_3
参考URL