2011-09-29 66 views
3

可以说我在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函数执行。

比方说,你是这样的:

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'的数学,并根据点击的坐标计算用户点击了哪个矩形,这似乎过于复杂,我想要做的,虽然我已经做到了,它显然工作。

我希望这个问题是清楚的,其他明智请向任何澄清。

请注意,我不依赖于任何这段代码的,相反,我正在寻找这个问题的解决方案,最有效的将工作,即使不使用标签的手段,或其他类型的控件或任何的是更容易。

回答

7

您可以使用这样的引用被点击的对象:

event.widget.find_withtag("current") 

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

+0

谢谢@Bryan!这是一个非常简单和正确的解决方案!我检查了你的个人资料,你似乎对tkinter有相当多的了解。我可以问你经常使用哪些文件吗?我喜欢tkinter的简单性,但我发现它的文档非常不完整。例如,你所建议的答案在我使用过的任何文件中都没有提及。非常感谢你! – Trufa

+1

@Trufa:对于相关的传统知识工具包信息的权威网站是在http://tcl.tk/man/tcl8.5/TkCmd/contents.htm官方手册页。这些对于Tcl语言来说是特定的,但是将信息适配到tkinter是一个非常简单的思维转换。有关特定于tkinter的信息,请访问http://effbot.org/tkinterbook/(以及该站点FWIW上提及的“当前”标签)。最后一个带有一些有用信息的网站是http://www.tkdocs.com,它覆盖了python,perl,tcl和ruby。 –

+0

非常感谢!我不知道Tcl的一个,我会检查出来,其他的是那些通常在谷歌搜索中出现的。我无法相信我错过了列表框中的“当前”,可能是因为我不知道我在找什么。无论如何,再次感谢! – Trufa

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) 

拉姆达创建一个与标签名作为第二个参数的默认值的函数。 Tkinter只用一个参数调用该函数,事件,第二个参数使用默认值。

+0

这真是太真棒!它的作用就像一个魅力,它完全**我正在寻找!非常感谢!别的我唯一会问,如果你能解释一下我,你在这行做了什么有一点点'回调=拉姆达事件,标签=标签:DO(事件,标签)',我由拉姆达弄得有点功能。非常感谢你! – Trufa

+0

它相当于'def callback(event,t = tag):return do(event,t)'。 –

+0

我改变了接受的答案布莱恩的简单,主要是因为因为它是一个我会使用,即便如此,再次感谢您的答案,它的工作如预期。 – Trufa