在Python中,每次按同一个按钮时,如何按顺序更改海龟图像?

2024-05-23 13:44:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我想写一个程序,改变海龟图像的顺序,每次我按'n'键。你知道吗

它应该首先从“classic”形状开始,每次按下“n”键时,将形状更改为“circle”、“arrow”、“turtle”,然后循环回“classic”。你知道吗

import turtle
canvas = turtle . Screen ()
t = turtle . Turtle ()

def changeTurtle () :
    for n in range (1, 5) :
        if n == 1 :
            t . shape ('circle')
        elif n == 2 :
            t . shape ('arrow')
        elif n == 3 :
            t . shape ('turtle')
        elif n == 4 :
            t . shape ('classic')

t . shape ('classic') # first turtle 'classic' shape
canvas . onkey (changeTurtle, 'n') # press 'n'key

canvas . listen ()
turtle . mainloop ()

当我按“n”键时,它应该改变一次。问题是,变化太快了。你知道吗


Tags: 图像import程序顺序screencanvas形状海龟
3条回答

下面是我如何对这个问题进行过度设计(并消除了对global语句的需要):

from turtle import Screen, Turtle

def changeTurtle():
    index = shapes.index(turtle.shape()) + 1
    shape = shapes[index % len(shapes)]

    turtle.shape(shape)
    screen.title(shape)

turtle = Turtle()
turtle.shapesize(3)
turtle.shape('classic')  # first turtle 'classic' shape

screen = Screen()
screen.title(turtle.shape())
shapes = screen.getshapes()

screen.onkey(changeTurtle, 'n')  # press 'n' key

screen.listen()
screen.mainloop()

for循环一次遍历n的所有可能值。相反,您需要做的是将值n保存在函数外部,并在每次调用函数时更改它:

n = 1
def changeTurtle():
    global n
    n = (n % 4) + 1  # cycle through 1, 2, 3, 4, 1, 2, 3, 4, ...
    if n == 1:
        t.shape('circle')
    elif n == 2:
        t.shape('arrow')
    elif n == 3:
        t.shape('turtle')
    else:
        t.shape('classic')

替代函数的另一种方法是使用一个无限迭代器(比如itertools.cycle),加载所有要循环的形状。当你想要下一个形状时,你的程序只需要请求它,改变海龟,然后继续它以前做的任何事情。以下程序演示了如何执行此操作:

import itertools
import turtle


def main():
    canvas = turtle.Screen()
    t = turtle.Turtle()
    # noinspection PyProtectedMember
    shapes = itertools.cycle(sorted(canvas._shapes.keys()))
    t.shape(next(shapes))
    canvas.onkey(lambda: t.shape(next(shapes)), 'n')
    canvas.listen()
    canvas.mainloop()


if __name__ == '__main__':
    main()

相关问题 更多 >