Изображение (gtk.Image)

Image это структура данных, которая содержит рисунок. Эти рисунки могут быть использованы в различных местах.

Image могут быть созданы из Pixbuf, Pixmaps, файлов изображений (XPM, PNG, JPEG, TIFF, и т.д.) и даже файлов-анимаций.

Image создаётся с помощью функции:

  image = gtk.Image()

Картинка может быть загружена в виджет Image с помощью одного из следующих методов:

  image.set_from_pixbuf(pixbuf)
  image.set_from_pixmap(pixmap, mask)
  image.set_from_image(image)
  image.set_from_file(filename)
  image.set_from_stock(stock_id, size)
  image.set_from_icon_set(icon_set, size)
  image.set_from_animation(animation)

Где pixbuf это gtk.gdk.Pixbuf; pixmap и mask это gtk.gdk.Pixmap; image это gtk.gdk.Image; stock_id это имя gtk.StockItem; icon_set это gtk.IconSet; и animation это gtk.gdk.PixbufAnimation. Аргумент size один из:

 

 ICON_SIZE_MENU
 ICON_SIZE_SMALL_TOOLBAR
 ICON_SIZE_LARGE_TOOLBAR
 ICON_SIZE_BUTTON
 ICON_SIZE_DND
 ICON_SIZE_DIALOG

Простейший способ создания изображения – это использование метода set_from_file() который автоматически определяет тип картинки и загружает её.

Программа images.py показывает загрузку разных типов картинок (goalie.gif, apple-red.png, chaos.jpg, important.tif, soccerball.gif) в виджеты Image для размещения их на кнопках.

Рисунок 9.5. Пример изображений на кнопках

Example Images in Buttons

Исходный код:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# example images.py

import pygtk
pygtk.require('2.0')
import gtk

class ImagesExample:
    # Когда вызывается (например по сигналу delete_event), закрывает приложение.
    def close_application(self, widget, event, data=None):
        gtk.main_quit()
        return False

    # Вызывается по шелчку по кнопке. Просто выводит сообщение.
    def button_clicked(self, widget, data=None):
        print "button %s clicked" % data

    def __init__(self):
        # Создаёт основное окно, и присоединяет сигнал delete_event для
        # завершения работы программы
        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        window.connect("delete_event", self.close_application)
        window.set_border_width(10)
        window.show()

        # горизонтальная коробка для кнопок
        hbox = gtk.HBox()
        hbox.show()
        window.add(hbox)

        pixbufanim = gtk.gdk.PixbufAnimation("goalie.gif")
        image = gtk.Image()
        image.set_from_animation(pixbufanim)
        image.show()
        # кнопка для виджета image
        button = gtk.Button()
        button.add(image)
        button.show()
        hbox.pack_start(button)
        button.connect("clicked", self.button_clicked, "1")
        
        # создаёт несколько изображений из файлов и загружает их в
        # кнопки
        image = gtk.Image()
        image.set_from_file("apple-red.png")
        image.show()
        # кнопка для виджета image
        button = gtk.Button()
        button.add(image)
        button.show()
        hbox.pack_start(button)
        button.connect("clicked", self.button_clicked, "2")

        image = gtk.Image()
        image.set_from_file("chaos.jpg")
        image.show()
        # кнопка для виджета image
        button = gtk.Button()
        button.add(image)
        button.show()
        hbox.pack_start(button)
        button.connect("clicked", self.button_clicked, "3")

        image = gtk.Image()
        image.set_from_file("important.tif")
        image.show()
        # кнопка для виджета image
        button = gtk.Button()
        button.add(image)
        button.show()
        hbox.pack_start(button)
        button.connect("clicked", self.button_clicked, "4")

        image = gtk.Image()
        image.set_from_file("soccerball.gif")
        image.show()
        # кнопка для виджета image
        button = gtk.Button()
        button.add(image)
        button.show()
        hbox.pack_start(button)
        button.connect("clicked", self.button_clicked, "5")


def main():
    gtk.main()
    return 0

if __name__ == "__main__":
    ImagesExample()
    main()

9.6.1. Битовая графика Pixmap и Bitmap

Pixmap это структура данных для хранения рисунков. Эти рисунки могут быть использованы в различных местах, но чаще всего используются как иконки для рабочего стола X, или как курсоры.

Pixmap имеющий только 2 цвета называется bitmap, и имеет несколько режимов для особых условий.

