2015-04-16 226 views
1

所以我試圖做一個GTK應用程序使用python,我遇到了這個問題後,我把一個圖像放在一個窗口,我可以增加窗口的大小,但不會減少它。鑑於這個特定窗口的目的是顯示可調整大小的圖像,這相當麻煩。pyGtk:圖像防止窗口大小調整

我已經提取如果你沒有管,調整窗口大小罰款這表明下方

#!/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() 

這種行爲相關的代碼。圖像中的管道,窗體點擊圖像的大小,可以調整大一些,但不能調整較小。

回答

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) 
+0

但是......'AttributeError的:「gtk.Window」對象有沒有屬性「dimension'' :( – yPhil

+0

'dimension'不是'Gtk.Window'的屬性,它是派生類的一個屬性,用於簡單地存儲圖片的維度,或者,當連接到'check-resize'時,可以將其作爲用戶數據傳遞:'' self.connect('check-resize',self.on_resize,dimension)'。 – elya5

相關問題