2012-09-11 49 views
5

Mặc dù tôi đã tìm thấy câu trả lời một phần và gián tiếp cho câu hỏi này (xem, ví dụ: this link), tôi đăng bài này ở đây vì đặt các bit và mảnh ghép lại cho tôi một chút thời gian và tôi nghĩ ai đó có thể tìm thấy những nỗ lực sử dụng của tôi.cách thay đổi kích thước hình ảnh tự động trong Python3 bằng PyGI?

Vì vậy, làm thế nào để đạt được một thay đổi kích thước liền mạch của hình ảnh trên các nút trong GTK + khi cửa sổ cha được thay đổi kích cỡ?

Trả lời

5

Giải pháp được cung cấp cho PyGTK trong liên kết được đăng trong câu hỏi không hoạt động trong Python-GI với GTK3, mặc dù mẹo sử dụng ScrolledWindow thay cho Hộp thông thường rất hữu ích.

Đây là giải pháp làm việc tối thiểu của tôi để có được hình ảnh trên một nút để thay đổi kích thước với vùng chứa.

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() 

(Các -10 về chiều rộng và chiều cao là để thích ứng với biên giới bên trong và padding trong nút. Tôi cố gắng không quan trọng với điều này để có được một hình ảnh lớn hơn vào nút, nhưng kết quả không trông rất đẹp .)

Tệp jpeg được sử dụng trong ví dụ này có thể được tải xuống từ here.

Tôi hoan nghênh thêm các đề xuất về cách thực hiện việc này.

0

self.image = Gtk.Image().new_from_pixbuf(self.pixbuf) lẽ nên là: self.image = Gtk.Image().set_from_pixbuf(self.pixbuf)

Bạn đang tạo ra một hình ảnh mới hai lần.

+0

Tôi đã thử thay đổi phương thức này trong chương trình thử nghiệm của mình và chỉ nhận được một truy nguyên (Python 3.2, Debian Wheezy). Có thể phương thức này mới hơn với API (nhưng tài liệu dường như mâu thuẫn với điều đó). Nhưng đọc tài liệu tôi nghĩ bạn đã sai về việc tạo hình ảnh hai lần (xem ['set_from_pixbuf'] (http://www.pygtk.org/pygtk2reference/class-gtkimage.html#method-gtkimage--set-from-pixbuf) và ['new_from_pixbuf'] (http://www.pygtk.org/pygtk2reference/class-gtkimage.html#function-gtk--image-new-from-pixbuf)). Cả hai đều tạo ra một hình ảnh mới từ pixbuf. Có một pixbuf, một hình ảnh. – Bobble

Các vấn đề liên quan