Если вы не хотите использовать GtkScrolledWindow
, вы можете заменить вместо него GtkImage
на GtkDrawingArea
, а затем нарисовать изображение с помощью Cairo. Это позволит уменьшить изображения, потому что GtkDrawingArea
не устанавливает размер запроса.
Я не знаю насчет Python, но вот пример на C, использующий GTK3:
gboolean drawing_area_draw (GtkWidget *widget, cairo_t *cr, GdkPixbuf *current_image)
{
..... //Calculate size
pixbuf = gdk_pixbuf_scale_simple (current_image,
new_width,
new_height,
GDK_INTERP_BILINEAR);
gdk_cairo_set_source_pixbuf (cr,
pixbuf,
allocation.width/2 - new_width/2,
allocation.height/2 - new_height/2);
cairo_paint (cr);
return FALSE;
}
int main (int argc, char *argv[])
{
.....
drawing_area = gtk_drawing_area_new ();
g_signal_connect (G_OBJECT (drawing_area), "draw",
G_CALLBACK (drawing_area_draw), current_image);
.....
}
Если фон области рисования выглядит непрозрачным, установите gtk_widget_set_has_window ()
на FALSE
, хотя, вероятно, лучше извлечь собственный виджет из GtkDrawingArea
и установить это свойство в его функции init
.
Если вы используете GTK2, код аналогичен, за исключением того, что вам нужно позвонить gdk_cairo_create ()
на widget->window
и позвонить cairo_destroy ()
, когда вы закончите.
Кроме того, в GTK2, если GtkDrawingArea
не имеет собственного GdkWindow
, координаты для рисования относительно родительского элемента GdkWindow
, а не виджета.