Python 3.0 Hacks

第3回 turtleモジュールで図と戯れる

この記事を読むのに必要な時間:およそ 3 分

イベントハンドリング

turtleモジュールはtkinterを利用して作られていますので,tkinterのイベントハンドリングがそのまま利用できますが,一般によく使うイベントに関しては,単純化して利用しやすくしてあります。

イベントハンドリングは以下の2グループに分かれています。

  • Turtleオブジェクトのためのイベントハンドリング
  • Screenオブジェクトのためのイベントハンドリング

Turtleオブジェクトのイベントハンドラでは,マーカー(亀マークや三角マークなど)をマウスカーソルで操作したときの挙動をカスタマイズします。

def イベントハンドラ(x,y):
  ... #任意の記述

というような関数定義をしておいて,

turtle.onclick(イベントハンドラ)

というような操作をしておくと,turtleオブジェクトをクリックしたときに任意の挙動を実行します。

Turtleオブジェクト用のイベントには以下の3つがあります。

表3

イベント 動作
onclick クリックしたときに実行する関数を登録
ondrag ドラッグしたときに実行する関数を登録
onrelease クリックを解除したときに実行する関数を登録

Screenオブジェクトとは,描画が行われるキャンバスのことです。Screenオブジェクト用のイベントには以下の3つがあります。

表4

イベント 動作
onkey キーボードのキーを押したときに実行する関数を登録
onscreenclick スクリーンをクリックしたときに実行する関数を登録
ontimer 指定時間経過時に実行する関数を登録

「onkey」「ontimer」のイベントハンドラ関数は引数なしです。その他のマウスカーソルに関わるイベントハンドラ関数では引数に「x」「y」が渡されますが,それらは実際のマウスカーソルの位置です。

サンプル3 - スクリーンクリックイベント

クリックしたところにタートルが移動します図3⁠。

リスト3

from turtle import *
t = Turtle()         # タートルオブジェクトの作成
def click(x,y):      # イベントハンドラの定義
  t.setpos(x,y)      # クリック座標に移動
onscreenclick(click) # イベントハンドラの登録
mainloop()           # イベントループ

図3 リスト3の実行結果

図3 リスト3の実行結果

サンプル4 - キーイベントハンドリング

エスケープキーを押すと終了します。

リスト4

from turtle import *
def escape():
  bye()
onkey(escape, 'Escape')
listen()
mainloop()

onkeyの第2引数は必須でキーシンボルが必要です。また,⁠listen()」という記述はウインドウフォーカスを獲得する関数です。⁠bye()」はウインドウを閉じてメインループを終了する関数です。

サンプル5 - タイマーイベントハンドリング

1秒ごとに時計回りを6度ずつ移動させる(時計の秒針のような動き⁠⁠。

リスト5

from turtle import *
t = Turtle()
def tick():
  t.circle(-100, 6)
  ontimer(tick, 1000)
ontimer(tick, 1000)
mainloop()

図4 リスト5の実行結果

図4 リスト5の実行結果

著者プロフィール

入江田昇(いりえだ のぼる)

メカ整備やエレクトロニクス系の業務が長く,ロボットに関わることが多い。国のRTミドルウェアプロジェクトでPythonを強く推した張本人。Python/C++を中心に制御ソフトや業務支援ツールなどをよく作成している。自分でブログシステムを構築し,Pythonに関するサイトを運営しながらWeb系の勉強中。最近はFPGAロジックをPythonで書くのが楽しい。