1

最近、私は最近取り組んでいる作品です。このプロジェクトのタスクは、三角形の頂点として3つのシンボルを作成することです。シンボルは常に等速度で互いに向かって移動する(すなわち、1→2,2→3,3→1)。シンボルが同時に移動を開始、最終的な数字は、ここに私のコードです。このタートルモジュールでマルチスレッドを使用する方法

enter image description here

のように見える必要があります。 3つのメソッドを同時に呼び出すためにマルチスレッドを使用していますが、プログラムは動作していないようです。メソッドは別々に実行されていますが、これは起こってはいけません。

import turtle 
import time 
import threading 


class TurObj: 

    def __init__(self, x, y, color, speed): 
     self.t = turtle.Pen() 
     self.t.ht() 
     self.t.shape('circle') 
     self.t.fillcolor(color) 
     self.t.speed(speed) 
     self.t.penup() 
     self.t.goto(x, y) 
     self.t.pendown() 
     self.t.st() 

    def get_loc(self): 
     cor = [self.t.xcor(), self.t.ycor()] 
     return cor 

    def move_to(self, n): 
     # self.t.setx(n.get_loc().__getitem__(0)) 
     # self.t.sety(n.get_loc().__getitem__(1)) 
     self.t.goto(n.get_loc().__getitem__(0), n.get_loc().__getitem__(1)) 


t1 = TurObj(300, 200, 'red', 5) 
t2 = TurObj(-300, 200, 'yellow', 5) 
t3 = TurObj(0, -200, 'blue', 5) 

p1 = threading.Thread(target=t1.move_to(t2)) 
p2 = threading.Thread(target=t2.move_to(t3)) 
p3 = threading.Thread(target=t3.move_to(t1)) 

p1.start() 
p2.start() 
p3.start() 

p1.join() 
p2.join() 
p3.join() 

time.sleep(3) 

すべてのヘルプは素晴らしいことだ...

答えて

1

私は常にスレッドを検討する前に、亀の独自ontimer()イベントをしようとお勧めします。あなたのコードは、setheading(towards())forward()の組み合わせで小さなステップを取るのではなく、goto()であまりにも大きく飛び越えているようです。最後に、開始位置が対称ではないように見えます。以下は、これらの問題に対処する私のリワークです:

from turtle import Turtle, Screen 

class TurtleObject: 

    def __init__(self, position, color, speed): 
     self.t = Turtle(shape='circle', visible=False) 
     self.t.fillcolor(color) 
     self.t.speed(speed) 
     self.t.penup() 
     self.t.goto(position) 
     self.t.pendown() 
     self.t.showturtle() 

    def get_turtle(self): 
     return self.t 

    def on_top_of(self, n): 
     other = n.get_turtle() 
     return abs(self.t.xcor() - other.xcor()) < 5 and abs(self.t.ycor() - other.ycor()) < 5 

    def move_towards(self, n): 
     self.t.setheading(self.t.towards(n.get_turtle())) 
     self.t.forward(1) 

     if not self.on_top_of(n): 
      screen.ontimer(lambda: self.move_towards(n), 100) 


t1 = TurtleObject((300, 200), 'red', "fast") 
t2 = TurtleObject((-300, 200), 'yellow', "fast") 
t3 = TurtleObject((0, -320), 'blue', "fast") 

screen = Screen() 

screen.ontimer(lambda: t1.move_towards(t2), 100) 
screen.ontimer(lambda: t2.move_towards(t3), 100) 
screen.ontimer(lambda: t3.move_towards(t1), 100) 

screen.exitonclick() 

enter image description here

関連する問題