Python 2.5以前からある「turtle」モジュールが、Python 2.6/3.0からパワーアップしています。新しいturtleモジュールを利用すると、オブジェクト指向アプローチでさまざまなデータの可視化ができます。turtleモジュールはtkinterを利用しただけの単一モジュールになっており、140Kバイトもあります。すべての機能を紹介することはこのスペースでは無理ですので、主要な機能だけをダイジェストで紹介します。
プロッティング
このモジュールにおいて最も重要な「Turtleオブジェクト」はペンプロッタのような役割を持っています。
以下のコードで、Turtleオブジェクトを作成できます。
ペンプロッタのような役割として、以下のメソッドがあります。
表1
メソッド |
動作 |
t.penup() |
ペン先をキャンバスから離す |
t.pendown() |
ペン先をキャンバスに置く |
t.setpos(x, y) |
任意の座標まで移動する |
t.pencolor('red') |
線の色を変更する |
t.pensize(3) |
線の太さを変更する |
t.write('hello!') |
現在位置のすぐ上に文字列を描画 |
ペンプロッタではペンの現在位置を保持して動作しますが、Turtleオブジェクトではさらに「向き」を保持しています。そして、Turtleオブジェクトが自ら動く以下のような指令も持っています。
表2
メソッド |
動作 |
t.forward(10) |
現在の向きに10距離前進する |
t.left(10) |
10度左に向きを変える |
t.right(10) |
10度右に向きを変える |
t.circle(50,240) |
回転半径50で270度の円弧を描くように進む |
これらの指令は、turtleモジュールに定義されているTurtleクラスのインスタンスに対して使うのが普通ですが、turtleモジュールそのものに対して使う方法もあります。この場合、Turtleインスタンスを作らなくても自動的に作成してくれるようです。
サンプル1
リスト1のコードで陰陽太極図のようなマーク(図1)が描けます。
図形の塗りつぶしを行いたい場合は、リスト2のように「fillcolor」指定ののち一連の図形描画命令を「begin_fill()」「end_fill()」の2命令で囲んでください。
サンプル2 - 塗りつぶし
閉じた図形ではない場合は、始点と終点が接続されたように塗りつぶします。
イベントハンドリング
turtleモジュールはtkinterを利用して作られていますので、tkinterのイベントハンドリングがそのまま利用できますが、一般によく使うイベントに関しては、単純化して利用しやすくしてあります。
イベントハンドリングは以下の2グループに分かれています。
- Turtleオブジェクトのためのイベントハンドリング
- Screenオブジェクトのためのイベントハンドリング
Turtleオブジェクトのイベントハンドラでは、マーカー(亀マークや三角マークなど)をマウスカーソルで操作したときの挙動をカスタマイズします。
というような関数定義をしておいて、
というような操作をしておくと、turtleオブジェクトをクリックしたときに任意の挙動を実行します。
Turtleオブジェクト用のイベントには以下の3つがあります。
表3
イベント |
動作 |
onclick |
クリックしたときに実行する関数を登録 |
ondrag |
ドラッグしたときに実行する関数を登録 |
onrelease |
クリックを解除したときに実行する関数を登録 |
Screenオブジェクトとは、描画が行われるキャンバスのことです。Screenオブジェクト用のイベントには以下の3つがあります。
表4
イベント |
動作 |
onkey |
キーボードのキーを押したときに実行する関数を登録 |
onscreenclick |
スクリーンをクリックしたときに実行する関数を登録 |
ontimer |
指定時間経過時に実行する関数を登録 |
「onkey」と「ontimer」のイベントハンドラ関数は引数なしです。その他のマウスカーソルに関わるイベントハンドラ関数では引数に「x」と「y」が渡されますが、それらは実際のマウスカーソルの位置です。
サンプル3 - スクリーンクリックイベント
クリックしたところにタートルが移動します(図3)。
サンプル4 - キーイベントハンドリング
エスケープキーを押すと終了します。
onkeyの第2引数は必須でキーシンボルが必要です。また、「listen()」という記述はウインドウフォーカスを獲得する関数です。「bye()」はウインドウを閉じてメインループを終了する関数です。
サンプル5 - タイマーイベントハンドリング
1秒ごとに時計回りを6度ずつ移動させる(時計の秒針のような動き)。
まとめ
プロッティングとイベントハンドリングを駆使することで、チャート描画に用いたり、グラフ理論等の可視化に用いることもできます。対話的に操作できるというのがこのturtleモジュールの特徴でもあります。私の場合、ロボットの経路アルゴリズム動作の可視化などに使っています。
今回は主要機能だけを紹介しました。以下のリファレンスページをご覧いただければ、もう少し凝ったことができます。
おまけ
最後にちょっとお遊びなサンプルを紹介します。ロボット関連開発では実機テストが自由にできる期間が限られるので、動作アルゴリズムの検証にこういったビジュアライザがあると非常に助かります。ここでは、ラジコンカーのシミュレータを作成してみます。ジョイスティックを模した赤い丸をドラッグすることで「車を模した亀」を操縦できます。