温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python - How can I find overlapping objects on a tkinter canvas?
canvas python tkinter overlap

python - 如何在Tkinter画布上找到重叠的对象?

发布于 2020-04-10 17:41:27

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

import tkinter as tk
import random as rand


class GUI:
    def __init__(self, master, width, height):
        self.master = master
        self.w = width
        self.h = height
        self.canvas = tk.Canvas(master, width=width, height=height)
        self.canvas.pack()
        self.create_objects()

    def create_objects(self):
        r = 5
        for i in range(100):
            x = rand.uniform(0,1)*width
            y = rand.uniform(0,1)*height
            self.canvas.create_oval(x-r,y-r,x+r,y+r, fill="red")

    def find_overlaps(self):
        pass


width = 800
height = 600

root = tk.Tk()
app = GUI(root, width, height)
root.mainloop()

我想为find_overlaps函数提供重叠的对象ID对(如果发生这种情况,则为三重)。有没有简单/有效的方法来做到这一点?

查看更多

提问者
Daniel Casasampera
被浏览
108
mathfux 2020-02-02 05:42

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

  1. 获取在上创建的对象ID的元组canvas您可以使用canvas.find_all()方法来做
  2. 使用获取这些对象的坐标canvas.coords(id)

我已经检查了的标准find_overlapping方法canvas它有助于确定仅与特定矩形重叠的对象,我想您需要借助此方法来解决一些数学问题。虽然,我发现了一个不错的选择,而不是基于find_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)}

注意

from scipy.spatial import cKDTree 是必须的