如何在单击时获取形状的标记

Tru*_*ufa 3 python events user-interface tkinter click

假设我在Tkinter应用程序中创建了一个画布.

在画布中,我绘制了几个矩形.

我本质上想要的是知道用户点击了哪个矩形,这是我的主要关注点,但这是我尝试过的,我认为可能是解决方案.

这是我的布局:

for x in range(1,6):
        for y in range(1,7):     
            tableNumber = y + 6*(x-1)
            w.create_rectangle((table.xSeparation + table.width) * y - table.width,
                               (table.ySeparation + table.height) * x -  table.height,
                               (table.xSeparation + table.width)*y,
                               (table.ySeparation + table.height) * x,

                               fill="brown", tags="table" + str(tableNumber))

            w.tag_bind("table" + str(tableNumber), '<Button-1>', do)
Run Code Online (Sandbox Code Playgroud)

所以这只是在行和列布局中创建矩形.

每个矩形都有一个特定的标签,形式为table1,table2to table30.

当我单击矩形时,该do函数执行.

让我们说do就像这样:

def do(event):
    print "click"
Run Code Online (Sandbox Code Playgroud)

对于矩形中的每次单击,我都不会在控制台中获得"单击".

我希望能够获得点击矩形的标签,以便能够执行以下操作:

def do(event):
    print str(theTagOfTheClickedRectangle)
Run Code Online (Sandbox Code Playgroud)

所以我查看了我可以调用哪些事件:

  • 小部件
  • x,y
  • x_root,y_root
  • 烧焦
  • 键符
  • 关键代码
  • NUM
  • 宽度,高度
  • 类型

似乎没有人指出我点击了什么矩形.

我想在do这里为函数添加更多参数:

w.tag_bind("table" + str(tableNumber), '<Button-1>', do(event, tag))
Run Code Online (Sandbox Code Playgroud)

但这似乎没有用,但也许我做得do不对:

do(event, tag): #this doesn't work at all!!
    print event.x
    print tag
Run Code Online (Sandbox Code Playgroud)

我希望这个问题很明确,如果我得到标签的方式与我能得到事件的'x'和'y'相同,那将非常舒服.

我现在能想到的唯一实际解决方案是计算'event.x'和'event.y'的数学,并根据点击的坐标计算用户点击的矩形,这似乎过于复杂我正在尝试做什么,虽然我之前已经做过,但它显然有效.

我希望问题很明确,其他明智的请求任何澄清.

请注意,我不依赖于任何此代码,而是,我正在寻找这个问题的解决方案,即使没有使用标签,或其他类型的小部件或其他更容易的方法,最有效的将工作.

Bry*_*ley 7

你可以使用这样的东西来引用被点击的对象:

event.widget.find_withtag("current")
Run Code Online (Sandbox Code Playgroud)

标签"current"是特殊的,代表鼠标下方最顶层的对象.