如何在 python 中同时 运行 两只乌龟?
How do I run two turtles in python simultaneously?
我正在尝试让两只乌龟一起移动,而不是让一只乌龟依次移动。例如:
a = turtle.Turtle()
b = turtle.Turtle()
a.forward(100)
b.forward(100)
但这只会让他们一个接一个地移动。
有没有办法让它们同时移动?
您不能将此作为 Turtle 界面的保证部分。您可以尝试 在并行进程中执行这些操作,但不能保证同步移动。
一些 Python 运行 时间系统通过单个进程的顺序时间切片来处理并行进程。您可能还会发现一个移动完成而另一个进程正在初始化。如果您想尝试更严格的管理,请构建两个持有进程锁的进程;让主程序释放关键部分中的两个锁...并且您可能获得接近所需功能的东西。
如果你想做一些图形如此成熟的事情,你可以考虑更大的图形包,比如 PyGame。
Is there a way to make them move together simultaneously?
我们能做的最好的事情就是让它们看起来同时移动。以下是解决此问题的三种日益复杂的方法。但首先,让我们建立我们的基线代码,两只海龟朝对方前进并在原点相遇时停下来:
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)
###
我们的最终变体使用线程来独立控制两只海龟。每个海龟都是一个线程,还有第三个主线程处理海龟线程的所有图形操作。这是必需的,因为 turtle 在 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()
###
我正在尝试让两只乌龟一起移动,而不是让一只乌龟依次移动。例如:
a = turtle.Turtle()
b = turtle.Turtle()
a.forward(100)
b.forward(100)
但这只会让他们一个接一个地移动。 有没有办法让它们同时移动?
您不能将此作为 Turtle 界面的保证部分。您可以尝试 在并行进程中执行这些操作,但不能保证同步移动。 一些 Python 运行 时间系统通过单个进程的顺序时间切片来处理并行进程。您可能还会发现一个移动完成而另一个进程正在初始化。如果您想尝试更严格的管理,请构建两个持有进程锁的进程;让主程序释放关键部分中的两个锁...并且您可能获得接近所需功能的东西。
如果你想做一些图形如此成熟的事情,你可以考虑更大的图形包,比如 PyGame。
Is there a way to make them move together simultaneously?
我们能做的最好的事情就是让它们看起来同时移动。以下是解决此问题的三种日益复杂的方法。但首先,让我们建立我们的基线代码,两只海龟朝对方前进并在原点相遇时停下来:
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)
###
我们的最终变体使用线程来独立控制两只海龟。每个海龟都是一个线程,还有第三个主线程处理海龟线程的所有图形操作。这是必需的,因为 turtle 在 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()
###