Python中检测对象的最佳方法是什么';用鼠标点击ID?

Python中检测对象的最佳方法是什么';用鼠标点击ID?,python,python-3.x,tkinter,canvas,tkinter-canvas,Python,Python 3.x,Tkinter,Canvas,Tkinter Canvas,我想问一下,Python中与使用函数创建的画布对象交互的最佳方式是什么。我的示例代码: import tkinter window = tkinter.Tk() canvas = tkinter.Canvas(width=1000, height=600, bg="black") canvas.pack() def rectangle(x, y): canvas.create_rectangle(x, y, x + 5, y + 5, fill="whit

我想问一下,Python中与使用函数创建的画布对象交互的最佳方式是什么。
我的示例代码:

import tkinter
window = tkinter.Tk()
canvas = tkinter.Canvas(width=1000, height=600, bg="black")
canvas.pack()

def rectangle(x, y):
    canvas.create_rectangle(x, y, x + 5, y + 5, fill="white")

rect1 = rectangle(20, 50)
rect2 = rectangle(180, 30)
rect3 = rectangle(698, 322)
rect4 = rectangle(900, 66)
rect5 = rectangle(10, 506)
rect6 = rectangle(208, 455)

检测用鼠标单击的对象的ID,然后在另一个函数中将这些ID用作参数的最佳方法是什么?谢谢您的回答。

使用
tag\u bind

import tkinter
from functools import partial

window = tkinter.Tk()
canvas = tkinter.Canvas(width=1000, height=600, bg="black")
canvas.pack()

def on_click(item, event=None):
    print(f"Item id {item} was clicked!")

def rectangle(x, y):
    item_id = canvas.create_rectangle(x, y, x + 5, y + 5, fill="white")
    canvas.tag_bind(item_id, '<Button-1>', partial(on_click, item_id))

rect1 = rectangle(20, 50)
rect2 = rectangle(180, 30)
rect3 = rectangle(698, 322)
rect4 = rectangle(900, 66)
rect5 = rectangle(10, 506)
rect6 = rectangle(208, 455)

window.mainloop()
导入tkinter
从functools导入部分
window=tkinter.Tk()
canvas=tkinter.canvas(宽度=1000,高度=600,bg=“黑色”)
canvas.pack()
单击时的def(项目,事件=无):
打印(f“已单击项目id{Item}!”)
def矩形(x,y):
item_id=canvas。创建_矩形(x,y,x+5,y+5,fill=“白色”)
canvas.tag_bind(项_id',部分(单击时,项_id))
rect1=矩形(20,50)
rect2=矩形(180,30)
rect3=矩形(698322)
rect4=矩形(900,66)
rect5=矩形(10506)
rect6=矩形(208455)
window.mainloop()

画布有一个名为“查找最近的对象”的方法,该方法将返回距离光标最近的对象

def highlight_nearest(event):
    canvas = event.widget
    x = canvas.canvasx(event.x)
    y = canvas.canvasy(event.y)
    item = canvas.find_closest(x, y)
    canvas.itemconfigure(item, fill="red")

canvas.bind("<1>", highlight_nearest)
def高亮显示(事件):
canvas=event.widget
x=canvas.canvasx(event.x)
y=canvas.canvasy(event.y)
项目=画布。查找最近的(x,y)
canvas.itemconfigure(item,fill=“红色”)
canvas.bind(“,突出显示_)
find_closest
方法采用x和y坐标,以及可选的
halo
start
参数

这就是我们要说的:

选择最接近x和y给定点的项目。如果多个项目位于同一最近距离(例如,两个项目重叠该点),则使用这些项目中最顶部的项目(显示列表中的最后一个)。如果指定了halo,则它必须是非负值。任何比光晕更接近该点的项目都被视为与该点重叠。start参数可用于循环遍历所有最近的项。如果指定了start,则使用标记或id命名项目(如果按标记,则选择显示列表中具有给定标记的第一个项目)。此表单将选择显示列表中“开始”下方的最顶端最近的项目,而不是选择最顶端最近的项目;如果不存在此类项,则选择的行为与未指定start参数的行为相同


非常感谢,不过我想知道是否有可能将像
rect1
rect2
等ID作为字符串变量的值(并最终打印它们或在代码中的其他地方使用它们。@bilykralik16为此,一种方法是将变量
rect1
等存储到列表中,然后使用索引访问它们,如果您不打算在将来实际使用这些对象,那么您最好只存储与每个对象对应的字符串。您可以使用
>canvas.find_with tag(“current”)
以获取正在单击的画布对象的项目ID。