我在一个可调整大小的窗口中有一个GtkImage
小部件,还有一个用于存储我要填充的GtkImage
图像的引用GdkPixBuf
。
我可以使用以下方法缩放GdkPixBuf
以填充GtkImage
小部件:
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小部件的大小时自动进行缩放。我得到的最佳解决方案是将update_image
方法绑定到窗口的configure-event
GTK事件。每次窗口大小改变后,图像确实正确缩放。但是,我对这个解决方案有两个问题:
我很抱歉对这样一个小问题作了长时间的解释,希望你能帮助我。
所有小部件都有^{} 信号。
也许你可以用这个。
如果不想使用
GtkScrolledWindow
,可以用GtkDrawingArea
替换GtkImage
,然后使用Cairo绘制图像。这将允许图像收缩,因为GtkDrawingArea
未设置大小请求。我不知道Python,但下面是C中使用GTK3的一个例子:
如果绘图区域的背景看起来不透明,请将
gtk_widget_set_has_window ()
设置为FALSE
,不过最好从GtkDrawingArea
派生自己的小部件,并在其init
函数中设置此属性。如果您使用的是GTK2,则代码是类似的,只是您必须在
widget->window
上调用gdk_cairo_create ()
,并在完成后调用cairo_destroy ()
。另外,对于GTK2,如果
GtkDrawingArea
没有自己的GdkWindow
,则用于绘制的坐标是相对于父对象的GdkWindow
,而不是小部件的。我相信您可以使用小部件的expose-event信号进行图像缩放。另外,将图像添加到可滚动的容器中可以解决窗口大小调整的问题。请检查下面的例子是否适合您。
希望这有帮助,问候
相关问题 更多 >
编程相关推荐