所以這裏是一個縮放圖像的例子。我們的想法是,你從裝載機和規模把圖像中的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)
但是......'AttributeError的:「gtk.Window」對象有沒有屬性「dimension'' :( – yPhil
'dimension'不是'Gtk.Window'的屬性,它是派生類的一個屬性,用於簡單地存儲圖片的維度,或者,當連接到'check-resize'時,可以將其作爲用戶數據傳遞:'' self.connect('check-resize',self.on_resize,dimension)'。 – elya5