Python 如何在蟒蛇3中同时移动两只海龟
我想用python制作一个分形树。我已经做了这棵树,但我想让两只或更多的海龟同时画出我的分形树。有办法吗?我一直在寻找解决方案,但没有一个是我真正想要的。这是我的密码:Python 如何在蟒蛇3中同时移动两只海龟,python,python-3.x,python-multiprocessing,turtle-graphics,Python,Python 3.x,Python Multiprocessing,Turtle Graphics,我想用python制作一个分形树。我已经做了这棵树,但我想让两只或更多的海龟同时画出我的分形树。有办法吗?我一直在寻找解决方案,但没有一个是我真正想要的。这是我的密码: 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(
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)
导入海龟
树=海龟。海龟()
tree.ht()
tree.penup()
树。sety(-200)
树。左(90)
进口海龟
tree0=海龟。海龟()
tree0.ht()
tree0.penup()
树0.sety(-200)
树0.左(90)
startx=tree.xcor()
starty=tree.ycor()
startx=tree0.xcor()
starty=tree0.ycor()
def fractalright(角度、长度、x、y):
树。速度(0)
tree.setx(x)
树。sety(y)
tree.pendown()
树向前(长度)
树。右(角)
长度=长度-20
x=tree.xcor()
y=tree.ycor()
如果长度<0:
返回
tree.penup()
分形右(角度、长度、x、y)
tree.penup()
tree.setx(x)
树。sety(y)
树。左(角)
分形右(-角度,长度,x,y)
def fractalleft(角度、长度、x、y):
树0.速度(0)
树0.setx(x)
树0.sety(y)
树0.pendown()
树0.向前(长度)
树0.右侧(角度)
长度=长度-20
x=tree0.xcor()
y=tree0.ycor()
如果长度<0:
返回
tree0.penup()
分形左(角度、长度、x、y)
tree0.penup()
树0.setx(x)
树0.sety(y)
树0.左侧(角度)
fractalleft(-角度、长度、x、y)
我正在使用Python3,如果您知道解决方案,请告诉我。谢谢 通过提取绘制树的详细信息,基本任务是使用不同的参数并行执行某些绘制函数的两个实例,以指定一个“左树”和一个“右树”。此基本结构可实现如下:
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\u函数的基础。您应该为每次执行draw\u函数
创建一个单独的海龟,但是请注意,您不需要重新导入turtle。将模块线程与turtle
一起使用的关键是不允许其他线程操作turtle——它们将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()
我们正在使用队列模块进行线程安全通信。我重写了fractalright()
和fractalleft()
函数,以尽量减少它们所需的各种图形操作
如果一切正常,您将看到同时独立绘制树的浅绿色和深绿色部分。您的计算机需要至少有两个可用的硬件线程。您在标签中提到,您是否查看了相关文档,另一个选项是,我建议您查看它们,然后尝试一个,如果您仍然有问题,请返回这些。我有一个问题,用参数元组列表替换它是什么意思,以绘制指定角度、长度、x、y、左与右等的函数。假设您的绘制函数最终需要参数角度、长度、x、y,以及一个布尔值,指定这是“左”型树还是“右”型树。如果要绘制两棵树,可以创建一个由两个元组组成的列表,每个元组包含其中一棵树的相应参数。然后draw_函数将接受并解析该元组,以确定如何绘制树。也许更好的做法是让draw_函数接受一个参数,它是自定义树类的实例,指定绘制树所需的所有内容。