如何在Tkinter的Label(含图片)上方绘制点?需保留Label
解决Tkinter中Label图片上方绘制点被遮挡的问题
你当前的问题核心是Label组件层级高于Canvas,导致Canvas上的绘制内容被遮挡,且无法直接在Label上绘图。解决方案是在Label上方叠加一个视觉透明的Canvas,用来承载绘制的点,同时保留原Label的交互和显示功能。
修改后的代码
import tkinter as tk from PIL import Image from PIL import ImageTk class interface: def __init__(self, root): self.root = root self.panelA = None self.f1 = tk.Frame(self.root) self.f1.grid() # 保留原底层Canvas结构 self.canvas2 = tk.Canvas(self.f1, height=610, width=1050) self.canvas2.grid(row=0, column=0) # 新增顶层Canvas用于绘制点,设置为视觉透明 self.draw_canvas = tk.Canvas(self.f1, height=610, width=1050, highlightthickness=0, bg=self.f1['bg']) self.draw_canvas.grid(row=0, column=0) def select_image(self): image = Image.open("Graf/Ag8.png") resize_image = image.resize((1050, 610)) image = ImageTk.PhotoImage(resize_image) self.panelA = tk.Label(self.f1, image=image) self.panelA.bind("<Button-1>", self.callback) self.panelA.image = image # 将Label置于底层Canvas和顶层绘制Canvas之间 self.panelA.grid(row=0, column=0) def callback(self, event): # 在顶层Canvas上绘制红色圆点(半径3) self.draw_canvas.create_oval(event.x-3, event.y-3, event.x+3, event.y+3, fill="red", outline="red") print(event.x, event.y) def main(): root = tk.Tk() obj_interface = interface(root) obj_interface.select_image() root.mainloop() if __name__ == '__main__': main()
关键说明
- 层级关系:顶层
draw_canvas的层级高于Label,所以绘制的点会显示在图片上方;Label又高于底层canvas2,保证图片正常显示。 - 透明效果:通过
highlightthickness=0去掉Canvas边框,bg=self.f1['bg']让Canvas背景与父容器一致,实现视觉上的透明。如果需要跨平台完全透明,可针对系统调整:- macOS:设置
bg='systemTransparent' - Windows:添加
self.draw_canvas.config(transparentcolor=self.f1['bg'])
- macOS:设置
- 坐标一致性:顶层Canvas与Label尺寸、位置完全重合,点击Label获取的坐标可直接用于Canvas绘制,确保点的位置准确。
内容的提问来源于stack exchange,提问作者Sigel Alex
相关产品推荐
相关产品推荐

