10.4. Контейнер 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:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # example layout.py
  4.  
  5. import pygtk
  6. pygtk.require('2.0')
  7. import gtk
  8. import random
  9.  
  10. class LayoutExample:
  11. def WindowDeleteEvent(self, widget, event):
  12. # Возвращаем False для уничтожения окна
  13. return False
  14.  
  15. def WindowDestroy(self, widget, *data):
  16. # Выходим из основного цикла
  17. gtk.main_quit()
  18.  
  19. def ButtonClicked(self, button):
  20. # перемещаем кнопку
  21. self.layout.move(button, random.randint(0,500),
  22. random.randint(0,500))
  23.  
  24. def __init__(self):
  25. # создаём окно
  26. window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  27. window.set_title("Пример Layout")
  28. window.set_default_size(300, 300)
  29. window.connect("delete-event", self.WindowDeleteEvent)
  30. window.connect("destroy", self.WindowDestroy)
  31. # создаём таблицу и размещаем её в окне
  32. table = gtk.Table(2, 2, False)
  33. window.add(table)
  34. # создаём виджет layout и размещаем его в таблице
  35. self.layout = gtk.Layout(None, None)
  36. self.layout.set_size(600, 600)
  37. table.attach(self.layout, 0, 1, 0, 1, gtk.FILL|gtk.EXPAND,
  38. gtk.FILL|gtk.EXPAND, 0, 0)
  39. # Создаём полосы прокрутки и помещаем их в таблицу
  40. vScrollbar = gtk.VScrollbar(None)
  41. table.attach(vScrollbar, 1, 2, 0, 1, gtk.FILL|gtk.SHRINK,
  42. gtk.FILL|gtk.SHRINK, 0, 0)
  43. hScrollbar = gtk.HScrollbar(None)
  44. table.attach(hScrollbar, 0, 1, 1, 2, gtk.FILL|gtk.SHRINK,
  45. gtk.FILL|gtk.SHRINK, 0, 0)
  46. # Привязываем полосы прокрутки к регуляторам виджета layout
  47. vAdjust = self.layout.get_vadjustment()
  48. vScrollbar.set_adjustment(vAdjust)
  49. hAdjust = self.layout.get_hadjustment()
  50. hScrollbar.set_adjustment(hAdjust)
  51. # Создаём 3 кнопки и помещаем их в виджет layout
  52. # Обратите внимание, что применяются стандартные кнопки
  53. # из комплекта GTK, которые обычно имеют уже готовый перевод
  54. button = gtk.Button(None, gtk.STOCK_GO_FORWARD)
  55. button.connect("clicked", self.ButtonClicked)
  56. self.layout.put(button, 0, 0)
  57. button = gtk.Button(None, gtk.STOCK_GO_FORWARD)
  58. button.connect("clicked", self.ButtonClicked)
  59. self.layout.put(button, 100, 0)
  60. button = gtk.Button(None, gtk.STOCK_GO_FORWARD)
  61. button.connect("clicked", self.ButtonClicked)
  62. self.layout.put(button, 200, 0)
  63. # Показываем все виджеты
  64. window.show_all()
  65.  
  66. def main():
  67. # enter the main loop
  68. gtk.main()
  69. return 0
  70.  
  71. if __name__ == "__main__":
  72. LayoutExample()
  73. main()
  74.