返回

让小乌龟成为你的画笔:使用编程赋予小乌龟绘画的能力

python

让小乌龟在你的指尖下作画

前言

如今,编程已经无处不在,它不仅是程序员的专属领域,更是每个人都可以探索和创造的有趣领域。本篇文章将引导你深入浅出地了解如何使用编程赋予小乌龟绘画的能力。我们将详细阐述如何修改一段给定的代码,并添加绘画功能,让你亲身体验小乌龟在你的指引下作画的乐趣。

代码剖析

我们从分析给定的代码片段开始。这段代码由一系列函数组成,每个函数都有自己特定的职责:

  • move_handler: 处理鼠标移动事件,让小乌龟向光标移动。
  • click_handler: 处理鼠标点击事件,切换小乌龟的状态为拖拽模式。
  • release_handler: 处理鼠标释放事件,切换小乌龟的状态为移动模式。
  • drag_handler: 处理鼠标拖拽事件,让小乌龟跟随光标并移动。
  • onmove: 绑定鼠标移动事件到屏幕对象。

添加绘画功能

为了让小乌龟可以绘画,我们需要修改代码,添加绘画功能。具体修改如下:

def drag_handler(x, y):
    global state

    if state != DRAGGING:  # 忽略无效事件
        return

    # 在鼠标拖动过程中保持小乌龟书写状态
    yertle.pendown()

    # 设置小乌龟朝向
    yertle.setheading(yertle.towards(x, y))

    # 移动小乌龟并绘画
    yertle.goto(x, y)

额外功能

除了添加绘画功能外,我们还可以添加其他功能,如更改背景颜色、画笔颜色、画笔粗细以及清除屏幕:

  • 更改背景颜色:
def change_background():
    new_color = input("输入新背景颜色(例如:白色):")
    screen.bgcolor(new_color)

# 绑定 "b" 键到 change_background 函数
screen.onkey(change_background, "b")
  • 更改画笔颜色:
def change_pen_color():
    new_color = input("输入新画笔颜色(例如:红色):")
    yertle.pencolor(new_color)

# 绑定 "c" 键到 change_pen_color 函数
screen.onkey(change_pen_color, "c")
  • 更改画笔粗细:
def change_pen_size():
    new_size = input("输入新画笔粗细(例如:5):")
    yertle.pensize(new_size)

# 绑定 "s" 键到 change_pen_size 函数
screen.onkey(change_pen_size, "s")
  • 清除屏幕:
def clear_screen():
    screen.clear()

# 绑定空格键到 clear_screen 函数
screen.onkey(clear_screen, "space")

完整代码

from turtle import Screen, Turtle

MOVING, DRAGGING = range(2)  # states

def move_handler(x, y):
    if state != MOVING:  # ignore stray events
        return

    onmove(screen, None)  # avoid overlapping events
    yertle.speed(9)
    yertle.pendown()
    yertle.setheading(yertle.towards(x, y))
    yertle.goto(x, y)
    onmove(screen, move_handler)

def click_handler(x, y):
    global state

    yertle.onclick(None)  # disable until release
    onmove(screen, None)  # disable competing handler

    yertle.onrelease(release_handler)  # watch for release event
    yertle.ondrag(drag_handler)  # motion is now dragging until release

    state = DRAGGING

def release_handler(x, y):
    global state

    yertle.onrelease(None)  # disable until click
    yertle.ondrag(None)  # disable competing handler

    yertle.onclick(click_handler)  # watch for click event
    onmove(screen, move_handler)  # dragging is now motion until click

    state = MOVING

def drag_handler(x, y):
    global state
    
    if state != DRAGGING:  # ignore stray events
        return

    # 在鼠标拖动过程中保持小乌龟书写状态
    yertle.pendown()

    # 设置小乌龟朝向
    yertle.setheading(yertle.towards(x, y))

    # 移动小乌龟并绘画
    yertle.goto(x, y)

def onmove(self, fun, add=None):
    """
    Bind fun to mouse-motion event on screen.

    Arguments:
    self -- the singular screen instance
    fun  -- a function with two arguments, the coordinates
        of the mouse cursor on the canvas.

    Example:

    >>> onmove(turtle.Screen(), lambda x, y: print(x, y))
    >>> # Subsequently moving the cursor on the screen will
    >>> # print the cursor position to the console
    >>> screen.onmove(None)
    """

    if fun is None:
        self.cv.unbind('<Motion>')
    else:

        def eventfun(event):
            fun(
                self.cv.canvasx(event.x) / self.xscale,
                -self.cv.canvasy(event.y) / self.yscale)

        self.cv.bind('<Motion>', eventfun, add)

def change_background():
    new_color = input("输入新背景颜色(例如:白色):")
    screen.bgcolor(new_color)

def change_pen_color():
    new_color = input("输入新画笔颜色(例如:红色):")
    yertle.pencolor(new_color)

def change_pen_size():
    new_size = input("输入新画笔粗细(例如:5):")
    yertle.pensize(new_size)

def clear_screen():
    screen.clear()

screen = Screen()
screen.setup(500, 600)
screen.screensize(1920, 1080)

yertle = Turtle('turtle')
yertle.speed('fastest')

state = MOVING

# Initially we track the turtle's motion and left button clicks
onmove(screen, move_handler)  # a la screen.onmove(move_handler)
yertle.onclick(click_handler)  # a click will turn motion into drag

# 绑定额外功能的快捷键
screen.onkey(change_background, "b")
screen.onkey(change_pen_color, "c")
screen.onkey(change_pen_size, "s")
screen.onkey(clear_screen, "space")

screen.listen()
screen.mainloop()

使用说明

  • 使用鼠标移动光标以引导小乌龟。
  • 点击鼠标左键进入拖拽模式,松开鼠标左键退出拖拽模式。
  • 点击 "b" 键以更改背景颜色。
  • 点击 "c" 键以更改画笔颜色。
  • 点击 "s" 键以更改画笔粗细。
  • 点击空格键以清除屏幕。

常见问题解答

1. 如何让小乌龟开始绘画?

点击鼠标左键进入拖拽模式,然后拖动鼠标即可让小乌龟开始绘画。

2. 如何更改画笔颜色?

点击 "c" 键,然后输入新颜色名称即可更改画笔颜色。

3. 如何清除屏幕上的所有图形?

点击空格键即可清除屏幕上的所有图形。

4. 如何让小乌龟移动得更快?

使用 yertle.speed(new_speed) 方法可以设置小乌龟的移动速度,其中 new_speed 是一个值,范围从 0 到 10。

5. 如何保存小乌龟的画作?

可以使用 screen.getcanvas().postscript(file="filename.ps") 方法将画作保存为 PostScript 文件。