Демонстрационная программа компоновки

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

#!/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. Использование таблиц для компоновки

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

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

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