2016-04-02 11 views
-1

私はTkinterキャンバス上に異なる図形を配置しようとしますが、それぞれの図形にタグを付けてアクションをバインドします。Tkinter - canvas figure:異なるタグを複数のFigureにバインドできないのですか?

例:私はキャンバスに4点を置いて、座標で構成されたタグを付け、彼のタグで識別されるクリックした点の座標を表示するアクションを定義します。

タグを印刷しても影響はありませんが、大丈夫なタグは違いますが、座標が表示されているときは常に最後に追加されたポイントです。すべてのタグが最後に同じであったようです。トンを理解する:/

from Tkinter import * 

points=[(10,10),(60,10),(10,60),(60,60)] 

def check(pixel): 
    print('===========') 
    print('you clicked on:') 
    print(pixel) 

root = Tk() 
canvas = Canvas(root, width=70, height=70) 
print('----points list----') 
for p in points: 
    tag="("+str(p[0])+","+str(p[1])+")" 
    print(tag) 
    canvas.create_oval(p[0]-2,p[1]-2,p[0]+2,p[1]+2,tags=tag) 
    canvas.tag_bind(tag, '<ButtonPress-1>', lambda event:check(tag)) 

canvas.pack() 
root.mainloop() 

を可能な出力:(私は3と異なる点をクリック)

----points list---- 
(10,10) 
(60,10) 
(10,60) 
(60,60) 
=========== 
you clicked on: 
(60,60) 
=========== 
you clicked on: 
(60,60) 
=========== 
you clicked on: 
(60,60) 

任意のアイデア?

答えて

1

私が見つけた、なぜ、人々は同じポイントで動けなくなる場合:このようなコマンドtag_bindを使用して

for variable... 
    canvas.tag_bind(item_id, '<ButtonPress-1>', lambda event:function(variable)) 

関数がグローバル変数がかかりますので、ループで働くことは決してありません "変数 'はループが終了した後=常に最後の値です。 コマンド自体にあなたの変数を定義する必要があります。

for variable... 
    canvas.tag_bind(item_id, '<ButtonPress-1>', lambda event, var=variable:function(var)) 

この関数が、それは項目ごとに独自の変数だし、すべての項目

のためではない一つの変数を取得しますように
関連する問題