python - 单击时如何获取形状的标签

标签 python events user-interface click tkinter

假设我在 Tkinter 应用程序中创建了一个 Canvas 。

在 Canvas 中,我画了几个矩形。

本质上我想要的是知道用户点击了哪个矩形,这是我主要关心的问题,但这是我已经尝试过的并且我认为可能是解决方案。

这是我的布局:

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
  • 字符
  • 键符
  • 键码
  • 数量
  • 宽度、高度
  • 输入

似乎都没有指出我点击了哪个矩形。

我想在这里为 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”的数学运算,并根据点击的坐标计算用户点击了哪个矩形,这个对于我正在尝试做的事情来说似乎过于复杂,尽管我以前做过并且它显然有效。

我希望问题很清楚,否则请要求任何澄清。

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

最佳答案

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

event.widget.find_withtag("current")

标签“current”比较特殊,代表鼠标下最上面的对象。

关于python - 单击时如何获取形状的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7602122/

相关文章:

python - 跨多个进程使用双端队列对象

python - 在 kivy python 中将按钮的背景更改为不同的形状和样式,如阴影效果等

.net - 使用水平滚动条的滚动面板

java - 以编程方式创建编辑文本并将其对齐到 TextView 的右侧

python - 如何为 Python 整数文字使用数字分隔符?

java - 用 java/c++ 扩展 php?

python - 我想通过PyCall在Julia上使用OpenCV

javascript - 如何处理网页中的两个滚动事件

javascript - IFrame 中不会发生事件冒泡

javascript - mouseover 和 mouseout 事件可以不匹配吗?