Python(turtleモジュールで描画)

Pythonではtkinterモジュールやpygameモジュールなどを活用して簡単に描画を行うことができます。

tkinter、pygameについて以前の投稿はこちら
Python(デスクトップアプリ)
Python(tkinter)
Python(Pygameで描画)
Python(pygameでゲームパッド入力)

今回は、より簡単にお絵描きできるturtleモジュールを扱いたいと思います。

公式リファレンスはこちら
turtle --- タートルグラフィックス

import turtle

turtle.Screen() # スクリーン作成

# 正方形の描画
vertex = 4
for _ in range(vertex):
    turtle.forward(100) # 中心が(0,0)右が+
    turtle.left(360 / vertex) # 90度左に回転

turtle.reset() # (0,0)に戻す

def rect(n,length):
    """正n角形を描画する関数
       @param n      頂点数
       @param length 一辺の長さ"""
    for _ in range(n):
        turtle.forward(length) # 中心が(0,0)右が+
        turtle.left(360 / n) # 90度左に回転

rect(5,100)
rect(40,15) # 円の表現
turtle.circle(20)
print(turtle.position()) # 現在の座標

from turtle import *
color('red', 'yellow') # ペンの色と塗りつぶしの色を設定
begin_fill() # これ以降の図を満たす
while True:
    forward(200)
    left(170)
    if abs(pos()) < 1:
        break
end_fill() # 満たす図の末尾に呼び、begin_fill()の後に記述
done() # イベントループの開始

from turtle import *
Screen()
bgcolor('red') # スクリーンの背景色を設定
print(bgcolor())
bgcolor('#4682b4')
bgcolor(0,0,0)
bgcolor(1.0,0.5,0.5)

print(colormode()) # デフォルトは0~1.0
colormode(255) # 256階調でカラーコードを指定
print(colormode())

bgcolor(0x46,0x82,0xb4)
bgcolor(120,0,120)
for i in range(256):
    bgcolor(i,i,i)

for i in range(256):
    bgcolor(i,0,i)

pencolor("blue") # ペンの色を設定
print(pencolor())

turtleモジュールはpythonインストール時にセットで入っているIDLEからDemoを開いて確認することができます。

turtleモジュールで色々お絵かきしてみましょう♪

turtleモジュールで入力操作

turtleモジュールを利用するとダイアログを表示したり、マウスの座標位置を取得したりできます。

from turtle import *

textinput("入力してください","name") # 入力ダイアログ(str型)
numinput("入力してください","number") # 入力ダイアログ(float型)

while True:
    s = textinput("input","cmd")
    if s == "end":
        break
    forward(int(s))
    left(90)

onscreenclick(lambda *x:print(x)) # マウスで左クリックした座標を表示

サンプル各種

import turtle

def sample2():
  for i in range(36):
    turtle.forward(10)
    turtle.right(10)
    for j in range(3):
      turtle.forward(50)
      turtle.right(120)

turtle.up()
turtle.goto(0, 50) # 位置の調節
turtle.down()

turtle.tracer(0) # 0:アニメーションなし 1:アニメーションあり
sample2()
turtle.update() # TurtleScreen の更新を実行。トレーサーがオフの時に使用。
turtle.tracer(0)メソッド
アニメーションのオン/オフを切り替え。nが指定されている場合、実際に実行されるのは、各n番目の通常の画面更新のみです。 (複雑なグラフィックスの描画を高速化するために使用できます。)
引数なしで呼び出されると、現在格納されているnの値を返します。
※ 0の場合は描画データをバッファにためておいて、まとめて更新を行うようですが、描画されないデータが残る場合があります。
turtle.update()メソッド
TurtleScreen の更新を実行。トレーサーがオフの時に使用します。
更新することでアニメーションなしで描画されなかったデータを画面に反映することができます。

import turtle

def spiral(size, angle):
  if size < 100:
    turtle.forward(size)
    turtle.right(angle)
    spiral(size+2, angle)

turtle.tracer(0)
spiral(0, 90)

turtle.up()
turtle.goto(140, 20)
turtle.down()
spiral(0, 70)

import turtle

def rtriangle(length, level):
  def tri(length):
    for i in range(3):
      turtle.forward(length)
      turtle.right(120)

  if level > 0:
    tri(length)
    n = length / 2
    turtle.up()
    turtle.forward(n)
    turtle.right(60)
    turtle.down()
    rtriangle(n, level-1)

turtle.tracer(1)
rtriangle(150, 5)

import turtle

def move(x, y):
  turtle.up()
  turtle.goto(x, y)
  turtle.down()

def tree(length, level):
  if level > 0:
    #print("in")
    x, y = turtle.position()
    a = turtle.heading() # タートルの現在の向きを返す
    # draw left node
    #print("left",x,y,a,length,level)
    turtle.left(18)
    turtle.forward(length)
    tree(length-10, level-1)

    # draw right node
    #print("right",x,y,a,length,level)
    move(x, y)
    turtle.setheading(a)
    turtle.right(18)
    turtle.forward(length)
    tree(length-10, level-1)

turtle.tracer(1)
move(0, -100)
turtle.setheading(90)
tree(60, 5)


※ デバッグ用のprintでコメントアウトしている部分を外すと、再帰処理でどのようにプログラムが実行されているのかが分かりやすくなるかと。
左ノードで再帰処理が実行され、左側の再帰処理が終わると、下の右ノードに移り、右側の再帰処理が呼ばれ、すべての再起処理が終わるまでプログラムが実行されることで、枝が描画されています。

from turtle import *
wn = Screen()
wn.title('Mickey Mouse')
wn.bgcolor('lightyellow')

shape('turtle')

head = 30
setheading(head)
pensize(6)

penup()
left(90)
forward(120)
right(50)
pendown()
begin_fill()

for i in range(150): #Left ear of Micky mouse being drawn
    forward(3)
    left(2)

right(130)

for i in range(120):
    forward(5)
    left(2)

right(130)

for i in range(150): #right ear of Micky mouse being drawn
    forward(3)
    left(2)

right(134)

for i in range(25):
    forward(5)
    left(2)

end_fill()
done()
shape('turtle')メソッド
カーソルの形を亀に変更できます。

import turtle

def leaf(n, pencolor, brushcolor):
  def cir():
    for i in range(9):
      turtle.forward(n)
      turtle.right(10)

  a = turtle.heading()
  turtle.color(brushcolor)
  turtle.begin_fill()
  cir()
  turtle.right(90)
  cir()
  turtle.end_fill()

  turtle.setheading(a)
  turtle.color(pencolor)
  cir()
  turtle.right(90)
  cir()

def flower(x, y, size, color_set):
  turtle.up()
  turtle.goto(x, y)
  turtle.down()
  turtle.setheading(90)
  turtle.color(color_set[0])
  turtle.forward(size * 2)
  turtle.right(30)
  leaf(size, color_set[0], color_set[0])
  turtle.setheading(90)
  turtle.forward(size * 14)

  for i in range(9):
    leaf(size, color_set[1], color_set[2])
    turtle.right(10)

turtle.tracer(0)
flower(-100, -120, 7, ("lightgreen",  "mistyrose", "lightpink"))
flower(0,    -120, 4, ("greenyellow", "lemonchiffon", "gold"))
flower(100,  -120, 8, ("palegreen", "paleturquoise", "lightblue"))
turtle.update()

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Python

前の記事

Python(連結リスト)