如何在 tkinter Canvas 中检测点击对象的标签?
How do I detect tags of clicked objects in tkinter Canvas?
请问如何检测Pythontkinter.Canvas()
中的标签。我已经用一些基本的 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)
我想获得这些值,例如 lines
、ovals
、square_5_4
、square_7_1
等。有人知道如何做吗? O:)
您可以遍历 canvas 上的所有项目 ID,获取它们的标签并将函数绑定到单击该对象(如果您需要所有对象(在 [=11 之前创建) =] 循环) 在 canvas 上执行此操作):
import tkinter as tk
root = tk.Tk()
canvas = tk.Canvas(root, 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}")
# loop over all items on the canvas, get their first tag (for simplicity) and bind that tag
# to clicking on the object and make that call the function that will print the tag name
# use a default value so that the correct tag is printed
for item_id in canvas.find_all():
tag = canvas.gettags(item_id)[0]
canvas.tag_bind(tag, '<Button-1>', lambda _, t=tag: print(t))
root.mainloop()
作为@Matiiss in a comment, you can use a Canvas
object's tag_bind()
将回调函数绑定到特定事件(例如按钮 1 的点击)的方法。下面的代码——基于你的代码——说明了类似的事情是如何完成的。
它创建调用通用 pick()
单击事件处理函数并将原始事件对象传递给它的匿名 lambda
函数 plus 当前与对象关联的标签名称。
import tkinter
def pick(event, tag):
print(f'tag: {tag!r}, coords: {event.x}, {event.y}')
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.tag_bind('lines', '<Button-1>', lambda event: pick(event, 'lines'))
canvas.create_oval(200, 250, 300, 350, fill='yellow', tags='ovals')
canvas.create_oval(400, 250, 500, 350, fill='blue', tags='ovals')
canvas.tag_bind('ovals', '<Button-1>', lambda event: pick(event, 'ovals'))
for j in range(4):
for i in range(10):
tag = f'square_{j}_{i}'
canvas.create_rectangle(i*70 + 10, j*60 + 10, i*70 + 60, j*60 + 50,
fill='lightblue', tags=tag)
canvas.tag_bind(tag, '<Button-1>', lambda event, tag=tag: pick(event, tag))
tkinter.mainloop()
您无需遍历所有项目即可获得 canvas 项目的标签。在 canvas 上单击的任何项目都分配有 "current"
标签。
您只需将 canvas.find_withtag
与 canvas.gettags
一起使用,或将 "current"
直接传递给 gettags
,它将 return 您所有相关联的标签canvas 项。
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()
请问如何检测Pythontkinter.Canvas()
中的标签。我已经用一些基本的 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)
我想获得这些值,例如 lines
、ovals
、square_5_4
、square_7_1
等。有人知道如何做吗? O:)
您可以遍历 canvas 上的所有项目 ID,获取它们的标签并将函数绑定到单击该对象(如果您需要所有对象(在 [=11 之前创建) =] 循环) 在 canvas 上执行此操作):
import tkinter as tk
root = tk.Tk()
canvas = tk.Canvas(root, 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}")
# loop over all items on the canvas, get their first tag (for simplicity) and bind that tag
# to clicking on the object and make that call the function that will print the tag name
# use a default value so that the correct tag is printed
for item_id in canvas.find_all():
tag = canvas.gettags(item_id)[0]
canvas.tag_bind(tag, '<Button-1>', lambda _, t=tag: print(t))
root.mainloop()
作为@Matiiss Canvas
object's tag_bind()
将回调函数绑定到特定事件(例如按钮 1 的点击)的方法。下面的代码——基于你的代码——说明了类似的事情是如何完成的。
它创建调用通用 pick()
单击事件处理函数并将原始事件对象传递给它的匿名 lambda
函数 plus 当前与对象关联的标签名称。
import tkinter
def pick(event, tag):
print(f'tag: {tag!r}, coords: {event.x}, {event.y}')
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.tag_bind('lines', '<Button-1>', lambda event: pick(event, 'lines'))
canvas.create_oval(200, 250, 300, 350, fill='yellow', tags='ovals')
canvas.create_oval(400, 250, 500, 350, fill='blue', tags='ovals')
canvas.tag_bind('ovals', '<Button-1>', lambda event: pick(event, 'ovals'))
for j in range(4):
for i in range(10):
tag = f'square_{j}_{i}'
canvas.create_rectangle(i*70 + 10, j*60 + 10, i*70 + 60, j*60 + 50,
fill='lightblue', tags=tag)
canvas.tag_bind(tag, '<Button-1>', lambda event, tag=tag: pick(event, tag))
tkinter.mainloop()
您无需遍历所有项目即可获得 canvas 项目的标签。在 canvas 上单击的任何项目都分配有 "current"
标签。
您只需将 canvas.find_withtag
与 canvas.gettags
一起使用,或将 "current"
直接传递给 gettags
,它将 return 您所有相关联的标签canvas 项。
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()