我正在使用Python和tkinter。我有一个只显示一个图像的Canvas
小部件。大多数时候图像会比画布尺寸大,但有时会更小。我们只关注第一种情况(图片大于画布)。如何将tkinter画布滚动到绝对位置?
我想滚动画布到我已计算的绝对位置(以像素为单位)。我怎样才能做到这一点?
我正在使用Python和tkinter。我有一个只显示一个图像的Canvas
小部件。大多数时候图像会比画布尺寸大,但有时会更小。我们只关注第一种情况(图片大于画布)。如何将tkinter画布滚动到绝对位置?
我想滚动画布到我已计算的绝对位置(以像素为单位)。我怎样才能做到这一点?
试图约半小时后,我得到了另一种解决方案,这似乎更好:
self.canvas.xview_moveto(float(scroll_x+1)/img_width)
self.canvas.yview_moveto(float(scroll_y+1)/img_height)
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)
这是我已经做了:
# 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
但是......正如你可以看到... ...这是非常hackish的和丑陋的。对于应该很简单的事情来说,有很多解决方法。 (加上那个神奇的+1
我被要求补充,否则会被错过)
其他人有没有另一种更好更清洁的解决方案?