サイズ変更可能なウィンドウにGtkImage
ウィジェットがあり、画像が保存されているGdkPixBuf
にGtkImage
と記入したいと思います。(Py)GTKでサイズ変更時の自動画像スケーリング
私は、このメソッドを使用してGtkImage
ウィジェットを埋めるためにGdkPixBuf
を拡張することができます
def update_image(self, widget=None, data=None):
# Get the size of the source pixmap
src_width, src_height = self.current_image.get_width(), self.current_image.get_height()
# Get the size of the widget area
widget = self.builder.get_object('image')
allocation = widget.get_allocation()
dst_width, dst_height = allocation.width, allocation.height
# Scale preserving ratio
scale = min(float(dst_width)/src_width, float(dst_height)/src_height)
new_width = int(scale*src_width)
new_height = int(scale*src_height)
pixbuf = self.current_image.scale_simple(new_width, new_height, gtk.gdk.INTERP_BILINEAR)
# Put the generated pixbuf in the GtkImage widget
widget.set_from_pixbuf(pixbuf)
私は期待どおりに動作します手動update_image
を呼び出すとき。 GtkImageウィジェットのサイズを変更すると自動的にスケーリングが行われるようにします。私が来た最善の解決策は、ウィンドウのconfigure-event
GTKイベントにupdate_image
メソッドをバインドすることでした。ウィンドウの各サイズ変更の後、画像は実際に適切にスケーリングされます。しかし、私はこの解決策に2つの問題があります:
- 私はウィンドウを大きくすることができます。イメージがアップスケールされると、GTKはウィンドウがそのウィジェットよりも小さくなることができないので、ウィンドウのサイズを小さくすることはできません。私はそれがなぜそれのように動作するのか理解していますが、私はこの振る舞いをどのように変更するのかわかりませ
- これは大したことではないかもしれませんが、トップレベルウィンドウの代わりにGtkImageウィジェットからイベントを優先させてもらいました。
このような些細な問題について長い説明をおかけして申し訳ありませんが、私はあなたを助けてくれることを願っています。
ありがとう、ScrolledWindowトリックがうまくいきました。 gtk_scrolled_window_add():代わりにgtk_scrolled_window_add_with_viewport()を使うことはできませんが、ビューポートを追加するとウィンドウのサイズを小さくするとスクロールバーが現れますので、今のように残しておきます。 'expose-event'は各gtk反復で呼び出されるので、CPU使用量を最大にしました。 – Jim