Python Turtle入門: turtlesize()で描画オブジェクトの大きさを変えるテクニック
この関数は、引数を指定しない場合、現在のタートルのサイズ設定を返します。引数を指定する場合、タートルのサイズを設定します。
使用方法
turtle.turtlesize(stretch_wid=None, stretch_len=None, outline=None)
outline
(オプション): タートルの輪郭線の太さを指定します。指定しない場合、輪郭線は描かれません。stretch_len
(必須): タートルの横方向の倍率を指定します。デフォルトのサイズに対する比率です。stretch_wid
(必須): タートルの縦方向の倍率を指定します。デフォルトのサイズに対する比率です。
import turtle
# スクリーンとタートルオブジェクトを作成
wn = turtle.Screen()
t = turtle.Turtle()
# デフォルトサイズでタートルを描画
t.forward(100)
# タートルのサイズを2倍にする(縦横ともに)
t.turtlesize(stretch_wid=2, stretch_len=2)
t.forward(100)
# タートルの縦方向のサイズを3倍、横方向のサイズを0.5倍にする
t.turtlesize(stretch_wid=3, stretch_len=0.5)
t.forward(100)
# タートルのサイズをリセット(デフォルトに戻す)
t.turtlesize(stretch_wid=1, stretch_len=1)
t.forward(100)
# 輪郭線を追加する例
t.turtlesize(stretch_wid=2, stretch_len=2, outline=5)
t.circle(50)
wn.mainloop() # ウィンドウを閉じないようにする
AttributeError: 'Turtle' object has no attribute 'turtlesize'
原因
このエラーは、通常、turtle.turtlesize()
を呼び出すべきオブジェクトではないものに対して呼び出そうとした場合に発生します。例えば、turtle
モジュール自体に対して呼び出したり、タートルオブジェクトを正しく作成していない場合に起こりえます。
例
import turtle
# 間違い: turtle モジュールに対して直接呼び出している
# turtle.turtlesize(2, 2) # AttributeErrorが発生する可能性がある
# 正しい: タートルオブジェクトを作成してから呼び出す
my_turtle = turtle.Turtle()
my_turtle.turtlesize(2, 2)
トラブルシューティング
- 変数名が正しく、意図したタートルオブジェクトを指しているか確認してください。
turtlesize()
を呼び出す前に、必ずturtle.Turtle()
を使ってタートルオブジェクトを作成し、そのオブジェクトのメソッドとして呼び出しているか確認してください。
サイズが変更されない(特にGIFなどのカスタムシェイプの場合)
原因
turtlesize()
(またはそのエイリアスである shapesize()
) は、デフォルトのタートル形状(矢印、円、カメなど)や、addshape()
で追加されたポリゴン形状に適用されます。しかし、GIF画像などのビットマップ画像 (.gif
) をタートルの形状として設定している場合、turtlesize()
はその画像のサイズを変更しません。 これは、Tkinterのキャンバスが画像の拡大縮小を直接サポートしていないためです。
例
import turtle
wn = turtle.Screen()
wn.addshape("my_image.gif") # 仮にmy_image.gifがあるとする
t = turtle.Turtle()
t.shape("my_image.gif")
t.turtlesize(3, 3) # この場合、GIF画像のサイズは変更されない
トラブルシューティング
- デフォルト形状の使用
サイズを動的に変更したい場合は、カスタム画像ではなく、Turtleがサポートする組み込みの形状("arrow", "turtle", "circle", "square", "triangle", "classic")を使用することを検討してください。 - 画像のサイズ変更
GIF画像のサイズを変更したい場合は、Pythonの外部で画像編集ソフトウェアを使用するか、Pillow (PIL Fork) などの画像処理ライブラリを使ってプログラム内で画像をリサイズし、新しいリサイズされた画像を読み込む必要があります。
オンラインIDEでの制限
原因
一部のオンラインPython実行環境(Repl.itなど)では、turtle
モジュールの実装が標準のPythonディストリビューションとは異なり、一部の機能が省略されている場合があります。これには、turtlesize()
や shapesize()
が含まれることがあります。
トラブルシューティング
- オンラインIDEのドキュメントを確認し、
turtle
モジュールのどの機能がサポートされているかを確認してください。 - もしオンラインIDEで問題が発生している場合は、ローカルのPython環境(PCにインストールされたPython)でコードを実行してみてください。多くの場合、これにより問題が解決します。
引数の型エラー (TypeError) または値のエラー (ValueError)
原因
turtlesize()
は、stretch_wid
, stretch_len
, outline
の各引数に正の数(floatまたはint)を期待します。文字列や負の数、または予期しない型の値を渡すとエラーが発生します。
例
import turtle
t = turtle.Turtle()
# TypeError: 文字列を渡している
# t.turtlesize("two", 2)
# ValueError: 負の数を渡している
# t.turtlesize(-2, 2)
トラブルシューティング
- 負の値ではなく、正の値を使用してください。
- 引数に渡す値が正しい数値型(整数または浮動小数点数)であることを確認してください。
原因
これはエラーではありませんが、期待通りの視覚的な変化が見られない場合があります。
- update() の呼び出し忘れ
アニメーションをオフにしている場合 (turtle.tracer(0)
)、変更が画面に反映されるためにはturtle.update()
を手動で呼び出す必要があります。 - 描画が速すぎる
タートルの描画速度が速すぎると、サイズ変更の瞬間が見逃されることがあります。 - タートルの形状が単純すぎる
例えば、dot()
で描画された点や、非常に細い線は、turtlesize()
を使ってもサイズの変化が分かりにくい場合があります。
turtle.tracer(0)
を使用している場合は、turtlesize()
を呼び出した後にturtle.update()
を呼び出すことを忘れないでください。turtle.speed()
で速度を遅くするか、turtle.delay()
で描画遅延を設定して、変化を確認する時間を確保する。- より複雑な形状 (
t.shape("turtle")
やt.shape("square")
など) を使用して、サイズの変化がより明確にわかるようにする。
基本的な使い方:タートルのサイズを変更する
この例では、タートルを動かしながら、そのサイズを徐々に大きくしていきます。
import turtle
# スクリーンとタートルオブジェクトを作成
wn = turtle.Screen()
t = turtle.Turtle()
t.shape("turtle") # タートルの形状を「カメ」に設定
t.color("blue") # タートルの色を青に設定
t.speed(1) # 描画速度を遅めに設定(変化が分かりやすいため)
# サイズを徐々に大きくしながら四角形を描く
for i in range(4):
# stretch_wid: 縦方向の倍率, stretch_len: 横方向の倍率
# i の値によってサイズが変化します
t.turtlesize(stretch_wid=(i + 1) * 0.5, stretch_len=(i + 1) * 0.5)
t.forward(100)
t.right(90)
wn.mainloop() # ウィンドウを閉じないようにする
解説
t.shape("turtle")
:turtlesize()
の効果を明確にするため、「カメ」の形状を使用しています。デフォルトの矢印でも機能しますが、カメの方が変化が分かりやすいです。t.turtlesize(stretch_wid=(i + 1) * 0.5, stretch_len=(i + 1) * 0.5)
: ループの各ステップで、タートルの縦横のサイズが0.5
,1.0
,1.5
,2.0
倍と徐々に大きくなります。
縦横のストレッチを個別に設定する
縦方向と横方向のストレッチ(伸縮)を別々に制御することができます。
import turtle
wn = turtle.Screen()
t = turtle.Turtle()
t.shape("arrow") # 矢印の形状を使用
t.color("green")
t.speed(1)
# 縦に伸びるタートル
t.turtlesize(stretch_wid=3, stretch_len=1)
t.forward(100)
t.left(90)
# 横に伸びるタートル
t.turtlesize(stretch_wid=1, stretch_len=4)
t.forward(100)
t.left(90)
# デフォルトサイズに戻す
t.turtlesize(1, 1)
t.forward(100)
wn.mainloop()
解説
t.turtlesize(1, 1)
: 引数を1にすることで、タートルのサイズをデフォルトに戻します。t.turtlesize(stretch_wid=1, stretch_len=4)
: タートルの横方向のサイズが4倍になり、縦方向はデフォルトのままになります。t.turtlesize(stretch_wid=3, stretch_len=1)
: タートルの縦方向のサイズが3倍になり、横方向はデフォルトのままになります。
輪郭線の太さを設定する
outline
引数を使って、タートルの輪郭線の太さを指定できます。
import turtle
wn = turtle.Screen()
t = turtle.Turtle()
t.shape("circle") # 円の形状を使用
t.color("purple", "lightgreen") # 輪郭線が紫、塗りつぶしが薄緑
t.speed(1)
# 輪郭線なし(デフォルト)
t.turtlesize(2, 2)
t.forward(50)
# 輪郭線が太いタートル
t.turtlesize(2, 2, outline=5) # outline の値を大きくすると太くなる
t.forward(50)
# さらに太い輪郭線
t.turtlesize(2, 2, outline=10)
t.forward(50)
wn.mainloop()
解説
t.color("purple", "lightgreen")
のように2つの色を指定すると、最初の色が輪郭線(ペン)、2番目の色が塗りつぶし(フィル)の色になります。outline
が指定されていない場合、輪郭線は非常に細く、pencolor()
と同じ色になります。t.turtlesize(2, 2, outline=5)
: 縦横2倍のサイズで、輪郭線の太さが5になります。
現在のタートルサイズを取得する
引数なしで turtlesize()
を呼び出すと、現在のタートルのサイズ設定がタプルで返されます。
import turtle
t = turtle.Turtle()
t.shape("square")
# デフォルトのサイズを取得
current_size = t.turtlesize()
print(f"初期のタートルサイズ: {current_size}") # (1.0, 1.0, 1) が出力されることが多い
# サイズを変更
t.turtlesize(3, 2, 4)
# 変更後のサイズを取得
new_size = t.turtlesize()
print(f"変更後のタートルサイズ: {new_size}") # (3.0, 2.0, 4) が出力される
turtle.done() # ウィンドウを開いたままにする
解説
t.turtlesize()
: 引数なしで呼び出すと、(stretch_wid, stretch_len, outline)
の形式のタプルが返されます。これらの値は、それぞれ縦方向の倍率、横方向の倍率、そして輪郭線の太さを示します。
import turtle
import time
wn = turtle.Screen()
wn.tracer(0) # アニメーションをオフにする(描画を高速化)
t = turtle.Turtle()
t.shape("turtle")
t.color("red")
for i in range(1, 11):
t.clear() # 前の描画をクリア
t.turtlesize(stretch_wid=i * 0.2, stretch_len=i * 0.2)
t.stamp() # タートルの現在の形状をスタンプする
wn.update() # 画面を更新
time.sleep(0.1) # 0.1秒待つ
wn.mainloop()
time.sleep(0.1)
: 各フレーム間の短い遅延を作成し、アニメーション効果を生み出します。wn.update()
:tracer(0)
を使用している場合、この関数を呼び出すことで、保留中のすべての描画操作が画面に表示されます。t.stamp()
: タートルの現在の形状をキャンバスに「スタンプ」します。t.clear()
: 前回スタンプしたタートルを消去します。wn.tracer(0)
: タートルのアニメーションを一時停止します。これにより、すべての描画コマンドが即座に実行されず、wn.update()
が呼び出されるまで画面に表示されません。
turtle.shapesize() を使用する
これは事実上 turtlesize()
と同じ機能を提供します。turtlesize()
は shapesize()
のエイリアス(別名)です。両者は完全に同じように機能します。
例
import turtle
wn = turtle.Screen()
t = turtle.Turtle()
t.shape("circle")
t.color("red")
# turtlesize() と全く同じように機能する
t.shapesize(stretch_wid=2, stretch_len=2, outline=3)
t.forward(100)
wn.mainloop()
解説
- 機能的には
turtlesize()
と全く同じです。コードの読みやすさや個人の好みに応じて使い分けることができます。
turtle.setheading() と turtle.setx(), turtle.sety() などを使って、タートルの位置と方向を制御する
これは直接的な「サイズ変更」ではありませんが、タートルが描画する図形の大きさを制御する間接的な方法です。タートルの「ステップ」を調整することで、描画される図形全体のサイズを調整できます。
例
import turtle
wn = turtle.Screen()
t = turtle.Turtle()
t.shape("turtle")
t.color("blue")
t.speed(0) # 最速
# 小さい四角形を描く
t.forward(50)
t.left(90)
t.forward(50)
t.left(90)
t.forward(50)
t.left(90)
t.forward(50)
t.left(90)
t.penup() # ペンを上げる
t.goto(0, 100) # 位置を移動
t.pendown() # ペンを下ろす
# 大きい四角形を描く
t.forward(150) # 進む距離を長くする
t.left(90)
t.forward(150)
t.left(90)
t.forward(150)
t.left(90)
t.forward(150)
t.left(90)
wn.mainloop()
解説
forward()
メソッドの引数を大きくすることで、タートルが描く図形全体の大きさが変わります。これはタートル自体の表示サイズではなく、タートルの「歩幅」を調整する方法です。
turtle.pensize() または turtle.width() で線の太さを変更する
これはタートルの「形状」のサイズではなく、タートルが描く「線の太さ」を変更します。図形の見た目の太さに影響を与えます。
例
import turtle
wn = turtle.Screen()
t = turtle.Turtle()
t.color("red")
t.speed(1)
# 細い線で円を描く
t.pensize(1) # または t.width(1)
t.circle(50)
t.penup()
t.goto(0, -100)
t.pendown()
# 太い線で円を描く
t.pensize(5) # または t.width(5)
t.circle(50)
t.penup()
t.goto(0, -200)
t.pendown()
# さらに太い線で円を描く
t.pensize(10) # または t.width(10)
t.circle(50)
wn.mainloop()
解説
t.pensize(value)
またはt.width(value)
: タートルが描く線の太さをvalue
ピクセルに設定します。これは描画される図形自体の太さに影響します。
turtle.dot() で点のサイズを制御する
dot()
メソッドは、タートルの現在の位置に点を描画します。この点のサイズを直接指定できます。これはタートルの形状自体を変更するものではありませんが、点のサイズを制御するのに役立ちます。
例
import turtle
wn = turtle.Screen()
t = turtle.Turtle()
t.hideturtle() # タートルを非表示にする(点だけを見せるため)
t.color("orange")
t.speed(0)
# 小さい点を描画
t.dot(10) # 半径10の点
t.forward(50)
# 中くらいの点を描画
t.dot(20) # 半径20の点
t.forward(50)
# 大きい点を描画
t.dot(40) # 半径40の点
t.forward(50)
wn.mainloop()
解説
t.dot(size, color)
:size
には点の直径を指定します。color
はオプションで、点の塗りつぶし色を指定できます。
turtlesize()
はビットマップ画像(GIFなど)には適用されませんが、addshape()
を使って画像をタートルの形状として読み込むことで、タートルの見た目を完全に変更できます。この場合、画像自体をリサイズする必要があります。
例
import turtle
wn = turtle.Screen()
# GIF画像ファイルを用意する必要があります(例: "my_custom_image.gif")
# このコードを実行するディレクトリに画像を置いてください
try:
wn.addshape("my_custom_image.gif") # カスタム画像を追加
except turtle.TurtleGraphicsError:
print("my_custom_image.gif が見つからないか、読み込めません。")
print("代替としてカメの形状を使用します。")
wn.addshape("turtle") # フォールバック
t = turtle.Turtle()
t.penup()
# カスタム画像を設定
try:
t.shape("my_custom_image.gif")
except turtle.TurtleGraphicsError:
t.shape("turtle") # フォールバック
t.goto(-100, 0)
t.stamp() # スタンプで画像を描画
# 注意: この方法では turtlesize() は画像のサイズを変更しません。
# 画像のサイズを変更するには、画像編集ツールを使うか、Pillowなどのライブラリで
# プログラム的にリサイズした別の画像を読み込む必要があります。
t.goto(100, 0)
# 仮にリサイズされた画像があるとして(例: "my_custom_image_large.gif")
# wn.addshape("my_custom_image_large.gif")
# t.shape("my_custom_image_large.gif")
t.stamp()
wn.mainloop()
- 重要な注意点
turtlesize()
は.gif
などのビットマップ画像には効果がありません。画像のサイズを変えたい場合は、Pillow (PIL Fork) などの画像処理ライブラリを使ってPythonコード内で画像をリサイズし、そのリサイズされた画像をaddshape()
で読み込む必要があります。 t.shape("registered_shape_name")
: 登録された形状をタートルの形状として設定します。wn.addshape("filename.gif")
: 指定されたGIF画像をタートルの形状として登録します。