如何使按钮图像拉伸,透明,正确宽度高度缩放?

时间:2012-12-04 08:09:42

标签: python python-2.7 gtk pygtk gtk2

如何使按钮图像拉伸+透明+与图像一样精确贴合?

预期产出:

enter image description here

但它显示非常脏的按钮:

enter image description here

代码:

# /usr/bin/env python
import pygtk,gtk

button=gtk.Button()
pixbuf=gtk.gdk.pixbuf_new_from_file('/var/tmp/nl.png')
pixbuf=gtk.gdk.Pixbuf.add_alpha(pixbuf,255,255,255 ,255)
pixbuf=pixbuf.scale_simple(40,40,gtk.gdk.INTERP_BILINEAR) 
image=gtk.Image()
image.set_from_pixbuf(pixbuf)
label=gtk.Label("Python")
hbox=gtk.HBox()
hbox.pack_start(image)
hbox.pack_start(label)
button.add(hbox)
vbox=gtk.VBox()
vbox.pack_start(button)
win=gtk.Window()
win.add(vbox)
win.show_all()
win.set_size_request(150,3)
win.connect("destroy",lambda wid:gtk.main_quit())
gtk.main()

2 个答案:

答案 0 :(得分:3)

您错过了GtkBox::pack_start的参数,这些参数定义了如何填充可用空间。使用expand = False作为标签。确保您的尺寸要求也为您的图像提供了足够的空间。

答案 1 :(得分:0)

