为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

人到中年有点甜 2021-10-19 17:16:14
我正在使用 tkinter 进行一个非常简单的 python 编程。我想在画布上绘制一些矩形,然后当单击某个矩形时,显示该矩形的标签。我无法让它工作。问题似乎是无论我在画布上单击何处,函数 get_closest 都会返回 1。感谢任何帮助。这是我第一次使用 tkinter(以及与此相关的 python),因此也欢迎对我的代码进行与问题本身无关的任何评论!import tkinter as tkmyrecs = [[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 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

find_closest返回1意味着它正在查找您在画布中创建的第一个元素,在本例中是create_text.


奇怪的是,当你create_text使用text=""它时,它似乎超越了你所有的其他元素。通过一个简单的修复,text=" "现在可以在点击时找到壁橱矩形。


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


事实上,如果您尝试过,find_above(item)您会注意到text始终低于之后绘制的其他元素。


简而言之:


# Change this:

self.tag = self.canvas.create_text(10, 150, text="", anchor="nw") 


# To this:

self.tag = self.canvas.create_text(10, 150, text=" ", anchor="nw") 


查看完整回答
反对 回复 2021-10-19
  • 1 回答
  • 0 关注
  • 222 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号