Python海龟绘图——交互简介

前面我们学习了turtle库一些绘图指令程序,可以实现一些有趣的绘图。今天就要给大家介绍如何让程序能够对鼠标点击、按下键盘等做出响应。

我们接触过的一些应用程序,大多都是交互性的,它允许用户触摸、点击、拖动或者按下按钮,能够感知到对程序的控制。我们把它叫做事件驱动程序。

事件处理程序(事件监听程序)
当我们点击一个图标的时候,可以打开一个窗口,当我们点击窗口的关闭按钮,可以关闭一个窗口,这些都是事件处理程序,因为它会响应或处理来自用户的事件。

正常时候,这些事件就耐心的坐在那里等着,等着用户来告诉它做什么。

鼠标点击海龟屏幕事件——onscreenclick

turtle.onscreenclick(fun, btn=1, add=None)
fun -- 一个函数,调用时将传入两个参数表示在画布上点击的坐标。
btn -- 鼠标按钮编号,默认值为 1 (鼠标左键)
add -- True 或 False -- 如为 True 则将添加一个新绑定,否则将取代先前的绑定
绑定 fun 指定的函数到鼠标点击屏幕事件。如果 fun 值为 None,则移除现有的绑定

turtle.onscreenclick()接收的参数不是一个值,而是另外一个函数的名称,即setpos()函数,获取鼠标在海龟屏幕上点击的位置坐标(x,y)。
回调函数
把一个函数作为参数传递给另外一个函数,则称前者为回调函数(它将由其他的函数回调)。

当我们将一个函数当作参数发送给另外一个函数的时候,内部的函数在其函数名称的后面不需要一对圆括号,例如turtle.onscreenclick(setpos)。

from turtle import *

pencolor('green') # 设置画笔的颜色为green
pensize(60) # 设置画笔的宽度为60
speed()
bgcolor('black')  # 修改背景颜色为黑色
onscreenclick(setpos)  # 将海龟的位置设置为用户点击的位置

当用户在屏幕上点击鼠标的时候,将海龟的位置移动到点击的位置,而此时海龟的钢笔默认是放下的(pendown),所以在把海龟位置设置为鼠标点击的位置时,就会在画布上留下一条直线。
在这里插入图片描述setpos()函数作为turtle.onscreenclick()的回调函数,可以实现和用户交互,我们点击鼠标的时候,他就会朝着我们点击的位置绘制直线。
监听键盘事件——onkeypress
使用键盘交互,使用户可以通过按下箭头键来控制海龟在屏幕上移动。

turtle.onkeypress(fun, key=None)
fun -- 一个无参数的函数或 None
key -- 一个字符串: 键 (例如 "a") 或键标 (例如 "space")

key一个字符串,将键盘按键设置为回调函数。

key含义
“Up”按下“↑”键
“Down”按下“↓”键
“Left”按下“←”键
“Right”按下“→”键

如何告诉计算机开始监听按键事件:

turtle.listen(xdummy=None, ydummy=None)设置焦点到 TurtleScreen (以便接收按键事件)

想要让海龟窗口接收到我们的按键事件,就必须要使我们的海龟窗口移动到最前面并且接收焦点,这一点和鼠标点击不同。

当我们在桌面上点击一个窗口的时候,被点击的窗口移到了前面并且接收焦点,这样这个窗口才会接收用户的输入。
在这里插入图片描述这里我在桌面打开了3个记事本,目前“3.txt”这个窗口处于桌面焦点中,现在只有“3.txt”这个记事本窗口可以接收用户的输入,那如果想要在“2.txt”输入内容怎么办?只需要用鼠标点击一下“2.txt”这个窗口,这个窗口就会成为屏幕上的焦点,既可以接收用户的输入了。

使用鼠标可以轻松的完成这样的动作,但是使用键盘的时候,只是按下键盘并不会窗口接收到那些按键事件。

所以,使用turtle.listen()指令可以确保海龟窗口处于桌面的焦点中,这样就可以监听按键事件。

在程序的最后使用listen()命令告诉计算机开始处理我们使用onkeypress()函数连接到函数的所有那些按键的按键事件。

from turtle import *
speed(0)

def up(): # 向上
    setheading(90) # 海龟面向屏幕上方
    fd(50) # 向上前进50像素

def down(): # 向下
    setheading(-90) # 海龟面向屏幕下方
    fd(50) # 向下前进50像素

def left(): # 向左
    setheading(180) # 向左
    fd(50) # 向左前进50像素

def right(): # 向右
    setheading(360) # 向右
    fd(50) # 向右前进50像素

onkeypress(up,"Up") # 向上
onkeypress(left,"Left")
onkeypress(right,"Right")
onkeypress(down,"Down")

listen() # 监听

定义了4个函数up()down()left()right(),分别来响应上箭头键(↑)、下箭头键(↓)、左箭头键(←)和右箭头键(→),且允许用户通过这些键控制海龟向前移动、向下移动、向左移动和向右移动。
在这里插入图片描述

turtle.setheading(to_angle)设置海龟的朝向为 to_angle

在这里插入图片描述通过turtle.setheading(to_angle)可以设定海龟朝向的方向。
案例
定义一个绘制随机大小和颜色的螺旋线,让螺旋线绘制在我们鼠标点击的屏幕位置。

# 导入模块
from turtle import *
import random

bgcolor('black') 
speed(0)
# 画笔颜色列表
colors = ['gray','white','orange','blue','red','yellow','purple']

# 定义绘制图形函数,在鼠标点击的位置开始绘制
def draw(x,y):
    pencolor(random.choice(colors))  # 设置画笔的颜色
    size = random.randint(10,40) # 绘制图形的边数,利用随机数来设置
    pu()
    goto(x,y)
    pd()

    for x in range(size): # for循环遍历
        fd(x * 2)
        lt(91)
        
onscreenclick(draw)  # 鼠标点击事件

导入随机模块import random,这样可以随机设置画笔颜色和螺旋线的大小:

colors = ['gray','white','orange','blue','red','yellow','purple']
pencolor(random.choice(colors))  
size = random.randint(10,40)

随机模块,以后我们会详细介绍学习。

onscreenclick(draw),每当用户在屏幕上点击鼠标的时候,就会调用draw(x,y)函数,事件监听器就会自动将鼠标点击的x坐标和y坐标传递给draw回调函数。
在这里插入图片描述可以尝试在鼠标点击的位置绘制别的图形。

更多内容可以关注微信公众号【陪孩子一起学编程】
陪孩子一起学编程

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值