Posted at

ScrolledTextで最後の行を表示する

Tkライブラリに収録されているScrolledTextでは、テキストをユーザーが入力したときは、入力部分が画面に表示されるよう、必要に応じてスクロールされます。

ただし、プログラムからScrolledText#insert()などでテキストを挿入した場合は、スクロールされず、スクロールバーの表示幅だけが更新されてしまいます。これを表示できるようにしたいという話。

資料はなかなか見つかりませんが、やることは単純で、テキストを挿入した後ScrolledText#yview_moveto(1)というメソッドを呼べば良いです。1が何を示しているのかは分かりませんでしたが周辺の文脈からするとおそらくスクロールの位置でしょう(0~1)。


今回の思考プロセス

いちおうこれだけではなんなので、今回の思考プロセスをメモしておきます。


  1. ScrolledTextに文字を書き込んだときに、テキストが見えなくなっていることを確認

  2. 「Python ScrolledText」で検索したところとりあえずほとんどろくに何も書かれていないPythonの公式リファレンスにたどり着く

  3. (初手で情報量のこんなに少ない公式リファレンスが出てきてしまう以上、)これ以上ググっても無駄そうなのでリンクよりソースコードを見る

  4. ScrolledTextはScrollBarTextの複合コントロールであることが分かったのでScrollBarのソースコードを見る


  5. ScrollBar#set()メソッドあたりが願いを叶えてくれそうなので使ってみるも意味が無かったので諦める

  6. ScrolledTextのソースコードで気になったyviewという文言を頼りにTextのソースコードを見る

  7. コード内をyviewで検索したところなんかそれっぽいメソッドを見つけたので、改めて「Python Scrollbar yview_moveto」でググる


  8. Stackoverflowのそれらしい記事を見つけたので、該当メソッドを使っている回答を探す。その値をそのまま入れて実行

  9. 動いた!

なにかの機能を探すときの参考になれば幸いです。


というわけで

Tkinterはクラスの記述がどこにあるのか分かりにくいのと、パラメータやプロパティに設定できる値が書かれてなかったりとドキュメントコメントがイマイチ機能していないので嫌ですね(Tkを熟知している前提なのかそうでないのか不明ですが)。

これからPythonでGUIのアプリを書きたいというときは素直にPyWebViewなどを使いましょう。