Для того, чтобы понять pixmap’ы, нужно понять как работает система X Window.  Под X, приложениям не нужно при запуске перехватывать все действия пользователя. За исключением различных приложений называемых “клиенты”, которые взаимодействуют с программой, отображающей графику и обрабатывющей клавиатуру и мышь. Эта программа взаимодействует напрямую с пользователем, и называется “Desktop server” или “X server”. Когда взаимодействия могут происходить через сеть, важно хранить некоторую информацию в сервере X. Например Pixmap сохраняются в память Х Сервера. Это означает что когда задано значение pixmap, нет нужды передавать его через сеть, вместо этого отправляется команда “отобразите pixmap номер XYZ здесь.” Даже если вы не используете X с GTK+, использование таких конструкций как Pixmap поможет вашим программам лучше работать в X.

Для использования pixmap в PyGTK, мы должны создать gtk.gdk.Pixmap используя функции gtk.gdk в PyGTK. Pixmap может быть создан из данных в памяти или считан из файла. Мы разберём оба этих вызова.

  pixmap = gtk.gdk.pixmap_create_from_data(window, data, width, height, depth, fg, bg)

Этот шаблон используется для создания pixmap из data в памяти с глубиной цвета задаваемой depth. Если depth равна -1, то используется глубина цвета window. Каждый пиксель использует биты depth для отображения цвета. Width и height в пикселях. Аргумент window должен ссылаться на gtk.gdk.Window, т.к. ресурсы pixmap используются только в пределах экрана на котором отображаются fg и bg цвета переднего и заднего плана.

Pixmap может быть создан из файла XPM, используя:

  pixmap, mask = gtk.gdk.pixmap_create_from_xpm(window, transparent_color, filename)

Формат XPM это читаемое отображение pixmap для системы X Window. Он широко распространён, и для создания изображений этого формата существует много разных утилит. В функции pixmap_create_from_xpm() первый аргумент имеет тип gtk.gdk.window. (Большинство виджетов GTK+ имеют в основе gtk.gdk.Window, которое может быть получено из поля виджета window.) Файл, указанный в filename, должен содержать картинку в формате XPM, тогда картинка загрузится в структуру pixmap. mask это bitmap, который показывает какие пиксели pixmap непрозрачны создаётся функцией. Все остальные пиксели, окрашенные в цвет, указанный в transparent_color прозрачны. Пример использования функции ниже.

Pixmap также могут создаваться из данных в памяти используя функцию:

  pixmap, mask = gtk.gdk.pixmap_create_from_xpm_d(window, transparent_color, data)

Маленькие картинки могут быть встроены в программу как данные в формате XPM. Pixmap можно создать из этих данных, вместо чтения из файла. Пример таких данных:

  xpm_data = [
  "16 16 3 1",
  "       c None",
  ".      c #000000000000",
  "X      c #FFFFFFFFFFFF",
  "                ",
  "   ......       ",
  "   .XXX.X.      ",
  "   .XXX.XX.     ",
  "   .XXX.XXX.    ",
  "   .XXX.....    ",
  "   .XXXXXXX.    ",
  "   .XXXXXXX.    ",
  "   .XXXXXXX.    ",
  "   .XXXXXXX.    ",
  "   .XXXXXXX.    ",
  "   .XXXXXXX.    ",
  "   .XXXXXXX.    ",
  "   .........    ",
  "                ",
  "                "
  ]

И последний способ создаёт пустой pixmap используемый для некоторых рисующих операций:

  pixmap = gtk.gdk.Pixmap(window, width, height, depth=-1)

window это либо gtk.gdk.Window. либо None. Если window этоgtk.gdk.Window, тогда depth может быть -1 для получения глубины цвета из окна. Если window равно None, тогда depth должна быть указана.

Программа pixmap.py пример использования pixmap в кнопке. Рисунок 9.6, “Пример Pixmap в кнопке” показывает получаемое окно:

Рисунок 9.6. Пример Pixmap в кнопке

Pixmap in a Button Example

Исходный код:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# example pixmap.py

import pygtk
pygtk.require('2.0')
import gtk

# XPM данные
xpm_data = [
"16 16 3 1",
"       c None",
".      c #000000000000",
"X      c #FFFFFFFFFFFF",
"                ",
"   ......       ",
"   .XXX.X.      ",
"   .XXX.XX.     ",
"   .XXX.XXX.    ",
"   .XXX.....    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .........    ",
"                ",
"                "
]

