Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在蟒蛇3中同时移动两只海龟_Python_Python 3.x_Python Multiprocessing_Turtle Graphics - Fatal编程技术网

Python 如何在蟒蛇3中同时移动两只海龟

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(

我想用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(-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_函数接受一个参数,它是自定义树类的实例,指定绘制树所需的所有内容。