代码之家  ›  专栏  ›  技术社区  ›  Denilson Sá Maia

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

  •  2
  • Denilson Sá Maia  · 技术社区  · 15 年前

    我在用 蟒蛇 特金特 . 我有一个 Canvas 只显示一个图像的小部件。大多数情况下,图像会比画布尺寸大,但有时会更小。让我们只关注第一个案例(图像大于画布)。

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

    2 回复  |  直到 15 年前
        1
  •  5
  •   Denilson Sá Maia    15 年前

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

    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 非负)

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

    即使图像小于小部件大小(因此 ScRelyx 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)
    
        2
  •  0
  •   Denilson Sá Maia    15 年前

    我已经这样做了:

    # 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 我被要求添加,否则将被取消一个)

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

    推荐文章