37

全网最细海龟 (turtle) 画图讲解 (五):输入/输出文字及鼠标与键盘交互设计

 3 years ago
source link: https://blog.csdn.net/xw1680/article/details/111991598
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

最近博主在 CSDN 上看到许多关于海龟画图的案例,如画圣诞树、五角星等,但是都是直接给出了源码以及一些简单的注释,没有对其详细的说明,会让很多初学者迷糊很久,故这里博主详细地对 turtle 模块中的方法进行详解,让广大博友能够做到自由画图。

海龟绘图是 Python 内置的一个比较有趣的模块,模块名称为 turtle。它最初源于 20世纪60年代 的 Logo 语言,之后成为了 Python 的内置模块。海龟绘图提供了一些简单的绘图方法,可以根据编写的控制指令(代码),让一个 “海龟” 在屏幕上来回移动,而且可以在它爬行的路径上绘制图形。通过海龟绘图,不仅可以在屏幕上绘制图形,还可以看到整个绘制过程。另外,海龟绘图对初学者十分友好,它能够轻松地编写出很多有趣的实例。

一、输入/输出文字

在海龟绘图中,也可以输入或者输出文字,下面分别进行介绍。

1. 输出文字

输出文字可以使用 write() 方法来实现,语法如下:

def write(self, arg, move=False, align="left", font=("Arial", 8, "normal"))

参数说明:

  1. arg:必选参数,用于指定要输出的文字内容,该内容会输出到当前海龟光标的所在位置。
  2. move:可选参数,用于指定是否移动画笔到文本的右下角,默认为False (不移动)。
  3. align:可选参数,用于指定文字的对齐方式,其参数值为left(居左)、center(居中)或者right(居右)中的任意一个,默认为 left。
  4. font:可选参数,用于指定字体、字号和字形,通过一个三元组(字体,字号,字形)指定。

说明:字形可设置的值为normal(表示正常)、bold(粗体)、italic(斜体)、underline(下划线)等。例如,在屏幕中心输出文字 命运给予我们的不是失望之酒,而是机会之杯。,指定字体为宋体,字号为18,字形为normal(表示正常),代码如下:

# -*- coding: UTF-8 -*-
"""
@author:AmoXiang
@file:12.输出文字.py
@time:2020/12/30
"""
import turtle  # 导入海龟绘图模块

turtle.color("green")  # 填充颜色
turtle.up()  # 抬笔
turtle.goto(-300, 50)
turtle.down()  # 落笔
turtle.write("命运给与我们的不是失望之酒,而是机会之杯。", font=("宋体", 18, "normal"))
turtle.done()  # 海龟绘图程序的结束语句(开始主循环)

运行上面的代码,将显示下图所示的效果。
在这里插入图片描述
从上图中可以看出,输出文字时,海龟光标并没有移动,如果将write() 方法修改为以下代码:

turtle.write("命运给与我们的不是失望之酒,而是机会之杯。", True, font=("宋体", 18, "normal"))

再次运行结果,将显示下图所示的效果:
在这里插入图片描述

2. 输入文字

在海龟绘图中,如果想与用户交互,获取用户输入的文字,可以通过 textinput() 方法弹出一个输入对话框来实现。该方法的返回值为字符串类型。textinput() 方法的语法如下:

def textinput(self, title, prompt):

参数说明:

  1. title:用于指定对话框的标题,显示在标题栏上。
  2. prompt:用于指定对话框的提示文字,提示要输入的信息。3. 返回值:返回输入的字符串,如果对话框被取消则返回 None。

例如,先弹出输入对话框,要求用户输入一段文字,然后输出到屏幕上,代码如下:

# -*- coding: UTF-8 -*-
"""
@author:AmoXiang
@file:13.输入文字.py
@time:2020/12/30
"""
import turtle  # 导入海龟绘图模块

turtle.color("green")  # 填充颜色
word = turtle.textinput("温馨提示:", "请输入要打印的文字")  # 弹出输入对话框
turtle.write(word, True, font=("宋体", 18, "italic"))  # 输出文字
turtle.done()  # 海龟绘图程序的结束语句(开始主循环)

