表題の通り、JupyterLab でボタンによる操作などのコールバックで、セル出力を更新する場合の方法。
結論
ipywidgets.Output
を使う。
経緯
以前GoogleColabで強化学習AIとの対戦(GoogleColabでインタラクティブな処理をする)を行ってみたが、PCを自作したのでローカルマシンに入れたJupyterLab上で同様なことをやろうとしたところつまづいた。
ボタンのコールバックで盤面を更新してセルに出力していたのだが、IPython.display
の出力がセルの出力ではなくログに出力されてしまうため、Colabで動かした時とは違って、更新内容が反映されなくなってしまった。
方法
どうしたもんかとググったところやり方が見つかった: Updating output of cell after end of execution · Issue #4963 · jupyterlab/jupyterlab · GitHub
つまるところ、ipywidgets.Output
を使うといいらしい。
セル内で out = Output()
として作成しておいて、IPython.display
のdisplay
やclear_output
を呼んでる箇所でwith out:
としてもよいし、
ボタンのクリックハンドラ関数にデコレータ@out.capture()
を指定してもよい。
動作原理はよく理解してないが、with
やデコレータの関数での前後で出力先をそのOutput
が関連しているセルに出力するよう切り替えてるんだろう、たぶん。
Colabで動くか?
逆にGoogleColabでipywidgets.Output
を指定したらどうなるか試してみたところ、つけても問題なく動くようだった。
そういう指定をしなくても動くColabはどうなっているのか、神。