Kon's DX Lab - Case Study

Day 19 | カレンダーが描画されない?DOMと高さの落とし穴を突破した日

Published on 2025-04-20

🔬 Case Study Summary
Problem

(ここに課題を記述)

Result

(ここに具体的な成果を記述)


Tech & Process

(ここに採用技術とプロセスを記述) コードを詳しく見る »

こんにちは、こんです🦊

Streamlitで工数記録アプリを作っているこのシリーズ。前回導入した streamlit-calendar を timer.py に組み込んだところ、カレンダーが描画されない…!? というトラブルに直面しました。

しかしついに本日、カレンダービューの描画に成功しました🎉 今回はその過程で判明した“本当の原因”と、その回避策をまとめておきます!


😫 状況:calendar_demo.pyでは表示されるのに、timer.pyでは出ない

前回 calendar_demo.py を使ったときは問題なくカレンダー表示できていたのに、 同じイベント構造・同じオプション設定を使っても、timer.py に組み込むとカレンダーがまったく表示されない現象が発生。

ログをいくら出しても、eventsの中身は正常。 それでも画面上に何も出ない、空白だけの状態に…!


🔍 仮説検証:一つずつ潰していく

  • ✅ events の中身:正常(start / end / title あり)

  • ✅ display: "block":指定済み

  • ✅ user_name によるフィルター:意図通り

  • ✅ initialDate の指定もOK

それでも表示されない。


💥 原因その1:カレンダーをタブ内で描画していた

実は streamlit-calendar(内部でFullCalendar使用)は、非表示DOM(例:タブやアコーディオン)の中で初期化すると描画に失敗します。

これは FullCalendar の既知の制約で、div のサイズが 0px の状態で初期化すると、表示領域を正しく計算できないからです。

🛠 解決策: calendar() の呼び出しをタブ外に出す or 常時表示領域で呼び出すように修正。


💥 原因その2:height 未指定で描画失敗

FullCalendar は height を自動で判断できないケースがあり、 Streamlit 内では明示的に "height": 700 などを設定しないと描画されないことがあります。

🛠 解決策: options に "height": 700 を追加して強制表示。


🎯 最終的な構成(成功版 timer.py)

  • 🔽 Streamlit Calendar によるカレンダー表示(list / month / day)

  • ✅ FullCalendarの初期表示週は initialDate でイベント週に合わせて表示

  • ✅ calendar() はタブ外に出して常に描画できるように配置

  • ✅ height を指定してレイアウト崩れを防止


📌 まとめ:表示されないとき、"中身"ではなく"描画環境"が原因かも

今回の学びは、データが正しくても描画に失敗するケースがあるということ。 特に streamlit-calendar(=FullCalendar)を使うときは:

  1. initialDate で適切な週を表示

  2. calendar() は 非表示UI内で呼び出さない

  3. height は明示的に指定する

この3つを守ると、描画トラブルは一気に減ります!


💡 次にやりたいこと

  • 🔸 status(予定/実績)ごとに色分けしたい

  • 🔸 project_name ごとのフィルターUIを追加したい

  • 🔸 イベントクリック時の編集UIを追加したい


まとめ:失敗を見つめた先に、成功のヒントがある

今回のように、見えない・動かないときでも「ひたすら分解&検証」を繰り返すと、いつか「なるほど!」の瞬間がやってきます。

明日はもっと “使えるUI” に進化させていきます🦊


#100日チャレンジ
#DX実験記録
#業務改善
#ノーコード
#Streamlit
#タイムトラッカー
#カレンダーUI
#ChatGPTで業務効率化