上节课我们用循环让海龟自己画图。这节课反过来——用键盘控制海龟,想让它去哪就去哪,像玩游戏一样!
一、顺序执行 vs 事件驱动
之前的代码都是顺序执行:从上到下,代码跑完程序就结束了。
键盘控制用的是事件驱动:程序启动后不停"监听"按键,有按键才动,没按键就等着。
# 事件驱动模型:
screen.onkey(函数名, 'Up') # 把"按Up键"绑定到一个函数
screen.listen() # 开始监听键盘!
screen.exitonclick() # 点击窗口才退出
# 程序停在这里,等你按键盘...
二、实战:方向键控制海龟 🚀
import turtle
screen = turtle.Screen()
t = turtle.Turtle()
t.speed(3)
t.shape("turtle") # 换成小海龟形状
t.pencolor("green")
def go_forward():
t.forward(20)
def go_back():
t.backward(20)
def turn_left():
t.left(30)
def turn_right():
t.right(30)
# 绑定方向键
screen.onkey(go_forward, 'Up')
screen.onkey(go_back, 'Down')
screen.onkey(turn_left, 'Left')
screen.onkey(turn_right, 'Right')
screen.listen() # 开始监听键盘
screen.exitonclick() # 点击窗口退出
# 按住方向键不放,海龟一直跑!
三、实战:画画程序(完整版) 🎨
import turtle
screen = turtle.Screen()
screen.setup(800, 600)
t = turtle.Turtle()
t.speed(5)
t.pensize(3)
is_drawing = True
colors = ["red", "green", "blue", "gold", "purple", "orange"]
color_index = 0
def move_forward():
t.forward(15)
def move_back():
t.backward(15)
def turn_left():
t.left(30)
def turn_right():
t.right(30)
def toggle_pen():
global is_drawing
if is_drawing:
t.penup()
is_drawing = False
else:
t.pendown()
is_drawing = True
def clear_screen():
t.clear()
def next_color():
global color_index
color_index = (color_index + 1) % len(colors)
t.pencolor(colors[color_index])
# 绑定所有按键
screen.onkey(move_forward, 'Up')
screen.onkey(move_back, 'Down')
screen.onkey(turn_left, 'Left')
screen.onkey(turn_right, 'Right')
screen.onkey(toggle_pen, 'space') # 空格:提笔/落笔
screen.onkey(clear_screen, 'c') # C:清空屏幕
screen.onkey(next_color, 'f') # F:换颜色
screen.listen()
screen.exitonclick()按键说明:
| 按键 | 功能 |
| ↑ ↓ ← → | 前进 / 后退 / 左转 / 右转 |
| 空格(space) | 提笔 / 落笔切换(拿笔 / 放笔) |
| C | 清空画布,重新画 |
| F | 换下一个颜色 |
四、实战:龟龟赛跑 🐢🏁
import turtle, random
screen = turtle.Screen()
screen.setup(700, 400)
# 5只龟龟并排站在起点
turtles = []
for i in range(5):
t = turtle.Turtle()
t.penup()
t.shape("turtle")
t.goto(-150, 100 - i * 50)
t.pendown()
turtles.append(t)
# 每按一次空格,所有龟龟随机移动
def step_forward():
for t in turtles:
t.forward(random.randint(10, 40))
# 检测谁先到终点
for t in turtles:
if t.xcor() > 300:
print("🏆 获胜!")
return
screen.onkey(step_forward, 'space')
screen.listen()
print("按空格键让龟龟跑起来!先到红线赢!")按空格键一次,所有龟龟跑一段距离,比比谁先到终点!🎲
五、onkey 和 listen 详解
# screen.onkey 的规律:
screen.onkey(函数名, 'Up') # 函数名不要加括号!
screen.onkey(函数名, 'Down')
screen.onkey(函数名, 'Left')
screen.onkey(函数名, 'Right')
screen.onkey(函数名, 'space') # 空格键
screen.onkey(函数名, 'Return') # 回车键
screen.onkey(函数名, 'a') # 字母键
screen.listen() # 这句必须写!开始监听
screen.exitonclick() # 点击鼠标退出程序
⚠️ 注意:绑定的函数不要加括号(),写成 screen.onkey(go, 'Up') 而不是 screen.onkey(go(), 'Up')
六、小挑战
-
- 🟢 简单:在画画程序里加一个 "画正方形" 按钮(按Q键画正方形)
-
- 🟡 中等:把龟龟赛跑改成"猜拳游戏"——按空格随机出拳
-
- 🔴 困难:做一个"贪食蛇"——方向键控制蛇移动,碰到边界游戏结束
-
七、下期预告
键盘控制已掌握!下节课学习鼠标控制——用鼠标点击画图,想画哪点哪!
下期:《turtle第10课:鼠标画笔》
有问题欢迎留言!