如何将Tkinter画布坐标转换为窗口坐标?

8 投票
1 回答
9094 浏览
提问于 2025-04-17 04:34

有没有办法把画布上的坐标转换成窗口上的坐标呢?

这其实是窗口坐标转到画布坐标的反向操作,窗口坐标转画布坐标的方法是这样的:

x = canvas.canvasx(event.x)

1 个回答

11

使用 canvasxcanvasy 这两个方法,传入参数零,可以计算出可见画布的左上角的 x/y 坐标。然后,你只需要用数学运算把画布的坐标转换成相对于窗口的坐标。

# upper left corner of the visible region
x0 = self.canvas.canvasx(0)
y0 = self.canvas.canvasy(0)

# given a canvas coordinate cx/cy, convert it to window coordinates:
wx0 = cx-x0
wy0 = cy-y0

举个例子,如果画布完全滚动到最上面和最左边,那么 x0 和 y0 就都是零。你给出的任何画布坐标都会和窗口坐标相同(也就是说,画布的坐标 0,0 对应窗口的坐标 0,0)。

如果你向下和向右滚动了 100 像素,那么画布坐标 100,100 会转换成窗口坐标 0,0,因为那是窗口左上角的像素。

这样你就得到了相对于画布左上角的值。如果你需要的是相对于整个窗口左上角的值,可以使用 winfo_xwinfo_y 来获取画布相对于窗口的坐标,然后再做一些数学运算。或者,使用 winfo_rootxwinfo_rooty 来获取小部件相对于屏幕的坐标。

撰写回答