Python 我怎样才能停止在Tkinter举办活动?

Python 我怎样才能停止在Tkinter举办活动?,python,events,tkinter,Python,Events,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.t

我有一些这样的代码

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()
从Tkinter导入*
master=Tk()
def oval_鼠标单击(事件):
打印“椭圆形”
def画布鼠标单击(事件):
“在画布上”打印
w=画布(主画布,宽度=800,高度=600)
uid=w.create_oval(390290410310,fill='blue')
w、 标记绑定(uid,“,lambda x:oval\u鼠标单击(x))
w、 绑定(“,画布\鼠标\单击)
w、 包()
mainloop()
当我点击画布时,控制台中有“在画布中”的消息。 当我点击[椭圆形]时,我有两条消息“在椭圆形”和“在画布中”,但我只想有第一条消息。有什么方法可以阻止事件的发生吗


我可以用一些全局标志来完成这项任务,但我认为Tkl应该有更自然的方式。

以下是处理您的问题的最简单示例:

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()
导入Tkinter
def oval_鼠标单击(事件):
打印“椭圆形”
event.widget.tag_click=True
def画布鼠标单击(事件):
如果event.widget.tag\单击:
event.widget.tag_click=False
返回
“在画布上”打印
root=Tkinter.Tk()
canvas=Tkinter.canvas(宽度=400,高度=300)
oid=canvas.create_oval(400/2-10300/2-10400/2+10300/2+10,fill='blue')
canvas.tag_click=False
canvas.tag\u bind(oid,“,椭圆形\u鼠标单击)
canvas.bind(“,canvas\u鼠标\u单击)
canvas.pack()
root.mainloop()

Canvas

下没有其他更简单的方法来处理这个问题,我刚刚发布了一个关于类似问题的改进解决方案

其核心思想与前面的解决方案相同:通过使用与
tag\u bind
相同的事件序列绑定
Canvas
小部件来劫持它。我提出的改进解决方案现在可以模拟Tk的其他绑定+回调对的预期
返回“break”
行为。简言之:

  • 围绕所需的
    回调
    ,即可调用类实例,创建一个包装器
  • 调用类实例时,运行
    callback
    并检查其结果。
    • 如果结果是
      “break”
      ,则临时劫持事件传播:
      bind
      Canvas
      小部件绑定到绑定到
      tag\u bind
      的同一事件,并使用空回调。然后,在空闲时间后,
      解除绑定
    • 如果结果不是
      “break”
      :不执行任何操作,则事件将自动传播到
      画布

  • 上面的链接列出了
    文本
    小部件的完整工作示例,但它可以立即转移到画布小部件。

    您已经找到了最简单的方法,
    返回“break”
    不适用于画布标记绑定。相关:可能重复