7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Pythonの亀をドラッグで動かしたい

Posted at

#前提

Pythonの亀をドラッグで動かすだけのハナシ

詳しくは公式ドキュメントの「タートルグラフィックス」を見るといいよ!

#まず亀を表示してみる

shape()で"turtle"指定すれば、🐢が表示されるらしい

公式ドキュメントの「shape()」

コード

亀を表示するコード
import turtle

kame = turtle.Turtle()
kame.shape("turtle") 

実行

マジで🐢が表示された!
実行時の画面

取り合えず動かしてみる

ondragでgotoを呼べば亀が動くらしい

公式ドキュメントの「ondrag()」
公式ドキュメントの「goto()」

コード

import turtle

kame = turtle.Turtle()
kame.shape("turtle") 

kame.ondrag(kame.goto)

結果

亀がカーソルの移動について行っていない(マウスカーソルを右に回したのに、左回りで動いてる…)
image.png

亀には早く動いてもらう

delay()で描画の遅延を無くすよう修正

公式ドキュメントの「delay()」

コード

import turtle

kame = turtle.Turtle()
kame.shape("turtle") 

gamen = turtle.Screen()
gamen.delay(0)

kame.ondrag(kame.goto)

結果

亀が移動中でもお構いなしにondragで移動処理が呼ばれて、めっちゃ不自然に動く…
image.png

亀が寄り道しないようにする

ondragで呼び出した処理が終わるまで、次のondragが呼ばれないよう修正

公式ドキュメントの「イベントを利用する」

コード

import turtle

kame = turtle.Turtle()
kame.shape("turtle") 

gamen = turtle.Screen()
gamen.delay(0)

def dragKame(x, y):
    kame.ondrag(None)
    kame.goto(x, y)
    kame.ondrag(dragKame)

kame.ondrag(dragKame)

結果

かなりそれっぽいけど、カーソル移動が速いとカクカクする。
image.png

亀には滑らかに動いてもらう

ondragで呼び出した処理で、マウスカーソルの座標を貯めておき
ontimerで呼び出した処理で、貯めた座標を参考に亀を移動させるよう修正

公式ドキュメントの「ontimer()」

コード

import turtle

kame = turtle.Turtle()
kame.shape("turtle") 

gamen = turtle.Screen()
gamen.delay(0)

coordList = []
    
def dragKame(x, y):
    global coordList
    
    coordList.append({'x': x, 'y': y})

def moveKame():
    global coordList
    
    while(len(coordList) > 0):
        coord = coordList.pop(0)
        kame.goto(coord['x'], coord['y'])
        
    gamen.ontimer(moveKame, 0)
 
kame.ondrag(dragKame)
gamen.ontimer(moveKame, 0)

結果

滑らかに動いた!
image.png

けどCPU使用率がめっちゃ高い!
image.png

CPUには必要以上に頑張らないようにしてもらう

ドラッグした時にontimerを設定して、ドロップした時にはontimerを解除するよう修正

公式ドキュメントの「onrelease()」

コード

import turtle

kame = turtle.Turtle()
kame.shape("turtle") 

gamen = turtle.Screen()
gamen.delay(0)

coordList = []
isMove = False
    
def dragKame(x, y):
    global coordList
    global isMove
    
    coordList.append({'x': x, 'y': y})
    
    if not isMove:
        isMove = True
        gamen.ontimer(moveKame, 0)

def dropKame(x, y):
    global isMove
    
    isMove = False

def moveKame():
    global isMove
    global coordList
    
    while(len(coordList) > 0):
        coord = coordList.pop(0)
        kame.goto(coord['x'], coord['y'])
        
    if isMove:
        gamen.ontimer(moveKame, 0)
 
kame.ondrag(dragKame)
kame.onrelease(dropKame)

結果

(ドラッグしてない間は)CPU使用率が下がった!
image.png

感想

ただドラッグで亀を動かしたかっただけなのに、思えば遠くに来たもんだ

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?