如何检测 tkinter Canvas 中单击对象的标签?

bil*_*k16 1 python canvas tkinter tkinter-canvas

我想问一下如何检测Python中的标签tkinter.Canvas()。我已经设置了一个示例程序,其中包含一些基本的画布对象,并且所有这些对象都已分配给某个标签。我想要的是,如果我单击该对象但不知道如何执行此操作,则获取该标记值。

例如当我有这个代码时:

import tkinter
canvas = tkinter.Canvas(width=800, height=400)
canvas.pack()

canvas.create_line(20, 100, 150, 350, tags="lines")
canvas.create_line(50, 20, 300, 20, tags="lines")
canvas.create_oval(200, 250, 300, 350, fill="yellow", tags="ovals")
canvas.create_oval(400, 250, 500, 350, fill="blue", tags="ovals")

for j in range(4):
    for i in range(10):
        canvas.create_rectangle(i * 70 + 10, j * 60 + 10, i * 70 + 60, j * 60 + 50, fill="lightblue", tags=f"square_{j}_{i}")

def click(coords):
    print(coords.x, coords.y)

canvas.bind("<Button-1>", click)
Run Code Online (Sandbox Code Playgroud)

我想获得这些值,例如、 、linesovals。请问有人知道如何做吗?哦:)square_5_4square_7_1

Art*_*Art 5

您无需循环遍历所有项目即可获取画布项目的标签。单击画布上的任何项目都会分配"current"标签。

您只需使用canvas.find_withtagwithcanvas.gettags"current"直接传递给gettags,它就会返回与画布项关联的所有标签。

import tkinter


canvas = tkinter.Canvas(width=800, height=400)
canvas.pack()

canvas.create_line(20, 100, 150, 350, tags="lines")
canvas.create_oval(400, 250, 500, 350, fill="blue", tags="ovals")

for j in range(4):
    for i in range(10):
        canvas.create_rectangle(i * 70 + 10, j * 60 + 10, i * 70 + 60, j * 60 + 50, fill="lightblue", tags=f"square_{j}_{i}")

def click(event):

    #currently_clicked = canvas.find_withtag("current")
    #if currently_clicked:
    print(canvas.gettags("current")) # the first index will contain your desired output
   
canvas.bind("<Button-1>", click)
canvas.mainloop()
Run Code Online (Sandbox Code Playgroud)