見出し画像

活動報告16(2022年2月)

プロジェクト薬箱「Python編(中級3)」
 今月はtkinterによるGUIの実践編。薬箱のGUIをデザインする前に、腕試しとしてオリジナルのプログラムを何本か作ってみることにした。

1本目は、カラーチャート。GUIの配色を考えるにあたり、色見本があった方が試しやすい。RGB指定によれば16bit 4096色まで設定できるが、分かりづらいので色名称の指定で作ってみる。ネット上に色の名称一覧があるのでコピーして準備完了。
 まずLabelのpack()配置を利用することでとりあえず作成できたが、色が多すぎてrootウィンドウの幅に収まりきらない。ということでスクロールバーが必要となるのだが、ここからが試行錯誤の連続。その理由は、tkinterでは仕様上Label上にスクロールバーを付けることができないから。そこでCanvasの上にLabelを重ねてみたのだが何故か上手くいかない。検索を繰り返しようやく解決。それはCanvasの上にFrameを重ねてさらにその上にgrid()配置でLabelを置くこと。何故二つ重ねると可能になるのか不明だが良しとする。これで479色のカラーチャートが完成した(タイトル画左)。

2本目は、数学的なプログラム。素数を発見するためのアルゴリズムであるエラトステネスの篩をGUIで動的に再現してみる。直接素数を求めるものではダメで、倍数を除外していって最後まで残ったのが素数になる、というプログラム上の工夫が必要。ここまでは簡単だったが、tkinterで実装するのに苦労。
 とりあえず99までの数字で試してみる。最初はButtonやLabelを100個作ろうとしたけど、その属性を動的に変化させる良い方法が見つからない。Canvasなら動的に表現できるので、二重のforループで10×10で100個の四角形を描き、その上に数字を順番に重ねることで、GUIの静的なイメージは完成。

次に、100個の四角形の属性を、時間差をもって順次変化させる方法を検討。ここではClassを利用し、100個のインスタンスを一気に作る。相変わらず初期化メソッドの引数の処理と、インスタンス変数のselfで四苦八苦する。
 とりあえず走らせてみたら一瞬で処理が終了。GUI上の処理速度を目で追えるように、sleep()関数を使ってみたら動作しない。その時点に至りtkinterでmainloop()を使う理由をようやく理解できた。tkinterに限らず大抵のGUIプログラムに、「loop」があるのは、画面表示やキー入力等のイベントを無限ループ処理しており、それは事前にコードの読み込みが既に終わっているということを意味している。だから、sleep()関数を使っても、コードの読み込みが遅れるだけで無意味。したがって、この場合はafter()メソッドを用いて特定の処理を遅らせることが正解となる。ここでようやくイメージ通りの動作を実現できた。
 最後に、数字を999まで拡張。表示領域が拡大するのでスクロールバーを付けたら機能しなかったり、0埋めの3桁の数字が未完成なため2桁の数字が反応しなかったり、この段階でも紆余曲折を繰り返す。しかし、ネットから機能するコードを移植したりして、ようやく完成(タイトル画右)した。

何も参照せずに完成という訳にはいかなかったが、特に2本目は生涯最初のオリジナルのプログラムといえると思う。しばし達成感に酔いしれる。やはりCUIに比べてGUIは見映えがして訴求力があるので、今後も常にGUIを意識してプログラミングしていきたい。ただし、tkinterについての情報は、日本語のものは少なく、あったとしても初心者レベルのものが多いので、今後も苦労しそうだ。

この記事が気に入ったらサポートをしてみませんか?