Здесь находится код, использованный для создания картинок показанных выше. Он достаточно подробно прокомментирован, поэтому у вас не должно возникнуть проблем с ним. Запустите его сами, и поиграйте с ним.
#!/usr/bin/env python # --*-- coding:utf-8 --*-- # example packbox.py import pygtk pygtk.require('2.0') import gtk import sys, string # Вспомогательная функция, которая заполняет новые HBox кнопками-метками. # Значения нужных нам переменных мы передаём в эту функцию. # Мы не показываем коробку, но показываем всё внутри. def make_box(homogeneous, spacing, expand, fill, padding): # Создаём новый HBox с соответствующими # параметрами homogeneous и spacing. box = gtk.HBox(homogeneous, spacing) # Создаёт набор кнопок с соответствующими настройками. button = gtk.Button("box.pack") box.pack_start(button, expand, fill, padding) button.show() button = gtk.Button("(button,") box.pack_start(button, expand, fill, padding) button.show() # Создаём кнопку с меткой, отражающей значение # expand. if expand == True: button = gtk.Button("True,") else: button = gtk.Button("False,") box.pack_start(button, expand, fill, padding) button.show() # Здесь всё похоже на создание кнопки "expand" # выше, но используется более короткая форма. button = gtk.Button(("False,", "True,")[fill==True]) box.pack_start(button, expand, fill, padding) button.show() padstr = "%d)" % padding button = gtk.Button(padstr) box.pack_start(button, expand, fill, padding) button.show() return box class PackBox1: def delete_event(self, widget, event, data=None): gtk.main_quit() return False def __init__(self, which): # Создаём наше окно self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) # Вы должны всегда помнить о подключении главного окна к сигналу # delete_event. Это очень важно для правильной # интуитивной работы. self.window.connect("delete_event", self.delete_event) self.window.set_border_width(10) # Мы создаём вертикальную коробку, для того чтобы разместить в ней HBox # Это позволяет нам расположить HBox # одну над другой в VBox. box1 = gtk.VBox(False, 0) # Какой пример показывать. Это соответствует картинкам выше. if which == 1: # Создаём новую метку. label = gtk.Label("HBox(False, 0)") # Выравниваем метку по левому краю. Мы обсудим этот и # и другие методы в разделе Параметры виджетов. label.set_alignment(0, 0) # Размещаем метку в VBox. Помните что # виджеты добавляемые в коробку будут помещены выше остальных # по порядку. box1.pack_start(label, False, False, 0) # Показываем метку label.show() # Вызываем функцию make_box - homogeneous = False, spacing = 0, # expand = False, fill = False, padding = 0 box2 = make_box(False, 0, False, False, 0) box1.pack_start(box2, False, False, 0) box2.show() # Вызываем функцию make_box - homogeneous = False, spacing = 0, # expand = True, fill = False, padding = 0 box2 = make_box(False, 0, True, False, 0) box1.pack_start(box2, False, False, 0) box2.show() # Параметры:: homogeneous, spacing, expand, fill, padding box2 = make_box(False, 0, True, True, 0) box1.pack_start(box2, False, False, 0) box2.show() # Создаём разделитель. Мы рассмотрим его позже # но он очень простой. separator = gtk.HSeparator() # Размещаем разделитель в VBox. Помните, что каждый # виджет укладываемый в VBox размещается # вертикально. box1.pack_start(separator, False, True, 5) separator.show() # Создаём ещё одну метку и показываем её. label = gtk.Label("HBox(True, 0)") label.set_alignment(0, 0) box1.pack_start(label, False, False, 0) label.show() # Параметры: homogeneous, spacing, expand, fill, padding box2 = make_box(True, 0, True, False, 0) box1.pack_start(box2, False, False, 0) box2.show() # Параметры: homogeneous, spacing, expand, fill, padding box2 = make_box(True, 0, True, True, 0) box1.pack_start(box2, False, False, 0) box2.show() # Ещё один разделитель. separator = gtk.HSeparator() # 3 последние аргумента к pack_start: # expand, fill, padding. box1.pack_start(separator, False, True, 5) separator.show() elif which == 2: # Создаём новую метку, помним что box1 это VBox # который создаётся в начале __init__() label = gtk.Label("HBox(False, 10)") label.set_alignment( 0, 0) box1.pack_start(label, False, False, 0) label.show() # Параметры: homogeneous, spacing, expand, fill, padding box2 = make_box(False, 10, True, False, 0) box1.pack_start(box2, False, False, 0) box2.show() # Параметры: homogeneous, spacing, expand, fill, padding box2 = make_box(False, 10, True, True, 0) box1.pack_start(box2, False, False, 0) box2.show() separator = gtk.HSeparator() # 3 последние аргумента к pack_start: # expand, fill, padding. box1.pack_start(separator, False, True, 5) separator.show() label = gtk.Label("HBox(False, 0)") label.set_alignment(0, 0) box1.pack_start(label, False, False, 0) label.show() # Параметры: homogeneous, spacing, expand, fill, padding box2 = make_box(False, 0, True, False, 10) box1.pack_start(box2, False, False, 0) box2.show() # Параметры: homogeneous, spacing, expand, fill, padding box2 = make_box(False, 0, True, True, 10) box1.pack_start(box2, False, False, 0) box2.show() separator = gtk.HSeparator() # 3 последние аргумента к pack_start: # expand, fill, padding. box1.pack_start(separator, False, True, 5) separator.show() elif which == 3: # Здесь показывается возможность использования pack_end() для # помещения виджетов справа. Сначала мы создаём новую коробку как и раньше. box2 = make_box(False, 0, False, False, 0) # Создаём метку, которую разместим вконце. label = gtk.Label("end") # Размещаем её используя pack_end(), и она будет находиться # на правой стороне HBox созданной вызовом make_box(). box2.pack_end(label, False, False, 0) # Показываем метку. label.show() # Размещаеи box2 в box1 box1.pack_start(box2, False, False, 0) box2.show() # Разделитель для низа. separator = gtk.HSeparator() # Явным образом создаём разделитель 400 пикселей в шрину и # 5 пикселей в высоту. Созданный HBox также имеет 400 # пикселей в ширину и метку "end", которая отделена от # других меток в коробке. Иначе, все виджеты в коробке # будут помещены вплотную друг к другу. separator.set_size_request(400, 5) # Помещаем в коробку разделитель созданный вначале. # метода __init__() box1.pack_start(separator, False, True, 5) separator.show() # Создаём ещё один HBox... помните что мы можем использовать их столько сколько нужно! quitbox = gtk.HBox(False, 0) # Наша кнопка выхода. button = gtk.Button("Выход") # Настраиваем сигнал для завершения программы по нажатию кнопки button.connect("clicked", lambda w: gtk.main_quit()) # Размещаем коробку в quitbox. # 3 последние аргумента к pack_start: # expand, fill, padding. quitbox.pack_start(button, True, False, 0) # Размещаем quitbox в vbox (box1) box1.pack_start(quitbox, False, False, 0) # Размещаем VBox (box1) который содержит все наши виджеты в # главное окно. self.window.add(box1) # И показываем всё что осталось button.show() quitbox.show() box1.show() # Показываем окно в посленюю очередь self.window.show() def main(): # И конечно наш основной цикл. gtk.main() # Управление перейдёт сюда после вызова main_quit() return 0 if __name__ =="__main__": sys.argv.append('1') if len(sys.argv) != 2: sys.stderr.write("Использование: packbox.py num, где num это 1, 2, или 3.\n") sys.exit(1) PackBox1(string.atoi(sys.argv[1])) main()
Короткое объяснение packbox.py начинается со строк 14-50 которые определяют вспомогательную функцию make_box(), которая создаёт горизонтальную коробку и заполняет её кнопками. Она возвращает ссылку на HBox.
Строки 52-241 определяют конструктор __init__() класса PackBox1 который создаёт окно и VBox, который заполняет окно различными виджетами, зависящими от передаваемых аргументов. Если передаётся 1, строки 75-138 создают окно, отображающее 5 уникальных вариантов размещения, получаемых изменением параметров homogeneous, expand и fill. Если передаётся 2, строки 140-182 создают окно, отображающее различные комбинации заполнения по параметрам spacing и padding. Наконец, если передаётся 3, то строки 188-214 создают окно, отображающее использование методов pack_start() и pack_end() для размещения на разных сторонах. Строки 215-235 создают горизонтальную коробку, содержащую кнопку, которая размещена в VBox. Сигнал “clicked” подключен к функции PyGTK main_quit() для завершения программы.
Строки 251-253 проверяют аргументы командной строки, и выходят из программы используя функцию sys.exit() если не передано ни одного аргумента. Строка 254 создаёт экземпляр PackBox1. Строка 255 вызывает функцию main() для начала цикла обработки событий GTK+.
Заметьте, что в этом примере ссылки на различные виджеты (кроме окна) не сохраняются (последовательно используется одно и тоже имя переменной для различных объектов), поскольку в дальнейшем они нам не нужны.
Предыдущая страница | На уровень выше | Следующая страница |
4.2. Подробнее о коробках | К оглавлению | 4.4. Использование таблиц для компоновки |