如何在点击时获取最接近的tkinter画布元素?

时间:2019-01-24 18:18:58

标签: python tkinter tkinter-canvas

我正在使用tkinter进行非常简单的python编程。我想在画布上绘制一些矩形,然后单击某个矩形时,显示该矩形的标签。我无法正常工作。问题似乎是,无论我在画布上单击什么位置,函数get_closest都会返回1。感谢您的帮助。这是我第一次使用tkinter(和python),因此也欢迎与我自己的代码无关的任何有关我的代码的评论!

import tkinter as tk

myrecs = [[None for j in range(4)] for i in range(4)]

class application:
    def __init__(self, parent):
        self.parent = parent
        self.frame = tk.Frame(self.parent)
        self.frame.grid(row=0)
        self.quitbutton = tk.Button(self.frame, text = "Quit", command = lambda:quit())
        self.quitbutton.grid(row=0, column = 0, sticky=tk.W + tk.E)
        self.canvas = tk.Canvas(self.frame, width=200, height=200, bg = "blue")
        self.canvas.bind("<ButtonPress-1>", self.buttonclick)
        self.canvas.grid(row=1, columnspan = 2)
        self.tag = self.canvas.create_text(10, 150, text="", anchor="nw") 
        self.makebutton = tk.Button(self.frame, text = "Make nice canvas", command = self.makecanvas)
        self.makebutton.grid(row=0, column = 1, sticky = tk.W + tk.E)

    def makecanvas(self):
        for i in range(4):
            for j in range(4):
                myrecs[i][j] = self.canvas.create_rectangle(20*i, 20*j, 20*(i+1), 20*(j+1), tags=("rectangle", "i"+str(i), "j"+str(j)))    

    def buttonclick(self, event):
        cnv = self.canvas
        item = cnv.find_closest(cnv.canvasx(event.x), cnv.canvasy(event.y))[0]
        tags = cnv.gettags(item)
        cnv.itemconfigure(self.tag, text=tags[0])  

if __name__ == "__main__":
    root = tk.Tk()
    root.title("Test")
    app = application(root)
    root.mainloop()

1 个答案:

答案 0 :(得分:0)

find_closest返回1表示正在查找您在画布中创建的第一个元素,在本例中为create_text

奇怪的是,当您将create_texttext=""一起使用时,似乎已经超过了所有其他元素。通过简单修复text=" ",现在可以在点击时找到壁橱矩形。

与其他元素一起,当您分配option=""时,它实际上禁用(据我所知),因此您正在主动告诉{{1 }}解释器不使用它。可以在其他元素中观察到这一点,例如tcl,其中默认的create_rectangle(..., outline="")将不再适用,并且您甚至都不会获得轮廓。我感觉outline="black"会产生类似的效果,由于某种原因,它基本上覆盖了整个画布区域,因此它导致text=""始终返回该元素。也许如果您很幸运,@ BryanOakley(tcl专家)可以加入后端推理。

实际上,如果您尝试过find_closest,则会发现find_above(item)始终位于您随后绘制的其他元素的下方。

简而言之:

text