class PixmapExample:
    # когда вызывается (например по сигналу delete_event), закрывает приложение.
    def close_application(self, widget, event, data=None):
        gtk.main_quit()
        return False

    # вызывается по нажатию на кнопку. Просто пишет сообщение.
    def button_clicked(self, widget, data=None):
        print "button clicked"

    def __init__(self):
        # Создание основного окна, и присоединение сигнала delete_event
        # для зыкрытия приложения
        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        window.connect("delete_event", self.close_application)
        window.set_border_width(10)
        window.show()

        # Теперь pixmap из данных XPM
        pixmap, mask = gtk.gdk.pixmap_create_from_xpm_d(window.window,
                                                        None,
                                                        xpm_data)

        # Image для хранения pixmap
        image = gtk.Image()
        image.set_from_pixmap(pixmap, mask)
        image.show()

        # Кнопка для изображения
        button = gtk.Button()
        button.add(image)
        window.add(button)
        button.show()

        button.connect("clicked", self.button_clicked)

def main():
    gtk.main()
    return 0

if __name__ == "__main__":
    PixmapExample()
    main()

Недостатком использования pixmap является то, что отображаемый объект всегда прямоугольный, независимо от изображения. Мы желаем создавать приложения с иконками имеющими более естественные формы. Например для интерфейса игры, мы захотим использовать круглые кнопки. Для того чтобы сделать это – можно использовать фигурные окна.

Фигурное окно это обычный pixmap, где пиксели заднего плана прозрачны. Таким образом, мы не заменяем задний план прямоугольником, и не имеем рамки вокруд изображения. Пример wheelbarrow.py показывает изображение, заполненной тачки на рабочем столе. Рисунок 9.7, “Пример фигурного окна – тачка” показывает тачку над окном текстового редактора:

Рисунок 9.7. Пример фигурного окна – тачка

Wheelbarrow Example Shaped Window

Исходный код для wheelbarrow.py:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# example wheelbarrow.py

import pygtk
pygtk.require('2.0')
import gtk

# XPM
WheelbarrowFull_xpm = [
"48 48 64 1",
"       c None",
".      c #DF7DCF3CC71B",
"X      c #965875D669A6",
"o      c #71C671C671C6",
"O      c #A699A289A699",
"+      c #965892489658",
"@      c #8E38410330C2",
"#      c #D75C7DF769A6",
"$      c #F7DECF3CC71B",
"%      c #96588A288E38",
"&      c #A69992489E79",
"*      c #8E3886178E38",
"=      c #104008200820",
"-      c #596510401040",
";      c #C71B30C230C2",
":      c #C71B9A699658",
">      c #618561856185",
",      c #20811C712081",
"<      c #104000000000",
"1      c #861720812081",
"2      c #DF7D4D344103",
"3      c #79E769A671C6",
"4      c #861782078617",
"5      c #41033CF34103",
"6      c #000000000000",
"7      c #49241C711040",
"8      c #492445144924",
"9      c #082008200820",
"0      c #69A618611861",
"q      c #B6DA71C65144",
"w      c #410330C238E3",
"e      c #CF3CBAEAB6DA",
"r      c #71C6451430C2",
"t      c #EFBEDB6CD75C",
"y      c #28A208200820",
"u      c #186110401040",
"i      c #596528A21861",
"p      c #71C661855965",
"a      c #A69996589658",
"s      c #30C228A230C2",
"d      c #BEFBA289AEBA",
"f      c #596545145144",
"g      c #30C230C230C2",
"h      c #8E3882078617",
"j      c #208118612081",
"k      c #38E30C300820",
"l      c #30C2208128A2",
"z      c #38E328A238E3",
"x      c #514438E34924",
"c      c #618555555965",
"v      c #30C2208130C2",
"b      c #38E328A230C2",
"n      c #28A228A228A2",
"m      c #41032CB228A2",
"M      c #104010401040",
"N      c #492438E34103",
"B      c #28A2208128A2",
"V      c #A699596538E3",
"C      c #30C21C711040",
"Z      c #30C218611040",
"A      c #965865955965",
"S      c #618534D32081",
"D      c #38E31C711040",
"F      c #082000000820",
"                                                ",
"          .XoO                                  ",
"         +@#$%o&                                ",
"         *=-;#::o+                              ",
"           >,<12#:34                            ",
"             45671#:X3                          ",
"               +89<02qwo                        ",
"e*                >,67;ro                       ",
"ty>                 459@>+&&                    ",
"$2u+                  ><ipas8*                  ",
"%$;=*                *3:.Xa.dfg>                ",
"Oh$;ya             *3d.a8j,Xe.d3g8+             ",
" Oh$;ka          *3d$a8lz,,xxc:.e3g54           ",
"  Oh$;kO       *pd$%svbzz,sxxxxfX..&wn>         ",
"   Oh$@mO    *3dthwlsslszjzxxxxxxx3:td8M4       ",
"    Oh$@g& *3d$XNlvvvlllm,mNwxxxxxxxfa.:,B*     ",
"     Oh$@,Od.czlllllzlmmqV@V#V@fxxxxxxxf:%j5&   ",
"      Oh$1hd5lllslllCCZrV#r#:#2AxxxxxxxxxcdwM*  ",
"       OXq6c.%8vvvllZZiqqApA:mq:Xxcpcxxxxxfdc9* ",
"        2r<6gde3bllZZrVi7S@SV77A::qApxxxxxxfdcM ",
"        :,q-6MN.dfmZZrrSS:#riirDSAX@Af5xxxxxfevo",
"         +A26jguXtAZZZC7iDiCCrVVii7Cmmmxxxxxx%3g",
"          *#16jszN..3DZZZZrCVSA2rZrV7Dmmwxxxx&en",
"           p2yFvzssXe:fCZZCiiD7iiZDiDSSZwwxx8e*>",
"           OA1<jzxwwc:$d%NDZZZZCCCZCCZZCmxxfd.B ",
"            3206Bwxxszx%et.eaAp77m77mmmf3&eeeg* ",
"             @26MvzxNzvlbwfpdettttttttttt.c,n&  ",
"             *;16=lsNwwNwgsvslbwwvccc3pcfu<o    ",
"              p;<69BvwwsszslllbBlllllllu<5+     ",
"              OS0y6FBlvvvzvzss,u=Blllj=54       ",
"               c1-699Blvlllllu7k96MMMg4         ",
"               *10y8n6FjvllllB<166668           ",
"                S-kg+>666<M<996-y6n<8*          ",
"                p71=4 m69996kD8Z-66698&&        ",
"                &i0ycm6n4 ogk17,0<6666g         ",
"                 N-k-<>     >=01-kuu666>        ",
"                 ,6ky&      &46-10ul,66,        ",
"                 Ou0<>       o66y<ulw<66&       ",
"                  *kk5       >66By7=xu664       ",
"                   <<M4      466lj<Mxu66o       ",
"                   *>>       +66uv,zN666*       ",
"                              566,xxj669        ",
"                              4666FF666>        ",
"                               >966666M         ",
"                                oM6668+         ",
"                                  *4            ",
"                                                ",
"                                                "
]

