2010-10-16 3 views
1

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

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

ответ

5

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

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 может быть отрицательным).

EDIT: улучшенная версия:

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

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

# 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 Я должен был добавить, или это было бы по-одному)

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

Смежные вопросы