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 для размещения их на кнопках.
Исходный код:
#!/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 в кнопке” показывает получаемое окно:
Исходный код:
#!/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, “Пример фигурного окна – тачка” показывает тачку над окном текстового редактора:
Исходный код для 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) |