2013-01-23 76 views
5

私は、コンソールで「キャンバスの」メッセージを持ってキャンバスをクリックすると、私はこのTkinterでイベントを発生させないようにするにはどうしたらいいですか?

from Tkinter import * 
master = Tk() 
def oval_mouse_click(event): 
    print "in oval" 
def canvas_mouse_click(event): 
    print "in canvas" 
w = Canvas(master, width = 800, height = 600) 
uid = w.create_oval(390, 290, 410, 310, fill='blue') 
w.tag_bind(uid, "<Button-1>", lambda x: oval_mouse_click(x)) 
w.bind("<Button-1>" , canvas_mouse_click) 
w.pack() 
mainloop() 

のようないくつかのコードを持っています。 楕円形をクリックすると、「楕円形」と「キャンバス」の2つのメッセージが表示されますが、最初のメッセージのみを表示します。イベントを停止する方法はありますか?

私はいくつかのグローバルフラグでこのタスクを実行できますが、私はTklにとってより自然な方法があるはずです。ここで

+1

あなたは最も簡単な方法を見つけました。キャンバスタグのバインドで 'return 'break''が機能しません。 – mmgp

+0

関連:[Python tkinter:テキストウィジェットタグ内のイベントの伝播を停止する](http://stackoverflow.com/questions/13066773/python-tkinter-stopping-event-propagation-in-text-widgets-tags/13076458) – phoibos

答えて

2

はあなたの問題を処理するための最も簡単な例である:

import Tkinter 

def oval_mouse_click(event): 
    print "in oval" 
    event.widget.tag_click = True 

def canvas_mouse_click(event): 
    if event.widget.tag_click: 
     event.widget.tag_click = False 
     return 
    print "in canvas" 

root = Tkinter.Tk() 
canvas = Tkinter.Canvas(width=400, height=300) 
oid = canvas.create_oval(400/2-10, 300/2-10, 400/2+10, 300/2+10, fill='blue') 
canvas.tag_click = False 
canvas.tag_bind(oid, "<Button-1>", oval_mouse_click) 
canvas.bind("<Button-1>" , canvas_mouse_click) 
canvas.pack() 
root.mainloop() 

Canvasの下でこれを処理する他の簡単な方法はありません。

0

私はちょうど同じような問題の改善された解決策を投稿しましたPython tkinter: stopping event propagation in text widgets tags

コアの考え方は、Canvasウィジェットをtag_bindと同じイベントシーケンスでバインドしてハイジャックします。改善された解決策は、で、Tkの他のバインド+コールバックのの動作の予想されるreturn "break"の動作をシミュレートできるようになりました。要するに:

  1. クラスのインスタンスは、呼び出されcallbackを実行し、その結果をチェックしたとき
  2. 、すなわち呼び出し可能なクラスのインスタンスを望んだcallbackのラッパーを作成します。
    • 結果が"break"ある場合、一時的イベントの伝播をハイジャック:bind空のコールバックと、tag_bindに結合した同じイベントにCanvasウィジェット。その後、アイドル時間の後、unbind
    • 結果が"break"でない場合:何もしない、イベントは

自動的Canvasに伝播されます上記のリンクはTextウィジェットとの完全な実施例を示していますが、それはすぐにキャンバスに転写ウィジェット。

関連する問題