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

时间:2011-09-29 19:02:09

标签: python events user-interface click tkinter

假设我在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)

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

每个矩形都有table1table2table30形式的特定标记。

当我点击矩形时,do函数会执行。

让我们说do就像:

def do(event):
    print "click"

对于矩形中的每次点击,我都没有在控制台中获得“点击”。

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

def do(event):
    print str(theTagOfTheClickedRectangle)

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

  • 插件
  • x,y
  • x_root,y_root
  • 键符
  • 键码
  • NUM
  • 宽度,高度

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

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

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

但这似乎没有用,但也许我没有做do权利:

do(event, tag): #this doesn't work at all!!
    print event.x
    print tag

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

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

我希望问题清楚,其他明智的请求任何澄清。

请注意,我并不依赖于任何此代码,相反,我正在寻找这个问题的解决方案,即使不使用标记或其他类型的小部件或其他任何东西,最有效的方法也会有效更容易。

2 个答案:

答案 0 :(得分:7)

您可以使用类似的内容来引用点击的对象:

event.widget.find_withtag("current")

标签“current”是特殊的,代表鼠标下方最顶层的对象。

答案 1 :(得分:2)

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

应改为

tag = "table" + str(tableNumber)
callback = lambda event, tag=tag: do(event, tag)
w.tag_bind(tag, '<Button-1>', callback)

lambda创建一个函数,标记名称作为第二个参数的默认值。 Tkinter只使用一个参数调用该函数,该事件和第二个参数使用默认值。