![](/img/trans.png)
[英]How to find is a canvas item is touching another canvas item, Tkinter
[英]How to find which Canvas item is closer to the point clicked in tkinter?
我想找到哪个Canvas
项目更接近我点击的点。 我正在尝试使用 find the closest 但我无法有效地使用它。 我正在尝试制作一个itemlist
,然后找到项目列表中最接近的itemlist
。 我也有self
关键字,因为我正在尝试使用类来完成所有这些工作
def initUI(self):
self.canvas = Canvas(self.parent)
self.item1 = self.canvas.create_oval(50, 50, 60, 60, fill="red")
self.item2 = self.canvas.create_oval(100, 100, 110, 110, fill="red")
self.item3 = self.canvas.create_oval(150, 150, 160, 160, fill="red")
self.itemlist = []
self.itemlist.append(self.item1)
self.itemlist.append(self.item2)
self.itemlist.append(self.item3)
print(self.itemlist)
self.canvas.pack()
self.canvas.bind("<Button-1>", self.find_closest)
def find_closest(self, event):
""" """
正如评论中所指出的,您可以使用 Canvas 方法find_closest()
来完成所需的操作。 下面是根据您问题中的代码执行此操作的可运行示例。 它使用辅助字典 map canvas object 的 ids 到任意字符串(在示例中称为“名称”)。
import tkinter as tk
from tkinter.constants import *
class MyClass:
def __init__(self, parent):
self.parent = parent
self.initUI()
def initUI(self):
self.canvas = tk.Canvas(self.parent)
self.canvas.pack()
self.canvas.bind("<Button-1>", self.find_closest)
# Create dictionary mapping canvas object ids to a name.
self.object_names = {}
id = self.canvas.create_oval(50, 50, 60, 60, fill="Red")
self.object_names[id] = 'Red object'
id = self.canvas.create_oval(100, 100, 110, 110, fill="Blue")
self.object_names[id] = 'Blue object'
id = self.canvas.create_oval(150, 150, 160, 160, fill="Green")
self.object_names[id] = 'Green object'
self.name_lbl1 = tk.Label(self.parent, text='Closest object:')
self.name_lbl1.pack(side=LEFT)
self.name_var = tk.StringVar(value='')
self.name_lbl2 = tk.Label(self.parent, textvariable=self.name_var)
self.name_lbl2.pack(side=LEFT)
def find_closest(self, event):
if (closest := self.canvas.find_closest(event.x, event.y)):
obj_id = closest[0]
self.name_var.set(self.object_names[obj_id]) # Updates lbl2.
if __name__ == '__main__':
root = tk.Tk()
instance = MyClass(root)
root.mainloop()
运行截图:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.