私はPythonとtkinterを使用しています。1つの画像だけを表示するCanvas
ウィジェットがあります。ほとんどの場合、画像はキャンバスのサイズよりも大きくなりますが、小さくなる場合もあります。最初のケース(キャンバスよりも大きい画像)に焦点を当てましょう。
すでに計算した絶対位置(ピクセル単位)までキャンバスをスクロールしたい。どうやってやるの?
私はPythonとtkinterを使用しています。1つの画像だけを表示するCanvas
ウィジェットがあります。ほとんどの場合、画像はキャンバスのサイズよりも大きくなりますが、小さくなる場合もあります。最初のケース(キャンバスよりも大きい画像)に焦点を当てましょう。
すでに計算した絶対位置(ピクセル単位)までキャンバスをスクロールしたい。どうやってやるの?
約30分試した後、私はより良いと思われる別の解決策を得ました:
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
しかし...ご覧のとおり...それは非常にハックで醜いです。単純なはずの何かの多くの回避策。(それに加えて、私が追加する必要があったその魔法+1
、またはそれは1つずつオフになります)
他の誰かが別のより良い、よりクリーンな解決策を持っていますか?
tkinterでは、ファイルのwidth
とを取得できます。使用するときに呼び出すことができますheight
PhotoImage
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)