2013-01-23 35 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部件完整的工作的例子,但它是立即转移到画布小部件。