turtle绘图
turtle库广泛用于编程教学,可以帮助零基础的初学者理解编程概念和逻辑结构。它通过可视化反馈,增强学习体验,并用于绘制图形、创建简单游戏和模拟物理现象。
安装与设置因为turtle库是Python标准库的一部分,所以大多数情况下只需要确保安装了Python,然后就可以直接使用turtle库了。

要使用Turtle库绘图,首先需要创建一个Turtle图形窗口Screen:
import turtle# 创建一个屏幕对象screen = turtle.Screen()screen.title("Turtle图形窗口示例") # 设置窗口标题# 进入主循环,保持窗口打开screen.mainloop()
创建Turtle对象后,可以开始绘图。以下是画一条线和一个圆的示例:
import turtle# 创建一个屏幕对象screen = turtle.Screen()# 创建一个Turtle对象t = turtle.Turtle()# 画一条线t.forward(100) # 向前移动100像素# 画一个圆t.circle(50) # 画一个半径为50像素的圆# 进入主循环,保持窗口打开screen.mainloop()
要创建一个Turtle对象并进行移动:
import turtle# 创建一个屏幕对象screen = turtle.Screen()# 创建一个Turtle对象t = turtle.Turtle()# 向前移动150像素t.forward(150)# 向后移动50像素t.backward(50)# 进入主循环,保持窗口打开screen.mainloop()
可以控制Turtle对象的方向和速度:
import turtle# 创建一个屏幕对象screen = turtle.Screen()# 创建一个Turtle对象t = turtle.Turtle()# 向前移动100像素t.forward(100)# 向右转90度t.right(90)# 向前移动100像素t.forward(100)# 设置Turtle的移动速度(1到10,1最慢,10最快)t.speed(5)# 进入主循环,保持窗口打开screen.mainloop()
可以改变Turtle对象的颜色和形状,使其更加有趣:
import turtle# 创建一个屏幕对象screen = turtle.Screen()# 创建一个Turtle对象t = turtle.Turtle()# 改变Turtle的形状('turtle', 'arrow', 'circle', 'square', 'triangle', 'classic'等)t.shape('turtle')# 改变Turtle的颜色t.color('blue')# 改变Turtle的填充颜色t.fillcolor('red')# 向前移动100像素t.forward(100)# 画一个圆t.circle(50)# 进入主循环,保持窗口打开screen.mainloop()
进阶用法
图形绘制
使用循环可以绘制出复杂且对称的图形,例如螺旋图案或对称的多边形。以下示例展示了如何使用循环绘制一个螺旋图形:
import turtle# 创建一个屏幕对象screen = turtle.Screen()# 创建一个Turtle对象t = turtle.Turtle()# 设置Turtle的速度t.speed(10)# 使用循环绘制螺旋图形for i in range(50): t.forward(i 10) t.right(144)# 进入主循环,保持窗口打开screen.mainloop()
使用Turtle库可以很容易地绘制多边形和星形。以下是绘制五边形和五角星的示例:
import turtle# 创建一个屏幕对象screen = turtle.Screen()# 创建一个Turtle对象t = turtle.Turtle()# 设置Turtle的速度t.speed(5)# 绘制五边形for _ in range(5): t.forward(100) t.right(72)# 移动Turtle到新位置绘制星形t.penup()t.goto(-200, 0)t.pendown()# 绘制五角星for _ in range(5): t.forward(200) t.right(144)# 进入主循环,保持窗口打开screen.mainloop()
填充与颜色
使用begin_fill()和end_fill()进行图形填充turtle库允许使用begin_fill()和end_fill()方法进行图形填充,比如填充一个矩形:
import turtle# 创建一个屏幕对象screen = turtle.Screen()# 创建一个Turtle对象t = turtle.Turtle()# 设置填充颜色t.fillcolor("yellow")# 开始填充t.begin_fill()# 绘制矩形for _ in range(4): t.forward(100) t.right(90)# 结束填充t.end_fill()# 进入主循环,保持窗口打开screen.mainloop()
虽然turtle库不直接支持渐变效果,但可以通过逐步改变颜色实现渐变效果:
import turtle# 创建一个屏幕对象screen = turtle.Screen()# 创建一个Turtle对象t = turtle.Turtle()# 设置初始颜色r = 0g = 0b = 0# 设置Turtle的速度t.speed(10)# 使用循环绘制渐变色螺旋图形for i in range(50): t.pencolor(r/255, g/255, b/255) t.forward(i 10) t.right(144) r = (r + 20) % 256 g = (g + 25) % 256 b = (b + 30) % 256# 进入主循环,保持窗口打开screen.mainloop()
五角星渐变色
文本和字体
turtle库提供了在绘图窗口中添加文本的方法。
import turtle# 创建一个屏幕对象screen = turtle.Screen()# 创建一个Turtle对象t = turtle.Turtle()# 在窗口中写入文本t.penup()t.goto(0, 0)t.pendown()t.write("Hello, Turtle!", align="center", font=("Arial", 24, "normal"))# 进入主循环,保持窗口打开screen.mainloop()
可以通过指定字体名称、大小和样式来自定义文本的外观:
import turtle# 创建一个屏幕对象screen = turtle.Screen()# 创建一个Turtle对象t = turtle.Turtle()# 在窗口中写入文本,设置字体样式和大小t.penup()t.goto(0, 0)t.pendown()t.write("Custom Font!", align="center", font=("Times New Roman", 30, "bold"))# 进入主循环,保持窗口打开screen.mainloop()
更复杂应用
以上的使用场景都是没有加上键盘绑定事件的(即键盘按下某些按键后会触发一些变化事件),所以加了键盘绑定后会更加复杂。
以开发一个小时候都玩过的《井字棋》为例, 源码地址:
https://gitee.com/jeffrey2021/children-day20240601/blob/master/jingziqi.py
以下是部分源码展示(不全)
import turtle# 创建一个屏幕对象screen = turtle.Screen()screen.title("井字棋游戏")screen.setup(width=600, height=600)screen.setworldcoordinates(-300, -300, 300, 300)# 初始化游戏状态board = [["" for _ in range(3)] for _ in range(3)]current_player = "X" # "X" starts the gamepositions = { "1": (-200, 200), "2": (0, 200), "3": (200, 200), "4": (-200, 0), "5": (0, 0), "6": (200, 0), "7": (-200, -200), "8": (0, -200), "9": (200, -200)}# 画井字棋盘def draw_board(): board_drawer = turtle.Turtle() board_drawer.speed(0) board_drawer.hideturtle() for i in range(1, 3): board_drawer.penup() board_drawer.goto(-300, 200 i - 300) board_drawer.pendown() board_drawer.goto(300, 200 i - 300) board_drawer.penup() board_drawer.goto(200 i - 300, -300) board_drawer.pendown() board_drawer.goto(200 i - 300, 300) board_drawer.penup()draw_board()# 定义绘制X和O的函数def draw_x(x, y): pen = turtle.Turtle() pen.pencolor("blue") pen.penup() pen.goto(x - 50, y - 50) pen.pendown() pen.setheading(45) pen.forward(141) pen.penup() pen.goto(x + 50, y - 50) pen.pendown() pen.setheading(135) pen.forward(141) pen.hideturtle()def draw_o(x, y): pen = turtle.Turtle() pen.pencolor("red") pen.penup() pen.goto(x, y - 50) pen.pendown() pen.circle(50) pen.hideturtle()# 检查胜利条件def check_winner(): pass# 定义放置棋子的函数def place_mark(key): global current_player if key not in positions: return x, y = positions[key] row = int((y + 300) // 200) col = int((x + 300) // 200) if board[row][col] == "": if current_player == "X": draw_x(x, y) board[row][col] = "X" current_player = "O" else: draw_o(x, y) board[row][col] = "O" current_player = "X" winner = check_winner() if winner: screen.title(f"井字棋游戏 - {winner} 赢了!") screen.ontimer(reset_game, 2000) elif all(all(cell != "" for cell in row) for row in board): screen.title("井字棋游戏 - 平局!") screen.ontimer(reset_game, 2000)# 重置游戏def reset_game(): passdef bind_key(): # 键盘事件绑定 for key in positions.keys(): screen.onkey(lambda k=key: place_mark(k), key)bind_key()# 让屏幕开始监听键盘事件screen.listen()# 进入主循环,保持窗口打开screen.mainloop()
井字棋
Turtle调试与优化
常见问题与解决方法
图形显示异常:可能是因为坐标计算错误或绘制逻辑有误,检查坐标计算和绘制逻辑,确保每个图形元素的位置和大小正确。同时,使用try-except结构捕获异常,输出调试信息以排查错误。Turtle响应慢的问题,可能是由于绘制过程中的重复计算或不必要的绘制操作。尽量减少不必要的绘制操作。使用合适的数据结构来缓存和重复利用计算结果。性能优化
tracer()函数: 用于控制Turtle绘制过程的速度,可通过设置参数来调节绘制速度和刷新频率。update()函数: 用于手动刷新Turtle窗口,可在绘制完成后调用以一次性刷新窗口,提高绘制效率。控制绘制速度
时间控制: 使用time模块来控制绘制速度,例如使用time.sleep()函数来在绘制过程中添加延迟,调节绘制速度。循环控制: 在绘制循环中适当添加条件判断,控制绘制过程的速度和流畅度,避免过快或过慢的绘制效果。总结Python的turtle库使用还是相对比较简单,很适合新手用来练习,主要是写完之后有结果出来,能刺激学习欲望。
除了开发《井字棋》以外,turtle库还可以开发其他经典游戏,比如《1024》、《贪吃蛇》、《坦克大战》等,都可以尝试用来练练手。
参考文献Python官方文档:https://docs.python.org/zh-cn/3/library/turtle.html#turtle.onkeypress最后,祝大家六一儿童节快乐,玩游戏开心!