class WheelbarrowExample:
    # Когда вызывается (например при сигнале delete_event), закрывает приложение
    def close_application(self, widget, event, data=None):
        gtk.main_quit()
        return False

    def __init__(self):
        # Создаёт основное окно, присоединяет сигнал delete_event для закрытия
        # приложения.  заметим что основное окно не имеет заголовка.
        # т.к. мы создали его с аргументом popup gtk.WINDOW_POPUP.
        window = gtk.Window(gtk.WINDOW_POPUP)
        window.connect("delete_event", self.close_application)
        window.set_events(window.get_events() | gtk.gdk.BUTTON_PRESS_MASK)
        window.connect("button_press_event", self.close_application)
        window.show()

        # Теперь Pixmap и виджет Image
        pixmap, mask = gtk.gdk.pixmap_create_from_xpm_d(
            window.window, None, WheelbarrowFull_xpm)
        image = gtk.Image()
        image.set_from_pixmap(pixmap, mask)
        image.show()

        # Для отображения картинки мы используем виджет fixed
        fixed = gtk.Fixed()
        fixed.set_size_request(200, 200)
        fixed.put(image, 0, 0)
        window.add(fixed)
        fixed.show()

        # Делает прозрачным всё кроме изображения
        window.shape_combine_mask(mask, 0, 0)
    
        # показываем окно
        window.set_position(gtk.WIN_POS_CENTER_ALWAYS)
        window.show()

def main():
    gtk.main()
    return 0

if __name__ == "__main__":
    WheelbarrowExample()
    main()

Для того, чтобы сделать изображение тачки чувствительным, мы присоединили сигнал “button_press_event” для выхода из программы. Строки 138-139 делают картинку чувствительной к щелчку мыши и присоединяют метод close_application().


Предыдущая страница На уровень выше  Следующая страница
9.5. Диалог (gtk.Dialog) К оглавлению  9.7. Линейки (gtk.HRuler, gtk.VRuler)

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>