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

时间:2010-10-16 20:59:20

标签: python canvas scroll tkinter

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

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

3 个答案:

答案 0 :(得分:5)

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

self.canvas.xview_moveto(float(scroll_x+1)/img_width)
self.canvas.yview_moveto(float(scroll_y+1)/img_height)
  • img_widthimg_height是图片的尺寸。换句话说,它们是完全可滚动的区域。

  • scroll_xscroll_y是所需左上角的坐标。

  • +1是一个 magic 值,可使其正常工作(但只应在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)

答案 1 :(得分:0)

这就是我已经做过的事情:

# Little hack to scroll by 1-pixel increments.
oldincx = self.canvas["xscrollincrement"]
oldincy = self.canvas["yscrollincrement"]
self.canvas["xscrollincrement"] = 1
self.canvas["yscrollincrement"] = 1
self.canvas.xview_moveto(0.0)
self.canvas.yview_moveto(0.0)
self.canvas.xview_scroll(int(scroll_x)+1, UNITS)
self.canvas.yview_scroll(int(scroll_y)+1, UNITS)
self.canvas["xscrollincrement"] = oldincx
self.canvas["yscrollincrement"] = oldincy

但是......正如你所看到的......它非常黑暗和丑陋。对于一些应该简单的事情来解决大问题。 (加上魔法+1我需要添加,或者它会逐个添加)

还有其他人有更好更清洁的解决方案吗?

答案 2 :(得分:0)

在tkinter中,您可以获取width文件的heightPhotoImage。您可以在使用canvas.create_image

时调用它
imgrender = PhotoImage(file="something.png")
##Other canvas and scrollbar codes here...
canvas.create_image((imgrender.width()/2),(imgrender.height()/2), image=imgrender)
## The top left corner coordinates is (width/2 , height/2)