как сделать автоматическое изменение размера изображения в Python3 с помощью PyGI?

Хотя я нашел частичные и косвенные ответы на этот вопрос (см., например, эту ссылку), я размещаю это здесь, потому что сбор кусочков головоломки занял у меня немного времени, и я подумал, что кто-то еще может найти применение моим усилиям.

Итак, как добиться плавного изменения размера изображений на кнопках в GTK+ при изменении размера родительского окна?


person Bobble    schedule 11.09.2012    source источник


Ответы (2)


Решение, предложенное для PyGTK в ссылке, размещенной в вопросе, не работает в Python-GI с GTK3, хотя трюк с использованием ScrolledWindow вместо обычного Box был очень полезен.

Вот мое минимальное рабочее решение для получения изображения на кнопке для изменения размера контейнера.

from gi.repository import Gtk, Gdk, GdkPixbuf

class ButtonWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Button Demo")
        self.set_border_width(10)
        self.connect("delete-event", Gtk.main_quit)
        self.connect("check_resize", self.on_check_resize)

        self.box = Gtk.ScrolledWindow()
        self.box.set_policy(Gtk.PolicyType.ALWAYS,
                       Gtk.PolicyType.ALWAYS)
        self.add(self.box)

        self.click = Gtk.Button()
        self.box.add_with_viewport(self.click)

        self.pixbuf = GdkPixbuf.Pixbuf().new_from_file('gtk-logo-rgb.jpg')
        self.image = Gtk.Image().new_from_pixbuf(self.pixbuf)
        self.click.add(self.image)

    def resizeImage(self, x, y):
        print('Resizing Image to ('+str(x)+','+str(y)+')....')
        pixbuf = self.pixbuf.scale_simple(x, y,
                                          GdkPixbuf.InterpType.BILINEAR)
        self.image.set_from_pixbuf(pixbuf)

    def on_check_resize(self, window):
        print("Checking resize....")

        boxAllocation = self.box.get_allocation()
        self.click.set_allocation(boxAllocation)
        self.resizeImage(boxAllocation.width-10,
                         boxAllocation.height-10)

win = ButtonWindow()
win.show_all()
Gtk.main()

(-10 по ширине и высоте предназначены для размещения внутренних границ и отступов на кнопке. Я пробовал возиться с этим, чтобы увеличить изображение на кнопке, но результат выглядел не так хорошо.)

Файл jpeg, используемый в этом примере, можно загрузить с сайта здесь.

Я приветствую дальнейшие предложения о том, как это сделать.

person Bobble    schedule 11.09.2012

self.image = Gtk.Image().new_from_pixbuf(self.pixbuf) Наверное, должно быть: self.image = Gtk.Image().set_from_pixbuf(self.pixbuf)

Вы дважды создаете новый образ.

person the7erm    schedule 02.07.2015
comment
Я попытался перейти на этот метод в своей тестовой программе и только что получил трассировку (Python 3.2, Debian Wheezy). Возможно, этот метод является более новым для API (но документация, кажется, противоречит этому). Но, читая документацию, я думаю, что вы ошибаетесь насчет создания изображения дважды (см. rel="nofollow noreferrer">set_from_pixbuf и new_from_pixbuf). Они оба создают новое изображение из pixbuf. Есть один пиксбаф, одно изображение. - person Bobble; 04.07.2015