2016-04-23 9 views
0

私は、Python 3.4.4でTkinterを使っているプログラムを持っています。whileループでcanvas.bindは動作しますか

残念ながら、whileループ内ではcanvas.bindは動作していないようですが、whileループの内側にある必要があります。そうしないと、四角は移動しません。これは、ループが実行されるたびに異なるx、y、x1、y1座標を持つ新しい四角形を技術的に描画しているため、バインドは矢印キーに従って各方向に正方形を移動させるためです。だからここ

はコードです:

from tkinter import * 
import time, random 
tk = Tk() 
canvas = Canvas(tk, width = 1000, height = 1000) 
canvas.pack() 

def move(event): 
    if event.keysym == 'Up': 
     y-=10 
     y1-=10 
    elif event.keysym == 'Down': 
     y+=10 
     y1+=10 
    elif event.keysym == 'Right': 
     x+=10 
     x1+=10 
    elif event.keysym == 'Left': 
     x+=10 
     x1+=10 


background = canvas.create_rectangle(0, 0, 1000, 1000, fill = 'orange') #draws background 
ranNum=random.random()*960 #Creates a random number 
ranNum1=random.random()*960 #Creates a random number 
food = canvas.create_rectangle(ranNum, ranNum1, ranNum + 15, ranNum1 + 15, fill='green') #creates food 
r1 = None 
o = 0 
length = 4 
x = 500 
y = 500 
x1 = 515 
y1 = 515 
while o < length:   
    if canvas.find_overlapping(ranNum, ranNum, ranNum + 15, ranNum1 + 15) == True: 
     x+=5 
     y+=5 
     x1+=5 
     y1+=5 
     canvas.delete(food) 
    r=canvas.create_rectangle(x, y, x1, y1, fill = 'blue') 
    canvas.bind('<KeyPress-Up>', move) 
    canvas.bind('<KeyPress-Down>', move) 
    canvas.bind('<KeyPress-Left>', move) 
    canvas.bind('<KeyPress-Right>', move) 
    time.sleep(.0) 
    canvas.delete(r1) 
    tk.update() 
    r1 = r 
+0

すべての変更のもののためにキャンバスitemconfigureを必要とし、xまたはyを変更しないでください。イベントをキャンバスにバインドする理由main_Tk(平均ウィンドウ)にバインドし、マウスカーソルがキャンバス上にある場合、各キーを聞きます。 – dsgdfg

+0

したがって、canvas.bindの代わりにmain_tk.bindを使用してtk.updateを削除しますか? – Maximus

+0

はい、後でキャンバスやキャンバスの要素を削除することがあります。 – dsgdfg

答えて

0

はステップごとに)更新canvas要素やTkのを(必要としないでください

関連する問題