Глава 10. Контейнеры

Содержание

10.1. Коробка событий (gtk.EventBox)
10.2. Виджет Alignment
10.3. Fixed Container
10.4. Layout Container
10.5. Frames
10.6. Aspect Frames
10.7. Paned Window Widgets
10.8. Viewports
10.9. Scrolled Windows
10.10. Button Boxes
10.11. Toolbar
10.12. Notebooks
10.13. Plugs and Sockets
10.13.1. Plugs
10.13.2. Sockets

10.1. Коробка событий (gtk.EventBox)

Некоторые виджеты GTK не связаны с X Window, так как они просто рисуются на своих родителях. Поскольку они не могут принимать события, и если имеют неправильный размер, то не могут его изменить, и вы, в таком случае, можете получить неприятный вид приложения и т.д. Если вам нужно большего от таких виджетов, то следует использовать EventBox.

Сначала виджет EventBox может вам показаться полностью бесполезным. Он ничего не отображает на экране, и не отвечает ни на одно событие. Конечно, у него есть своя функция - он предоставляет X Window соединения для находящихся в нём виджетов. Это важно, так как достаточно много виджетов GTK не связаны с X Window. Отсутствие связки с X Window экономит память и ускоряет производительность, но имеет свои побочные эффекты. Так, виджет без X Window не может принимать события, не может изменять размер и не может выбирать цвет фона. Хотя название EventBox намекает на обработчики событий, но виджет также может применяться для изменения размера (и не только, смотрите пример).

Для создания нового виджета EventBox используется:

  event_box = gtk.EventBox()

Какой-либо виджет может быть помещён в этот event_box::

  event_box.add(widget) 

Пример eventbox.py показывает два метода использования EventBox - метка обрезается (это тоже изменение размера, только для длины отображаемого текста метки) в маленьком прямоугольнике, имеет зелёный фон, и настроена так что клик по ней закрывает программу. Изменение размеров окна предопределяет различную длину метки. Рисунок 10.1, “Пример Event Box” показывает внешний вид окна:

Рисунок 10.1. Пример Event Box

Event Box Example

Исходный код для eventbox.py:

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # example eventbox.py
  4.  
  5. import pygtk
  6. pygtk.require('2.0')
  7. import gtk
  8.  
  9. class EventBoxExample:
  10. def __init__(self):
  11. window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  12. window.set_title("Event Box")
  13. window.connect("destroy", lambda w: gtk.main_quit())
  14. window.set_border_width(10)
  15.  
  16. # Создаём EventBox для нашего окна
  17. event_box = gtk.EventBox()
  18. window.add(event_box)
  19. event_box.show()
  20.  
  21. # Создаём длинную метку
  22. label = gtk.Label("Кликните здесь, чтобы выйти, выйти, выйти...")
  23. event_box.add(label)
  24. label.show()
  25.  
  26. # Обрезаем её.
  27. label.set_size_request(110, 20)
  28.  
  29. # И привязываем к ней событие
  30. event_box.set_events(gtk.gdk.BUTTON_PRESS_MASK)
  31. event_box.connect("button_press_event", lambda w,e: gtk.main_quit())
  32.  
  33. # И другие вещи для которых нужно X Window...
  34. event_box.realize()
  35. event_box.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND1))
  36.  
  37. # Выбираем зелёный фон
  38. event_box.modify_bg(gtk.STATE_NORMAL,
  39. event_box.get_colormap().alloc_color("green"))
  40.  
  41. window.show()
  42.  
  43. def main():
  44. gtk.main()
  45. return 0
  46.  
  47. if __name__ == "__main__":
  48. EventBoxExample()
  49. main()
  50.