2016-10-06 14 views
0
from tkinter import * 
import time 
root = Tk() 
canvas =Canvas(root, width=1000, height=1000, bg= '#2B2B2B') 
canvas.pack() 

#id1 white 
x = 400 
y = 400 
r = 50 

#rc2 orange 
f = 100 
d = 400 
r2 =100 



id1 = canvas.create_oval(x - r, y - r, x + r, y + r, outline='white') 


id2 = canvas.create_oval(f - r2, d - r2, f + r2, d + r2, outline='#CC7832') 



def move_circle(): 
    for k in range(31): 


     time.sleep(0.025) 

     canvas.move(id2, 5, 0) 
     canvas.update() 

def get_coords(id_num): 

    pos = canvas.coords(id_num) 
    x = (pos[0] + pos[2])/2 
    y = (pos[1] + pos[3])/2 

    print(x, y) 
    return x, y 


from math import sqrt 


def distance(id1, id2): 
    x1, y1 = get_coords(id1) 
    x2, y2 = get_coords(id2) 
    print("distance", x1, y1, x2, y2) 
    return sqrt((x2 - x1)**2 + (y2 - y1)**2) 

def delete_circle(): #12 
    if distance(id1, id2) < (r+r2): 
     canvas.delete(id2) 

move_circle() 
delete_circle() 
root.mainloop() 

'' 'こんにちは、id1に当たると削除する円id2を取得しようとしています。現時点では、移動範囲内で が31〜89の間に設定されている場合にのみ、これが機能します。この理由は、移動機能がループを完了したときにのみ削除機能が実行されるためです。私は解決策は、何らかの理由で、ループ中に発生すると、座標の変更にアクセスするために削除関数を取得することだと思います。しかし、私はこれをやろうとしている最中に壁を打った。どんな助けでも大歓迎です。百万円前払いありがとうございます。Pythonで別のサークルと衝突して動いているサークルを削除する方法

+0

はあなたがループの移動の円内から削除円を呼び出して(と円は私が削除した場合、おそらくループを抜け出し)みました –

+0

私はdelete_circleを取得しようとしています()は、31-39の後の範囲、すなわち例えば100の範囲で作業する。どうもありがとう。 –

+0

申し訳ありませんJeremy、あなたのコメントを見て、あなたの提案を見て、 –

答えて

0

find_overlappingメソッドが必要です。

Basicの例:だけ明確にする

id1 = canvas.create_oval(x - r, y - r, x + r, y + r, outline='white') 
id2 = canvas.create_oval(f - r2, d - r2, f + r2, d + r2, outline='#CC7832') 

id1_coords = canvas.coords(id1) 

def move_circle(x, y): 
    canvas.move(id2, x, y) 
    if id2 not in canvas.find_overlapping(*id1_coords) : 
     canvas.after(100, move_circle, x, y) 
    else : 
     canvas.delete(id2) 

move_circle(5, 0) 

root.mainloop() 
+0

こんにちは、私に戻ってくれてありがとう。あなたのコードは動作しているようですが、100万のおかげです!私は前にfind_overlappingメソッドに遭遇していません。もう一度ありがとう、これは私を狂って運転していた!乾杯。 –

+0

こんにちは、私の元のループよりも円が少し遅く、少しジャンプしているように見えますが、理由があるのでしょうか?あなたの助けをもう一度ありがとう。 –

+0

私はafterメソッドで最初の引数に100を設定しているので、遅くて動きが遅いです。コード内で0.025を使用したい場合は、100が100分の1の遅延です。代わりに25を使用するか、別の値を使用してください) – brodeur

関連する問題