2012-09-11 17 views

Odpowiedz

5

Rozwiązanie oferowane dla PyGTK w odsyłaczu zamieszczonym w pytaniu nie działa w języku Python-GI z GTK3, chociaż trik użycia ScrolledWindow zamiast zwykłego Boxa był bardzo użyteczny.

Oto moje minimalne rozwiązanie do pracy, aby uzyskać obraz na przycisku, aby zmienić rozmiar z pojemnikiem.

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 o szerokości i wysokości są w celu dostosowania wewnętrznych granic i dopełnienie w przycisku. Próbowałem błahy z tym, aby uzyskać większy obraz na przycisku, ale wynik nie wygląda tak miły .)

Plik jpeg użyty w tym przykładzie można pobrać z here.

Zachęcam do dalszych sugestii, jak to zrobić.

0

self.image = Gtk.Image().new_from_pixbuf(self.pixbuf) prawdopodobnie powinien być: self.image = Gtk.Image().set_from_pixbuf(self.pixbuf)

Ty tworzysz nowy obraz dwukrotnie.

+0

Próbowałem przejść na tę metodę w moim programie testowym i właśnie dostałem traceback (Python 3.2, Debian Wheezy). Być może ta metoda jest nowsza w API (ale dokumentacja wydaje się temu zaprzeczać). Ale czytając dokumentację myślę, że mylisz się co do tworzenia obrazu dwukrotnie (zobacz ['set_from_pixbuf'] (http://www.pygtk.org/pygtk2reference/class-gtkimage.html#method-gtkimage--set-from-pixbuf) i ['new_from_pixbuf'] (http://www.pygtk.org/pygtk2reference/class-gtkimage.html#function-gtk--image-new-from-pixbuf)). Obie tworzą nowy obraz z pixbuf. Jest jeden pixbuf, jeden obraz. – Bobble