如何将tkinter画布滚动到绝对位置?

Den*_*aia 2 python scroll canvas tkinter

我正在使用Pythontkinter.我有一个Canvas小部件,只显示一个图像.大多数时候图像会比画布尺寸大,但有时它会更小.让我们只关注第一种情况(图像大于画布).

我想将画布滚动到我已计算的绝对位置(以像素为单位).我怎样才能做到这一点?

Den*_*aia 5

在尝试了大约半小时后,我得到了另一个似乎更好的解决方案:

self.canvas.xview_moveto(float(scroll_x+1)/img_width)
self.canvas.yview_moveto(float(scroll_y+1)/img_height)
Run Code Online (Sandbox Code Playgroud)
  • img_width并且img_height是图像的尺寸.换句话说,它们是完全可滚动的区域.

  • scroll_x并且scroll_y是所需左上角的坐标.

  • +1是一个神奇的值,使其精确工作(但只有在scroll_x/y非负面时才应用)

  • 请注意,不需要当前窗口小部件维度,只需要内容的维度.

即使图像小于窗口小部件大小(因此scroll_x/y可以是负片),此解决方案也能很好地工作.

编辑:改进版本:

offset_x = +1 if scroll_x >= 0 else 0
offset_y = +1 if scroll_y >= 0 else 0
self.canvas.xview_moveto(float(scroll_x + offset_x)/new_width)
self.canvas.yview_moveto(float(scroll_y + offset_y)/new_height)
Run Code Online (Sandbox Code Playgroud)