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

如何在Tkinter中获取图像坐标而非画布坐标

解决Canvas滚动后获取图像实际坐标的问题

问题说明

在使用方向键滚动Canvas浏览10000*9000像素的超大图像时,当前鼠标点击获取的是Canvas可见视口的坐标(比如视口左上角始终返回(0,0)),无法得到图像本身的实际像素坐标。

问题根源

你当前代码里直接使用event.x和event.y,这两个值是鼠标相对于Canvas可见区域的坐标,而非Canvas整个滚动画布(即图像所在的完整区域)的坐标。当Canvas滚动后,视口位置偏移,这两个值自然无法对应图像的真实位置。

解决方法

使用Tkinter Canvas内置的canvasx()和canvasy()方法,将视口坐标转换为画布内部的实际坐标(也就是图像的像素坐标)。这两个方法会自动计算Canvas的滚动偏移量,直接返回图像上的真实位置。

修改后的核心代码

def get_mouse_posn(event):
    global topy, topx
    # 将视口x/y坐标转换为图像实际坐标
    topx = canvas.canvasx(event.x)
    topy = canvas.canvasy(event.y)

def update_sel_rect(event):
    global rect_id
    global topy, topx, botx, boty
    # 同样转换坐标
    botx = canvas.canvasx(event.x)
    boty = canvas.canvasy(event.y)
    canvas.coords(rect_id, topx, topy, botx, boty)  # 更新选框的实际坐标

原理解释

  • canvas.canvasx(event.x):把鼠标在Canvas视口的x坐标,转换为Canvas整个滚动画布的x坐标,自动叠加水平滚动的偏移量。
  • canvas.canvasy(event.y):同理,转换y坐标,叠加垂直滚动的偏移量。
    这样无论Canvas滚动到哪个位置,获取到的都是图像上的真实像素坐标。

内容的提问来源于stack exchange,提问作者nobody

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:39:46