通过 textinput() 方法返回的内容为字符串,如果想要输入数值,可以使用 numinput() 方法实现,该方法的返回值为浮点类型。numinput() 方法的语法如下:

def numinput(self, title, prompt, default=None, minval=None, maxval=None):

参数说明:

  1. title:必选参数,用于指定对话框的标题,显示在标题栏上。
  2. prompt:必选参数,用于指定对话框的提示文字,提示要输入什么信息。
  3. default:可选参数,用于指定一个默认数值。
  4. minval:可选参数,用于指定可输入的最小数值。
  5. maxval :可选参数,用于指定可输入的最大数值。

例如,先弹出输入对话框,要求用户输入一个 1~9 之间的数,然后输出到屏幕上,代码如下:

import turtle  # 导入海龟绘图模块

turtle.color("green")  # 填充颜色
# 数字输入框
num = turtle.numinput("温馨提示:", "请输入1~9之间的数字:", default=1, minval=1, maxval=9)
turtle.write(num, True, font=("宋体", 18, "normal"))  # 输出获取的数字
turtle.done()  # 海龟绘图程序的结束语句(开始主循环)

二、鼠标与键盘交互设计

在海龟绘图中,也支持与鼠标或键盘的交互操作。它提供了监听键盘按键事件、鼠标事件以及定时器等方法,下面分别进行介绍。

1. 键盘事件

海龟绘图中提供了对键盘事件进行监听的方法。在执行键盘事件监听时,需要调用 listen() 方法。该方法用于让海龟屏幕(TurtleScreen)可以获得焦点,为接收键盘事件做好准备。调用listen() 方法的代码如下:

turtle.listen()

海龟绘图中的键盘事件主要有以下两个:onkey() | onkeyrelease():当按键被按下并释放时发生,语法如下:

def onkey(self, fun, key):
def onkeyrelease(self, fun, key):

参数说明:

  1. fun:必选参数,表示一个无参数的函数,用于指定当按下并释放指定按键时,执行的函数。也可以指定为 None,表示什么都不做。
  2. key:必选参数,表示被按下的键对应的字符串,如 aspace。当指定 a 时,表示当按下并释放 <a> 键时执行 fun 参数所指定的函数。

例如,当按下并释放键盘上的 <w> 键时,海龟向上移动 100 像素,代码如下:

# -*- coding: UTF-8 -*-
"""
@author:AmoXiang
@file:15.键盘事件.py
@time:2020/12/30
"""

import turtle


def move():
    turtle.left(90)
    turtle.forward(100)


turtle.listen()
turtle.onkey(move, "w")
turtle.done()

onkeypress():当按键被按下(不释放)时发生,语法如下:

def onkeypress(self, fun, key=None):

参数说明:

  1. fun:表示一个无参数的函数,用于指定当按下(不释放)指定按键时,执行的函数。也可以指定为 None,表示什么都不做。
  2. key:可选参数,表示被按下的键对应的字符串,如aspace。当指定 a 时,表示当按下(不释放)<a> 键时执行 fun 参数所指定函数。如果未指定,则移除事件绑定。

例如,当一直按下(不释放)键盘上的 键时,让海龟一直向前移动,释放按键即停止移动,代码如下:

import turtle


def move():
    turtle.forward(2)


turtle.listen()
turtle.onkeypress(move, "Up")
turtle.done()

运行上面的代码,当一直按下(不释放) 键盘上的 键时,海龟将一直向前移动。

2. 鼠标事件

在海龟绘图中提供了对鼠标事件进行监听的方法。海龟绘图中的鼠标事件主要有以下 3 个:
(1) onclick() | onscreenclick():表示处理鼠标点击屏幕事件,语法如下:

turtle.getscreen().onclick(self, fun, btn=1, add=None):
turtle.onscreenclick(fun, btn=1, add=None)
  1. fun:表示一个函数,用于指定当鼠标按键被按下时执行的函数。该函数调用时将传入两个参数,表示在屏幕上点击位置的坐标,所以指定的函数需要带有两个参数。
  2. btn:鼠标按键编号,默认值为1(鼠标左键)、2 (鼠标中键,即按下滑轮)、3(鼠标右键)。
  3. add:一个布尔值,表示是否添加新绑定。如果为True,则添加一个新绑定,否则将取代先前的绑定。
  4. 说明:如果将 fun 参数设置为 None,则将移除事件绑定。

