pyGtk:图像可以防止窗口调整大小

时间:2015-04-16 05:19:30

标签: python image user-interface gtk pygtk

所以我试图使用python创建一个GTK应用程序,我遇到了这个问题,在我将一个图像放在一个窗口后,我可以增加窗口的大小,但不会减少它。鉴于此特定窗口的目的是显示可调整大小的图像,这非常麻烦。

我已经提取了相关代码,以便在

下面演示此行为
#!/usr/bin/env python
from gi.repository import Gtk, GdkPixbuf
import sys

class ImageWindow(Gtk.Window):
    def __init__(self, image_data):
        Gtk.Window.__init__(self, title="image test")
        if image_data and len(image_data) > 0:
            self.loader = GdkPixbuf.PixbufLoader()
            self.loader.write(image_data)
            self.pixbuf = self.loader.get_pixbuf()
            self.image = Gtk.Image.new_from_pixbuf(self.pixbuf)
        else:
            self.image = Gtk.Image.new()
        self.add(self.image)
        self.connect('delete-event', Gtk.main_quit)

win = ImageWindow(sys.stdin.read())
win.show_all()
Gtk.main()

如果你没有管道,窗口会调整好。管道在图像中,表单点击图像的大小,并可以调整大小,但不能调整较小。

1 个答案:

答案 0 :(得分:3)

所以这是一个缩放图像的例子。我们的想法是将图像放在Gtk.ScrolledWindow()中,并在调整窗口大小后立即调整图像大小。:

#!/usr/bin/env python
from gi.repository import Gtk, GdkPixbuf, GLib
import sys

class ImageWindow(Gtk.Window):
    def __init__(self, image_data):
        Gtk.Window.__init__(self, title="image test")
        self.connect('delete-event', Gtk.main_quit)

        self.image = Gtk.Image()
        scrolled_window = Gtk.ScrolledWindow()
        scrolled_window.add(self.image)
        self.add(scrolled_window)

        if len(image_data) == 0:
            return

        self.loader = GdkPixbuf.PixbufLoader()
        self.loader.write(image_data)
        self.loader.close()
        self.pixbuf = self.loader.get_pixbuf()
        self.image.set_from_pixbuf(self.pixbuf)

        width = self.pixbuf.get_width()
        height = self.pixbuf.get_height()
        self.dimension = float(width) / height
        self.set_default_size(width, height)
        self.connect('check-resize', self.on_resize)

    def on_resize(self, window):
        width, height = self.get_size()
        if float(width) / height > self.dimension:
            self.pixbuf = self.pixbuf.scale_simple(
                self.dimension * height,
                height,
                GdkPixbuf.InterpType.NEAREST
            )
        else:
            self.pixbuf = self.pixbuf.scale_simple(
                width,
                width / self.dimension,
                GdkPixbuf.InterpType.NEAREST
            )
        GLib.idle_add(self.image.set_from_pixbuf, self.pixbuf)

win = ImageWindow(sys.stdin.read())
win.show_all()
Gtk.main()

作为替代方案,您可以从加载器再次加载pixbuf并在之后进行缩放。如果您使图像变小然后再变大但需要更多处理,这看起来会更好:

def on_resize(self, window):
    width, height = self.get_size()
    self.pixbuf = self.loader.get_pixbuf()
    if float(width) / height > self.dimension:
        self.pixbuf = self.pixbuf.scale_simple(
            self.dimension * height,
            height,
            GdkPixbuf.InterpType.BILINEAR
        )
    else:
        self.pixbuf = self.pixbuf.scale_simple(
            width,
            width / self.dimension,
            GdkPixbuf.InterpType.BILINEAR
        )
    GLib.idle_add(self.image.set_from_pixbuf, self.pixbuf)