【问题标题】:How do I run two turtles in python simultaneously?如何在 python 中同时运行两只海龟?
【发布时间】:2018-11-07 23:29:21
【问题描述】:

我试图让两只海龟一起移动,而不是一只接一只地移动。例如:

a = turtle.Turtle()
b = turtle.Turtle()

a.forward(100)
b.forward(100)

但这只会让他们一个接一个地移动。 有没有办法让它们同时移动?

【问题讨论】:

  • 乌龟类是如何定义的?能否提供代码?
  • 因此,您不应在问题标题中添加 [ANSWERED] 或类似内容,您必须将解决问题的答案标记为正确,如果没有答案对您有帮助,那么我们邀请您发布您的解决方案并将其标记为正确。

标签: python python-3.x turtle-graphics simultaneous


【解决方案1】:

有没有办法让它们同时移动?

我们能做的最好的事情就是让它们看起来同时移动。以下是解决此问题的三种日益复杂的方法。但首先,让我们建立我们的基线代码,两只海龟互相朝向并在它们在原点相遇时停下来:

from turtle import Screen, Turtle

screen = Screen()

a = Turtle('square', visible=False)
a.speed('slow')
a.color('red')
a.penup()
a.setx(-300)
a.setheading(0)
a.pendown()
a.showturtle()

b = Turtle('circle', visible=False)
b.speed('slow')
b.color('green')
b.penup()
b.setx(300)
b.setheading(180)
b.pendown()
b.showturtle()

### Subsequent variations start here ###

a.forward(300)
b.forward(300)

### Subsequent variations end here ###

screen.mainloop()

当一只乌龟移动然后另一只乌龟移动时,上面的内容并没有做我们想要的。对于我们的第一个变体,我们只是将运动分割成更小的单元并交替进行:

###

for _ in range(300):
    a.forward(1)
    b.forward(1)

###

我们的下一个变体使用计时器事件来控制两只海龟的运动:

###

def move(turtle):
    turtle.forward(1)

    if turtle.distance(0, 0) > 1 :
        screen.ontimer(lambda t=turtle: move(t), 50)

move(a)
move(b)

###

我们的最终变体使用线程来独立控制两只海龟。每个海龟都是一个线程,还有第三个主线程,负责处理海龟线程的所有图形操作。这是必要的,因为海龟在 tkinter 上运行,它在处理来自辅助线程的图形时存在问题:

###

from threading import Thread, active_count
from queue import Queue

QUEUE_SIZE = 1

def process_queue():
    while not actions.empty():
        action, *arguments = actions.get()
        action(*arguments)

    if active_count() > 1:
        screen.ontimer(process_queue, 100)

actions = Queue(QUEUE_SIZE)  # a thread-safe data structure

def move(turtle):
    while turtle.distance(0, 0) > 1:
        actions.put((turtle.forward, 1))

Thread(target=move, args=[a], daemon=True).start()
Thread(target=move, args=[b], daemon=True).start()

process_queue()

###

【讨论】:

  • 谢谢!由于 python 是一种非常基本(但很强大)的语言,我坚持让它们看起来“同时”移动。
【解决方案2】:

您不能将其作为 Turtle 界面的保证部分。您可以尝试在并行进程中执行这些操作,但不能保证同时移动。 一些 Python 运行时系统使用单个进程的顺序时间片来处理并行进程。您可能还会发现一个移动已完成,而另一个进程正在初始化。如果您想尝试更严格的管理,请构建两个持有进程锁的进程;让主程序释放关键部分中的两个锁...您可能会获得接近所需功能的东西。

如果您想要做一些图形上成熟的事情,您可能会考虑使用更大的图形包,例如 PyGame。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    相关资源
    最近更新 更多