有一个技巧:如下所示效果很好。

  def __init__(self):

    # Button Hacker
    button_rc = """
    pixmap_path "/var/tmp"

    ### Background > Image 
    style "window" {    
      bg_pixmap[NORMAL] = "1.png"
    }

    ### Buttons 1
    style "deButton" {
      xthickness = 60
      ythickness = 30
      fg[PRELIGHT] = { 0, 1.0, 1.0 }
      bg[PRELIGHT] = { 0, 0, 1.0 }
      bg[ACTIVE] = { 1.0, 0, 0 }
      fg[ACTIVE] = { 0, 1.0, 0 }
      bg[NORMAL] = { 1.0, 1.0, 0 }
      fg[NORMAL] = { .99, 0, .99 }
      bg[INSENSITIVE] = { 1.0, 1.0, 1.0 }
      fg[INSENSITIVE] = { 1.0, 0, 1.0 }

      engine "pixmap" {
          image {
              function = BOX
              file     = "de.png"
              stretch  = TRUE
          }
      }
      bg_pixmap[NORMAL] = "de.png"
    }

    style "nlButton" {
      xthickness = 60
      ythickness = 30
      fg[PRELIGHT] = { 0, 1.0, 1.0 }
      bg[PRELIGHT] = { 0, 0, 1.0 }
      bg[ACTIVE] = { 1.0, 0, 0 }
      fg[ACTIVE] = { 0, 1.0, 0 }
      bg[NORMAL] = { 1.0, 1.0, 0 }
      fg[NORMAL] = { .99, 0, .99 }
      bg[INSENSITIVE] = { 1.0, 1.0, 1.0 }
      fg[INSENSITIVE] = { 1.0, 0, 1.0 }

      engine "pixmap" {
          image {
              function = BOX
              file     = "nl.png"
              stretch  = TRUE
          }
      }
      bg_pixmap[NORMAL] = "nl.png"
    }

    style "enButton" {
      xthickness = 60
      ythickness = 30
      fg[PRELIGHT] = { 0, 1.0, 1.0 }
      bg[PRELIGHT] = { 0, 0, 1.0 }
      bg[ACTIVE] = { 1.0, 0, 0 }
      fg[ACTIVE] = { 0, 1.0, 0 }
      bg[NORMAL] = { 1.0, 1.0, 0 }
      fg[NORMAL] = { .99, 0, .99 }
      bg[INSENSITIVE] = { 1.0, 1.0, 1.0 }
      fg[INSENSITIVE] = { 1.0, 0, 1.0 }

      engine "pixmap" {
          image {
              function = BOX
              file     = "en.png"
              stretch  = TRUE
          }
      }
      bg_pixmap[NORMAL] = "en.png"
    }


    style "callButton" {

      xthickness = 58
      ythickness = 48
      fg[PRELIGHT] = { 0, 1.0, 1.0 }
      bg[PRELIGHT] = { 0, 0, 1.0 }
      bg[ACTIVE] = { 1.0, 0, 0 }
      fg[ACTIVE] = { 0, 1.0, 0 }
      bg[NORMAL] = { 1.0, 1.0, 0 }
      fg[NORMAL] = { .99, 0, .99 }
      bg[INSENSITIVE] = { 1.0, 1.0, 1.0 }
      fg[INSENSITIVE] = { 1.0, 0, 1.0 }

      engine "pixmap" {
          image {
              function = BOX
              file     = "call_connect_icon_64x64.png"
              stretch  = TRUE
          }
      }
      bg_pixmap[NORMAL] = "call_connect_icon_64x64.png"
    }

    style "disconnectButton" {
      xthickness = 58
      ythickness = 48
      fg[PRELIGHT] = { 0, 1.0, 1.0 }
      bg[PRELIGHT] = { 0, 0, 1.0 }
      bg[ACTIVE] = { 1.0, 0, 0 }
      fg[ACTIVE] = { 0, 1.0, 0 }
      bg[NORMAL] = { 1.0, 1.0, 0 }
      fg[NORMAL] = { .99, 0, .99 }
      bg[INSENSITIVE] = { 1.0, 1.0, 1.0 }
      fg[INSENSITIVE] = { 1.0, 0, 1.0 }

      engine "pixmap" {
          image {
              function = BOX
              file     = "call_disconnect_icon_64x64.png"
              stretch  = TRUE
          }
      }
      bg_pixmap[NORMAL] = "call_disconnect_icon_64x64.png"
    }

    # imports
    widget "*.deButton" style "deButton"
    widget "*.nlButton" style "nlButton"
    widget "*.enButton" style "enButton"
    widget "*.callButton" style "callButton"
    widget "*.disconnectButton" style "disconnectButton"
    widget_class "GtkWindow" style "window"
    widget_class "*GtkButton*" style "button"
    widget "main window.*GtkButton*" style "main_button"
    """


    # main GTK
    self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
    self.window.set_size_request(1024, 768)
    self.window.set_border_width(10)

    self.window.set_decorated(False)
    self.window.set_title("Test")
    #self.window.set_default_size(1024, 768)
    #color = gtk.gdk.color_parse('#234fdb')
    #self.window.modify_bg(gtk.STATE_NORMAL, color)
    self.window.connect("destroy", gtk.main_quit, "WM destroy")

    #window.set_name("foo")
    #gtk.rc_parse_string(pixmap_rc)

    self.window.set_name("main window")
    gtk.rc_parse_string(button_rc)

    self.vbox = gtk.VBox()
    self.window.add(self.vbox)    
    table = gtk.Table(rows=2, columns=2, homogeneous=True)
    self.hButton = gtk.HBox(False, 0)

    # Create gape
    align = gtk.Alignment(0.5)
    align.set_padding(500, 90, 0, 0)
    align.add(gtk.Label())
    align.show()
    self.vbox.pack_start(align, False)

    self.vbox.pack_start(self.hButton, False)    
    self.hButton.set_border_width(1)

    # Buttons 
    self.button_de = gtk.Button("Detuch")
    self.button_de.set_name("deButton")
    self.button_de.show()
    self.button_de.connect("clicked", self.deButton) 

    self.button_nl = gtk.Button("Nederlands")
    self.button_nl.set_name("nlButton")
    self.button_nl.show()
    self.button_nl.connect("clicked", self.nlButton) 

    self.button_en = gtk.Button("English")
    self.button_en.set_name("enButton")
    self.button_en.show()
    self.button_en.connect("clicked", self.enButton) 

    self.hButton.pack_start(self.button_de, False)
    self.hButton.pack_start(self.button_nl, False)
    self.hButton.pack_start(self.button_en, False)  


    table.attach(gtk.HBox(False, 0), 0, 1, 0, 1, 0,0,0,0)
    table.attach(self.hButton, 0, 1, 1, 2, 0,0,0,0)
    table.show()

    self.vbox.add(table)

    # Connect/disconnect  
    hbox = gtk.HBox(False, 0)
    self.vbox.pack_start(hbox, False)    
    hbox.set_border_width(10)
    hbox.pack_start(gtk.Label(), True, True, 0)

    # Connect
    self.button_call = gtk.Button("")
    self.button_call.set_name("callButton")
    self.button_call.connect("clicked", self.callButton)    
    #hbox.pack_start(self.button_call, False)
    align = gtk.Alignment(0.5)
    align.set_padding(0, 0, 44, 44)
    align.add(self.button_call)
    align.show()
    #hbox.pack_start(align, False)
    hbox.pack_start(align, False)

    # Disconnect
    self.button_disconnect = gtk.Button()
    self.button_disconnect.set_name("disconnectButton")
    self.button_disconnect.connect("clicked", self.exit)    
    hbox.pack_start(self.button_disconnect, False)   

    hbox.add(gtk.Label())    
    self.window.show_all()
    self.window.set_keep_above(True)

编辑:

Error like: GtkWarning: Unable to locate theme engine in module_path: "pixmap",
  gtk.rc_parse_string(button_rc)

Solution: 
sudo apt-get install gtk2-engines-pixbuf