2.1 获取鼠标点击的位置

当使用鼠标左键点击屏幕时,显示点击位置的坐标,代码如下:

# -*- coding: UTF-8 -*-
"""
@author:AmoXiang
@file:16.鼠标事件.py
@time:2020/12/30
"""

import turtle


def click(x, y):
    turtle.clear()
    turtle.write((x, y), font=("宋体", 18, "normal"))


turtle.onscreenclick(click, 1)
turtle.done()

onclick() 方法也可以作为海龟对象的方法,例如,下面的代码将实现在单击屏幕中的海龟时,显示当前的坐标位置:

import turtle

t = turtle.Turtle()
t.shape("turtle")


def click(x, y):
    turtle.clear()
    turtle.write((x, y), font=("宋体", 15, "normal"))


t.onclick(click, 1)
turtle.done()

运行上面的代码,只在单击屏幕上的小海龟时,才会显示当前的坐标位置。
(2) onrelease():该方法为海龟对象的方法,表示处理鼠标释放事件语法如下:

turtle.onrelease(self, fun, btn=1, add=None):

参数说明:

  1. fun:表示一个事件触发时执行的函数。该函数调用时将传入两个参数表示释放鼠标按键时鼠标位置的坐标,所以指定的函数需要带有两个参数。
  2. btn:鼠标按键编号,默认值为1(鼠标左键)、2(鼠标中键,即按下滑轮)、3(鼠标右键)。
  3. add:一个布尔值,表示是否添加新绑定。如果为True,则添加一个新绑定,否则将取代先前的绑定。

例如,创建一个海龟对象,当用户在海龟对象上按下鼠标左键并释放时显示释放时鼠标位置的坐标,代码如下:

import turtle

t = turtle.Turtle()
t.shape("turtle")


def fun(x, y):
    turtle.clear()
    turtle.write((x, y), font=("宋体", 15, "normal"))


t.onrelease(fun, 1)
turtle.done()

(3) ondrag():表示处理鼠标拖动事件,语法如下:

def ondrag(self, fun, btn=1, add=None):

参数说明:

  1. fun:表示按住鼠标左键并拖动时执行的函数。该函数调用时将传入两个参数表示释放鼠标按键时鼠标位置的坐标,所以指定的函数需要带有两个参数。
  2. btn:鼠标按键编号,默认值为1(鼠标左键)、2(鼠标中键,即按下滑轮)、3(鼠标右键)。
  3. add:一个布尔值,表示是否添加新绑定。如果为True,则添加一个新绑定,否则将取代先前的绑定。
  4. 说明:当画笔为落笔状态时,在海龟对象上单击并拖动海龟可在屏幕上手绘线条。

例如,创建一个海龟对象,并且为该对象添加拖动事件,实现拖动屏幕中的海龟时,在屏幕上手绘线条,代码如下:

import turtle

t = turtle.Turtle()
t.shape("turtle")
t.color("blue")
turtle.listen()


def fun(x, y):
    t.pendown()
    t.goto(x, y)


t.ondrag(fun, 1)
turtle.done()

3. 计时器

在海龟绘图中,提供了 ontimer() 方法来实现一个计时器,用于达到指定时间时,执行一个操作。语法如下:

def ontimer(self, fun, t=0):

参数说明:

  1. fun:无参数的函数,当计时器到指定时间时执行。
  2. t:指定一个大于或等于 0 的数值,表示多长时间(单位为毫秒)后触发 fun 指定的函数。

例如,安装一个计时器,在 300 毫秒后调用画正方形的函数,代码如下:

# -*- coding: UTF-8 -*-
"""
@author:AmoXiang
@file:14.计时器.py
@time:2020/12/30
"""
import turtle


def fun():  # 绘制正方形
    for i in range(4):
        turtle.forward(100)
        turtle.left(90)


turtle.getscreen().ontimer(fun, 300)  # 设置计时器
turtle.done()  # 海龟绘图程序的结束语句(开始主循环)

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK