Макет (gtk.Layout)

Контейнер Layout похож на Fixed, за исключением бесконечной (где бесконечность это значение меньшее чем 2^32) области прокрутки. Система X Window имеет ограничение, задающее максимальную ширину или высоту окна в 32767 пикселей. Контейнер Layout обходит это ограничение, делая кое-какие экзотические вещи, поэтому вы можете иметь плавную прокрутку, даже если в области прокрутки содержится очень много виджетов.

Контейнер Layout создаётся кодом:

  layout = gtk.Layout(hadjustment=None, vadjustment=None)

Как можно убедиться, вы можете дополнительно указать уже настроенный объект Adjustment (см Глава 7, Регуляторы), который будет использовать виджет Layout для прокрутки. Если вы не указываете объект Adjustment,  то он создаётся автоматически.

Вы можете добавлять и перемещать виджеты по контейнеру Layout используя два следующих метода:

  layout.put(child_widget, x, y)

  layout.move(child_widget, x, y)

Размер контейнера Layout может быть установлен и получен использованием следующих методов:

  layout.set_size(width, height)

  size = layout.get_size()

Последние четыре метода используются с виджетом Layout для управления горизонтальным и вертикальным регуляторами:

  hadj = layout.get_hadjustment()

  vadj = layout.get_vadjustment()

  layout.set_hadjustment(adjustment)

  layout.set_vadjustment(adjustment)

Пример layout.py создаёт три кнопки и помещает их в контейнер layout. При нажатии на кнопку она перемещается в случайную позицию на layout. Рисунок 10.3, “Пример контейнера Layout” показывает окно программы после запуска:

Рисунок 10.3. Пример контейнера Layout

Layout Example

Исходный код layout.py:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# example layout.py
 
import pygtk
pygtk.require('2.0')
import gtk
import random
 
class LayoutExample:
    def WindowDeleteEvent(self, widget, event):
        # Возвращаем False для уничтожения окна
        return False
 
    def WindowDestroy(self, widget, *data):
        # Выходим из основного цикла
        gtk.main_quit()
 
    def ButtonClicked(self, button):
        # перемещаем кнопку
        self.layout.move(button, random.randint(0,500),
                         random.randint(0,500))
 
    def __init__(self):
        # создаём окно
        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        window.set_title("Пример Layout")
        window.set_default_size(300, 300)
        window.connect("delete-event", self.WindowDeleteEvent)
        window.connect("destroy", self.WindowDestroy)
        # создаём таблицу и размещаем её в окне
        table = gtk.Table(2, 2, False)
        window.add(table)
        # создаём виджет layout и размещаем его в таблице
        self.layout = gtk.Layout(None, None)
        self.layout.set_size(600, 600)
        table.attach(self.layout, 0, 1, 0, 1, gtk.FILL|gtk.EXPAND,
                     gtk.FILL|gtk.EXPAND, 0, 0)
        # Создаём полосы прокрутки и помещаем их в таблицу
        vScrollbar = gtk.VScrollbar(None)
        table.attach(vScrollbar, 1, 2, 0, 1, gtk.FILL|gtk.SHRINK,
                     gtk.FILL|gtk.SHRINK, 0, 0)
        hScrollbar = gtk.HScrollbar(None)
        table.attach(hScrollbar, 0, 1, 1, 2, gtk.FILL|gtk.SHRINK,
                     gtk.FILL|gtk.SHRINK, 0, 0) 
        # Привязываем полосы прокрутки к регуляторам виджета layout
        vAdjust = self.layout.get_vadjustment()
        vScrollbar.set_adjustment(vAdjust)
        hAdjust = self.layout.get_hadjustment()
        hScrollbar.set_adjustment(hAdjust)
        # Создаём 3 кнопки и помещаем их в виджет layout
        # Обратите внимание, что применяются стандартные кнопки 
        # из комплекта GTK, которые обычно имеют уже готовый перевод 
        button = gtk.Button(None, gtk.STOCK_GO_FORWARD) 
        button.connect("clicked", self.ButtonClicked)
        self.layout.put(button, 0, 0)
        button = gtk.Button(None, gtk.STOCK_GO_FORWARD)
        button.connect("clicked", self.ButtonClicked)
        self.layout.put(button, 100, 0)
        button = gtk.Button(None, gtk.STOCK_GO_FORWARD)
        button.connect("clicked", self.ButtonClicked)
        self.layout.put(button, 200, 0)
        # Показываем все виджеты
        window.show_all()
 
def main():
    # enter the main loop
    gtk.main()
    return 0
 
if __name__ == "__main__":
    LayoutExample()
    main()

Предыдущая страница На уровень выше  Следующая страница
10.3. Фиксатор (gtk.Fixed) К оглавлению  10.5. Рамка (gtk.Frame)

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

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

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