如何在 Python3 中一次移动 2 只乌龟
How can I move 2 turtles at once in Python3
我想在python中制作一棵分形树。我已经制作了这棵树,但我想要同时拥有 2 只或更多的乌龟来绘制我的分形树。有没有办法做到这一点?我一直在寻找解决方案,但 none 才是我真正想要的。这是我的代码:
import turtle
tree = turtle.Turtle()
tree.ht()
tree.penup()
tree.sety(-200)
tree.left(90)
import turtle
tree0 = turtle.Turtle()
tree0.ht()
tree0.penup()
tree0.sety(-200)
tree0.left(90)
startx = tree.xcor()
starty = tree.ycor()
startx = tree0.xcor()
starty = tree0.ycor()
def fractalright(angle, length, x, y):
tree.speed(0)
tree.setx(x)
tree.sety(y)
tree.pendown()
tree.forward(length)
tree.right(angle)
length = length - 20
x = tree.xcor()
y = tree.ycor()
if length < 0:
return
tree.penup()
fractalright(angle, length, x, y)
tree.penup()
tree.setx(x)
tree.sety(y)
tree.left(angle)
fractalright (-angle, length, x, y)
def fractalleft(angle, length, x, y):
tree0.speed(0)
tree0.setx(x)
tree0.sety(y)
tree0.pendown()
tree0.forward(length)
tree0.right(angle)
length = length - 20
x = tree0.xcor()
y = tree0.ycor()
if length < 0:
return
tree0.penup()
fractalleft(angle, length, x, y)
tree0.penup()
tree0.setx(x)
tree0.sety(y)
tree0.left(angle)
fractalleft (-angle, length, x, y)
我正在使用 python 3,如果您知道解决方案,请告诉我。谢谢!!
提炼出如何绘制树木的细节,基本任务是并行执行某些绘制函数的两个实例,并使用不同的参数指定一个 "left tree" 和一个 "right tree." 这基本结构可以实现如下:
from multiprocessing.dummy import Pool
import time
def draw_function(current_tree):
# Replace the following lines with what you need to do with turtles
print("Drawing tree {}".format(current_tree))
time.sleep(1)
# Replace this with list of tuples of arguments to draw_function specifying
# angle, length, x, y, left vs right, etc.
list_of_trees = ["left_tree", "right_tree"]
my_pool = Pool(2)
results = my_pool.map(draw_function, list_of_trees)
my_pool.close()
my_pool.join()
对于你的情况,我不太清楚 fractalleft
和 fractalright
之间的区别,因为它们看起来相同,但这种逻辑应该构成你的 draw_function
的基础.您应该为 draw_function
的每次执行创建一个单独的海龟,但请注意您不需要重新导入海龟。
将模块 threading
与 turtle
一起使用的关键是不允许其他线程操纵海龟——它们将它们的海龟请求排队并让主线程处理它们:
import queue
from threading import Thread, active_count
from turtle import Turtle, Screen
def forward(turtle, distance):
graphics.put((turtle.forward, distance))
def right(turtle, angle):
graphics.put((turtle.right, angle))
def left(turtle, angle):
graphics.put((turtle.left, angle))
def fractalright(turtle, angle, length):
forward(turtle, length)
if length - 20 > 0:
right(turtle, angle)
fractalright(turtle, angle, length - 20)
left(turtle, angle)
fractalright(turtle, -angle, length - 20)
forward(turtle, -length)
def fractalleft(turtle, angle, length):
forward(turtle, length)
if length - 20 > 0:
left(turtle, angle)
fractalleft(turtle, angle, length - 20)
right(turtle, angle)
fractalleft(turtle, -angle, length - 20)
forward(turtle, -length)
def process_queue():
while not graphics.empty():
action, argument = graphics.get()
action(argument)
if active_count() > 1:
screen.ontimer(process_queue, 100)
START_X, START_Y = 0, -200
screen = Screen()
screen.mode('logo') # make starting direction 0 degrees towards top
tree1 = Turtle(visible=False)
tree1.color('green')
tree1.penup()
tree1.goto(START_X, START_Y)
tree1.pendown()
tree2 = Turtle(visible=False)
tree2.color('dark green')
tree2.penup()
tree2.goto(START_X, START_Y)
tree2.pendown()
graphics = queue.Queue(1) # size = number of hardware threads you have - 1
def fractal1():
fractalright(tree1, 30, 100)
def fractal2():
fractalleft(tree2, 30, 100)
thread1 = Thread(target=fractal1)
thread1.daemon = True # thread dies when main thread (only non-daemon thread) exits.
thread1.start()
thread2 = Thread(target=fractal2)
thread2.daemon = True # thread dies when main thread (only non-daemon thread) exits.
thread2.start()
process_queue()
screen.exitonclick()
我们正在使用队列模块进行 thread-safe 通信。我重写了您的 fractalright()
和 fractalleft()
函数,以尽量减少它们所需的各种图形操作。
如果一切顺利,您应该会看到同时独立绘制树的浅绿色和深绿色部分。您的计算机需要至少有几个可用的硬件线程。
我想在python中制作一棵分形树。我已经制作了这棵树,但我想要同时拥有 2 只或更多的乌龟来绘制我的分形树。有没有办法做到这一点?我一直在寻找解决方案,但 none 才是我真正想要的。这是我的代码:
import turtle
tree = turtle.Turtle()
tree.ht()
tree.penup()
tree.sety(-200)
tree.left(90)
import turtle
tree0 = turtle.Turtle()
tree0.ht()
tree0.penup()
tree0.sety(-200)
tree0.left(90)
startx = tree.xcor()
starty = tree.ycor()
startx = tree0.xcor()
starty = tree0.ycor()
def fractalright(angle, length, x, y):
tree.speed(0)
tree.setx(x)
tree.sety(y)
tree.pendown()
tree.forward(length)
tree.right(angle)
length = length - 20
x = tree.xcor()
y = tree.ycor()
if length < 0:
return
tree.penup()
fractalright(angle, length, x, y)
tree.penup()
tree.setx(x)
tree.sety(y)
tree.left(angle)
fractalright (-angle, length, x, y)
def fractalleft(angle, length, x, y):
tree0.speed(0)
tree0.setx(x)
tree0.sety(y)
tree0.pendown()
tree0.forward(length)
tree0.right(angle)
length = length - 20
x = tree0.xcor()
y = tree0.ycor()
if length < 0:
return
tree0.penup()
fractalleft(angle, length, x, y)
tree0.penup()
tree0.setx(x)
tree0.sety(y)
tree0.left(angle)
fractalleft (-angle, length, x, y)
我正在使用 python 3,如果您知道解决方案,请告诉我。谢谢!!
提炼出如何绘制树木的细节,基本任务是并行执行某些绘制函数的两个实例,并使用不同的参数指定一个 "left tree" 和一个 "right tree." 这基本结构可以实现如下:
from multiprocessing.dummy import Pool
import time
def draw_function(current_tree):
# Replace the following lines with what you need to do with turtles
print("Drawing tree {}".format(current_tree))
time.sleep(1)
# Replace this with list of tuples of arguments to draw_function specifying
# angle, length, x, y, left vs right, etc.
list_of_trees = ["left_tree", "right_tree"]
my_pool = Pool(2)
results = my_pool.map(draw_function, list_of_trees)
my_pool.close()
my_pool.join()
对于你的情况,我不太清楚 fractalleft
和 fractalright
之间的区别,因为它们看起来相同,但这种逻辑应该构成你的 draw_function
的基础.您应该为 draw_function
的每次执行创建一个单独的海龟,但请注意您不需要重新导入海龟。
将模块 threading
与 turtle
一起使用的关键是不允许其他线程操纵海龟——它们将它们的海龟请求排队并让主线程处理它们:
import queue
from threading import Thread, active_count
from turtle import Turtle, Screen
def forward(turtle, distance):
graphics.put((turtle.forward, distance))
def right(turtle, angle):
graphics.put((turtle.right, angle))
def left(turtle, angle):
graphics.put((turtle.left, angle))
def fractalright(turtle, angle, length):
forward(turtle, length)
if length - 20 > 0:
right(turtle, angle)
fractalright(turtle, angle, length - 20)
left(turtle, angle)
fractalright(turtle, -angle, length - 20)
forward(turtle, -length)
def fractalleft(turtle, angle, length):
forward(turtle, length)
if length - 20 > 0:
left(turtle, angle)
fractalleft(turtle, angle, length - 20)
right(turtle, angle)
fractalleft(turtle, -angle, length - 20)
forward(turtle, -length)
def process_queue():
while not graphics.empty():
action, argument = graphics.get()
action(argument)
if active_count() > 1:
screen.ontimer(process_queue, 100)
START_X, START_Y = 0, -200
screen = Screen()
screen.mode('logo') # make starting direction 0 degrees towards top
tree1 = Turtle(visible=False)
tree1.color('green')
tree1.penup()
tree1.goto(START_X, START_Y)
tree1.pendown()
tree2 = Turtle(visible=False)
tree2.color('dark green')
tree2.penup()
tree2.goto(START_X, START_Y)
tree2.pendown()
graphics = queue.Queue(1) # size = number of hardware threads you have - 1
def fractal1():
fractalright(tree1, 30, 100)
def fractal2():
fractalleft(tree2, 30, 100)
thread1 = Thread(target=fractal1)
thread1.daemon = True # thread dies when main thread (only non-daemon thread) exits.
thread1.start()
thread2 = Thread(target=fractal2)
thread2.daemon = True # thread dies when main thread (only non-daemon thread) exits.
thread2.start()
process_queue()
screen.exitonclick()
我们正在使用队列模块进行 thread-safe 通信。我重写了您的 fractalright()
和 fractalleft()
函数,以尽量减少它们所需的各种图形操作。
如果一切顺利,您应该会看到同时独立绘制树的浅绿色和深绿色部分。您的计算机需要至少有几个可用的硬件线程。