如何同时启动2个函数(turtle)(PYTHON)

2024-04-26 14:34:40 发布

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

我只举一个简单的例子,但我想了解它的逻辑。 例如,我要如何同时开始这两件事?。在

谢谢你的回答。。在

import turtle
wn=turtle.Screen()

nah=turtle.Turtle() #first turtle
nah1=turtle.Turtle() #secondturtle
n=1
nah.speed(0)
nah.penup()
nah.goto(-300,200)
nah.pendown()
nah1.penup()
nah1.goto(-300,180)
nah1.pendown()

def func1():
    for i in range (4):
        nah.right(45)
        nah.forward(40)
        nah.left(45)
        nah.forward(30)
        nah.left(45)
        nah.forward(40)
        nah.right(45)
        nah.forward(30)

def func2():
    for e in range(4):
        nah1.left(45)
        nah1.forward(40)
        nah1.right(45)
        nah1.forward(30)
        nah1.right(45)
        nah1.forward(40)
        nah1.left(45)
        nah1.forward(30)

func1()
func2()


wn.exitonclick()

你不介意我的剧本我只想要逻辑。在


Tags: rightfordef逻辑leftforwardturtlegoto
3条回答

因为我已经给出了一个bad answer,我现在觉得一定要给一个更好的;)

由于线程不是一个选项,您必须暂停一个函数的执行以运行另一个函数,然后从一个函数切换到另一个函数。在

暂停一个函数然后再继续它的一个简单方法是通过生成,其中暂停的地方生成生成器。在

首先,定义用于暂停的位置:

def func1():
    for i in range (4):
        nah.right(45)
        yield
        nah.forward(40)
        yield
        nah.left(45)
        yield
        nah.forward(30)
        yield
        nah.left(45)
        yield
        nah.forward(40)
        yield
        nah.right(45)
        yield
        nah.forward(30)
        yield

def func2():
    for e in range(4):
        nah1.left(45)
        yield
        nah1.forward(40)
        yield
        nah1.right(45)
        yield
        nah1.forward(30)
        yield
        nah1.right(45)
        yield
        nah1.forward(40)
        yield
        nah1.left(45)
        yield
        nah1.forward(30)
        yield

然后交替调用这两个函数,直到两个函数都完成:

^{pr2}$

*在Python2中,使用izip_longest代替zip_longest

解释

那么,它是如何工作的呢?在

func1()anfdfunc2()现在返回生成器对象。这将是一种低技术的使用方式:

gen1 = func1()
gen2 = func2()

next(gen1)
next(gen2)
next(gen1)
next(gen2)
next(gen1)
next(gen2)
...

生成器对象可以迭代,它将生成值。在这种情况下,它只会一直产生None,但我们对它产生的结果不感兴趣——我们只想让它停下来。在

因此,这将执行整个func1

for x in func1():
    pass

为了互换地执行func1和func2,它们被压缩。zip_longest确保迭代不会在其中一个函数完成时停止,而是继续,直到两个函数都完成为止。在

有几种方法可以解决这个问题。一种使用屏幕.ontimer()事件(请参阅turtle文档)。这种方法允许您调整海龟的实际时钟时间。在

我在下面使用的方法是将海龟的运动分解为一个发电机内的小步骤,发电机在每一次运动后都会产生收益。这类似于@zvone所做的,但程度更精细(运动更流畅),对原始代码的影响更小。我还设置了它来利用现有的turtle.speed()来控制两个海龟的绝对和相对速度——如果你说turtle1.speed(“fast”),它将比turtle2.speed(“slow”)移动得更快。在

from turtle import Turtle, Screen

def forward(turtle, distance):
    speed = turtle.speed()
    for _ in range(0, distance, speed):
        turtle.forward(speed)
        yield 0

def func1(turtle):
    for _ in range(4):
        turtle.right(45)
        yield from forward(turtle, 40)
        turtle.left(45)
        yield from forward(turtle, 30)
        turtle.left(45)
        yield from forward(turtle, 40)
        turtle.right(45)
        yield from forward(turtle, 30)

def func2(turtle):
    for _ in range(4):
        turtle.left(45)
        yield from forward(turtle, 40)
        turtle.right(45)
        yield from forward(turtle, 30)
        turtle.right(45)
        yield from forward(turtle, 40)
        turtle.left(45)
        yield from forward(turtle, 30)

nah1 = Turtle(shape='turtle')  # first turtle
nah1.penup()
nah1.goto(-300, 200)
nah1.pendown()
nah1.speed('slowest')
generator1 = func1(nah1)

nah2 = Turtle(shape='turtle')  # second turtle
nah2.penup()
nah2.goto(-300, 180)
nah2.pendown()
nah2.speed(nah1.speed() + 1)  # a little faster than nah1
generator2 = func2(nah2)

def race_turtles():
    while (next(generator1, 1) + next(generator2, 1)) < 2:
        pass

screen = Screen()

screen.ontimer(race_turtles, 100)

screen.exitonclick()

我在一个screen.ontimer()事件中启动了比赛,这样整个比赛在exitonclick()调用之后进行。这样,即使在比赛进行中,您也可以单击窗口将其关闭。如果我们直接调用race_turtles(),那么在比赛结束之前,点击屏幕什么也做不了。在

从伊索的《乌龟和稍快的乌龟》中:

enter image description here

若要与其他代码并行启动某些代码,请创建一个thread。在

最简单的例子是:

my_thread = threading.Thread(target=func1)
my_thread.start()
# start() returns immediately and the thread runs "in backgound"

func2() # runs in the main thread, in parallel with my_thread

my_thread.join() # wait for the thread to finish, if it has not already

编辑:不起作用

我在贴出答案后尝试了这个方法,不幸的是它对海龟不起作用。我得到:

RuntimeError: main thread is not in main loop

另一种方法?

my other answer。在

相关问题 更多 >