2

私はPythontkinterを使用しています。1つの画像だけを表示するCanvasウィジェットがあります。ほとんどの場合、画像はキャンバスのサイズよりも大きくなりますが、小さくなる場合もあります。最初のケース(キャンバスよりも大きい画像)に焦点を当てましょう。

すでに計算した絶対位置(ピクセル単位)までキャンバスをスクロールしたい。どうやってやるの?

4

3 に答える 3

5

約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)
于 2010-10-16T21:38:14.040 に答える
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、またはそれは1つずつオフになります)

他の誰かが別のより良い、よりクリーンな解決策を持っていますか?

于 2010-10-16T21:00:00.997 に答える
0

tkinterでは、ファイルのwidthとを取得できます。使用するときに呼び出すことができますheightPhotoImagecanvas.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)
于 2019-12-26T00:37:51.430 に答える