2013-01-23 36 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() 

一些代碼,當我在控制檯上單擊畫布我有「帆布」的消息。 當我點擊]橢圓形我有兩條消息「橢圓形」和「畫布」,但我想只有第一條消息。有什麼辦法可以阻止事件發生?

我可以用一些全球性的標誌來完成這項任務,但我認爲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上發佈了一個改進的解決方案。

其核心思想與以前的解決方案中提出的一樣:使用與tag_bind相同的事件序列綁定Canvas小部件,從而劫持小部件。我想出的改進解決方案現在可以模擬Tk的其他綁定+回調對的預期return "break"行爲。總之:

  1. 創建周圍的希望callback,包裝即一個可調用的類實例
  2. 當類實例被調用,運行callback並檢查其結果。
    • 如果結果是"break",暫時劫持事件傳播:bindCanvas插件結合於tag_bind,用空回調相同的事件。然後,在空閒時間後,unbind
    • 如果結果不是"break":什麼都不做,該事件將傳播到Canvas自動

上面的鏈接列出了與Text部件完整的工作的例子,但它是立即轉移到畫布小部件。