10.6. Виджеты AspectFrame

Виджет AspectFrame похож на виджет Frame, за тем исключением что он позволяет фиксировать соотношение сторон (ширины к высоте) помещаемых в него виджетов, добавлять дополнительное место если это необходимо. Используется он, например, если вы хотите сделать предварительный просмотр большого изображения. Размер области просмотра должен варьироваться когда пользователь меняет размеры окна, но соотношение сторон всегда должно оставаться оригинальным.

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

  aspect_frame = gtk.AspectFrame(label=None, xalign=0.5, yalign=0.5, ratio=1.0, obey_child=True)

label определяет текст отображаемый на метке, xalign и yalign определяют выравнивание также, как и в виджете gtk.Alignment. Если obey_child равен True, то соотношение сторон gtl.AspectFrame будет соответствовать соотношению сторон помещённого внурть виджета. А если False, то соотношение задаётся аргументом ratio (соотношение ширины к высоте).

Для изменения параметров существующего AspectFrame, вы можете использовать:

  aspect_frame.set(xalign=0.0, yalign=0.0, ratio=1.0, obey_child=TRUE)

Пример aspectframe.py использует AspectFrame для  отображения области, с  соотношением сторон 2:1. Здесь неважно как пользователь меняет размер окна. Рисунок 10.5, “Пример AspectFrame” показывает внешний вид окна:

Рисунок 10.5. пример AspectFrame

Aspect Frame Example

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

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # example aspectframe.py
  4.  
  5. import pygtk
  6. pygtk.require('2.0')
  7. import gtk
  8.  
  9. class AspectFrameExample:
  10. def __init__(self):
  11. window = gtk.Window(gtk.WINDOW_TOPLEVEL);
  12. window.set_title("Aspect Frame")
  13. window.connect("destroy", lambda x: gtk.main_quit())
  14. window.set_border_width(10)
  15.  
  16. # Создаём aspect_frame и добавляем его на окно
  17. aspect_frame = gtk.AspectFrame("2x1", # label
  18. 0.5, # center x
  19. 0.5, # center y
  20. 2, # xsize/ysize = 2
  21. False) # ignore child's aspect
  22. window.add(aspect_frame)
  23. aspect_frame.show()
  24.  
  25. # теперь добавляем виджет на aspect_frame
  26. drawing_area = gtk.DrawingArea()
  27.  
  28. # Запрашиваем окно 200х200, но AspectFrame даёт нам только 200х100
  29. # т.к. мы указали соотношение 2:1
  30. drawing_area.set_size_request(200, 200)
  31. aspect_frame.add(drawing_area)
  32. drawing_area.show()
  33. window.show()
  34.  
  35. def main():
  36. gtk.main()
  37. return 0
  38.  
  39. if __name__ == "__main__":
  40. AspectFrameExample()
  41. main()
  42.