Python 如何在tkinter画布上找到重叠的对象?

Python 如何在tkinter画布上找到重叠的对象?,python,canvas,tkinter,overlap,Python,Canvas,Tkinter,Overlap,有什么简单的方法可以找到重叠的对象ID吗? 下面是一个代码示例: 将tkinter作为tk导入 随机导入为rand 类GUI: 定义初始(自身、主控、宽度、高度): self.master=master self.w=宽度 self.h=高度 self.canvas=tk.canvas(母版,宽度=宽度,高度=高度) self.canvas.pack() self.create_对象() def创建_对象(自): r=5 对于范围(100)内的i: x=均匀随机数(0,1)*宽度 y=平均(0,

有什么简单的方法可以找到重叠的对象ID吗? 下面是一个代码示例:

将tkinter作为tk导入
随机导入为rand
类GUI:
定义初始(自身、主控、宽度、高度):
self.master=master
self.w=宽度
self.h=高度
self.canvas=tk.canvas(母版,宽度=宽度,高度=高度)
self.canvas.pack()
self.create_对象()
def创建_对象(自):
r=5
对于范围(100)内的i:
x=均匀随机数(0,1)*宽度
y=平均(0,1)*高度
self.canvas.create_oval(x-r,y-r,x+r,y+r,fill=“红色”)
def查找重叠(自):
通过
宽度=800
高度=600
root=tk.tk()
app=GUI(根、宽度、高度)
root.mainloop()

我想让find_overlaps函数为我提供重叠的对象ID对(如果发生这种情况,则为tripplets)。有什么简单/有效的方法吗?

以下是您可以在此处执行的步骤:

  • 获取在
    画布上创建的对象的ID元组。您可以使用
    canvas.find_all()
    方法来完成
  • 使用canvas.coords(id)获取这些对象的坐标

  • 我已经检查了标准的
    find_重叠
    方法
    canvas
    。它有助于确定哪些对象仅与特定的矩形重叠,我想您需要借助此方法使用一些数学来解决您提到的问题。尽管如此,我还是找到了一个不错的替代方案,而不是基于
    find\u overlapping

    def find_overlaps(self):
        r = 5
        X = []
        tags = self.canvas.find_all() #finds tags of all the object created
        for tag in tags:
            x0, y0, x1, y1 = self.canvas.coords(tag) # corresponding coordinates
            center = [(x0+x1)/2, (y0+y1)/2] #centers of objects
            X.append(center)
    
        tree = cKDTree(X)
        print(tree.query_pairs(2*r))
    
    输出 这是一组成对的标记:

    {(2, 63), (10, 93), (70, 82), (8, 45)}
    

    来自scipy.spatial import cKDTree
    是必需的

    我想不是。如果对象是圆,您可能希望使用一些额外的计算来定义接近的点。在这种情况下,使用KDTrees是一种很好的方法,请查看,非常感谢!,这就是我需要的。你认为这两种方法中哪一种最好?
    find_overlapping
    不能直接找到结果,你需要自己检查每个矩形。另一个区别是,只有当对象是圆时,cKDTrees才精确。非常感谢,这非常有用,因为我的对象是圆,所以我将使用cKDTrees方法。