You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Tkinter中获取Label加载的CV2图片区域内的鼠标点击坐标?

解决Tkinter中仅点击图片区域获取鼠标坐标的问题

完全可以通过Tkinter实现仅点击图片区域时获取坐标,核心是将鼠标点击事件绑定到承载图片的Label组件上,而非主窗口。以下是修改后的代码及关键说明:

修改要点

  • 给显示图片的panelA Label绑定<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:05:24