Как прокрутить холст tkinter в абсолютную позицию? - PullRequest
2 голосов
/ 17 октября 2010

Я использую Python и tkinter . У меня есть Canvas виджет, который будет отображать только одно изображение. В большинстве случаев изображение будет больше, чем размеры холста, но иногда оно будет меньше. Давайте просто сосредоточимся на первом случае (изображение больше, чем холст).

Я хочу прокрутить холст до абсолютной позиции, которую я уже рассчитал (в пикселях). Как я могу это сделать?

Ответы [ 2 ]

5 голосов
/ 17 октября 2010

Попробовав около получаса, я нашел другое решение, которое кажется лучше:

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)
0 голосов
/ 17 октября 2010

Это то, что я уже сделал:

# 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, которое мне нужно было добавить, или оно было бы однозначным)

У кого-нибудь есть еще лучшее и более чистое решение?

...