#前提
Pythonの亀をドラッグで動かすだけのハナシ
詳しくは公式ドキュメントの「タートルグラフィックス」を見るといいよ!
#まず亀を表示してみる
shape()で"turtle"指定すれば、🐢が表示されるらしい
コード
亀を表示するコード
import turtle
kame = turtle.Turtle()
kame.shape("turtle")
実行
取り合えず動かしてみる
ondragでgotoを呼べば亀が動くらしい
公式ドキュメントの「ondrag()」
公式ドキュメントの「goto()」
コード
import turtle
kame = turtle.Turtle()
kame.shape("turtle")
kame.ondrag(kame.goto)
結果
亀がカーソルの移動について行っていない(マウスカーソルを右に回したのに、左回りで動いてる…)
亀には早く動いてもらう
delay()で描画の遅延を無くすよう修正
コード
import turtle
kame = turtle.Turtle()
kame.shape("turtle")
gamen = turtle.Screen()
gamen.delay(0)
kame.ondrag(kame.goto)
結果
亀が移動中でもお構いなしにondragで移動処理が呼ばれて、めっちゃ不自然に動く…
亀が寄り道しないようにする
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)
結果
亀には滑らかに動いてもらう
ondragで呼び出した処理で、マウスカーソルの座標を貯めておき
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)
結果
CPUには必要以上に頑張らないようにしてもらう
ドラッグした時にontimerを設定して、ドロップした時にはontimerを解除するよう修正
コード
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)
結果
感想
ただドラッグで亀を動かしたかっただけなのに、思えば遠くに来たもんだ