繁体   English   中英

如何找到哪个Canvas项目更接近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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM