如何在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
相关产品推荐
相关产品推荐

