如何在Tkinter中获取Label加载的CV2图片区域内的鼠标点击坐标?
解决Tkinter中仅点击图片区域获取鼠标坐标的问题
完全可以通过Tkinter实现仅点击图片区域时获取坐标,核心是将鼠标点击事件绑定到承载图片的Label组件上,而非主窗口。以下是修改后的代码及关键说明:
修改要点
- 给显示图片的
panelALabel绑定<Button-1>(左键点击)事件,仅当点击图片区域时触发坐标获取 - 实现事件处理函数,提取相对于图片的坐标(
event.x/event.y即为图片内部坐标)
修改后的完整代码
import tkinter as tk from tkinter import ttk, filedialog import cv2 from PIL import Image from PIL import ImageTk class interface: def __init__(self): self.panelA = None self.path = None self.s = None self.a = None self.root = tk.Tk() self.f1 = tk.Frame(self.root) self.f1.grid(row=0, column=0) self.f2 = tk.Frame(self.root) self.f2.grid(row=0, column=1) self.e = tk.Entry(self.f1) self.e.grid(column=1, row=1, sticky='ew') self.l1 = tk.Label(self.f1, text="Choose a picture") self.l1.grid(column=0, row=0, sticky='ew') self.l2 = tk.Label(self.f1, text="Введите напор H, м") self.l2.grid(column=0, row=1, sticky='ew') b1 = tk.Button(self.f1, text="Specify the file with the characteristic", command=self.select_image) b1.grid(column=0, row=0, sticky='ew', columnspan=3) b2 = tk.Button(self.f1, text="select the pressure") b2.grid(column=2, row=1, sticky='ew') columns = ['N', 'ny'] self.table = ttk.Treeview(self.f1, columns=columns, show='headings', height=20) self.table.heading("N", text="N") self.table.heading("ny", text="%") self.table.grid(column=0, row=3, columnspan=3, sticky='ew') self.root.mainloop() def get_s(self): return self.s def select_image(self): self.path = filedialog.askopenfilename() if self.path: image = cv2.imread(self.path) # 保存原图尺寸,用于后续坐标映射(如果需要) self.original_width, self.original_height = image.shape[1], image.shape[0] image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) image = Image.fromarray(image) self.display_image = image # 保存显示用的图片对象 image = ImageTk.PhotoImage(image) if self.panelA is None: self.panelA = tk.Label(self.f2, image=image) self.panelA.image = image # 绑定左键点击事件到图片Label self.panelA.bind("<Button-1>", self.on_image_click) self.panelA.grid() else: self.panelA.configure(image=image) self.panelA.image = image def on_image_click(self, event): # 获取相对于图片Label的坐标,即图片显示区域的坐标 display_x = event.x display_y = event.y print(f"图片显示区域坐标:x={display_x}, y={display_y}") # 如果需要映射回原图坐标(当图片被缩放时) display_width, display_height = self.display_image.size original_x = int(display_x * self.original_width / display_width) original_y = int(display_y * self.original_height / display_height) print(f"原图对应坐标:x={original_x}, y={original_y}") obj_interface = interface()
额外说明
如果图片在Label中被缩放(比如Label大小与原图尺寸不一致),代码中已经加入了原图坐标的映射逻辑,可直接使用;若图片未被缩放,直接使用display_x和display_y即可。
内容的提问来源于stack exchange,提问作者Sigel Alex
相关产品推荐
相关产品推荐

