10.9. Виджет Scrolled Window

Виджеты ScrolledWindow используются для создания прокручиваемой области с другими виджетами внутри неё. Вы можете поместить любой тип виджета внутрь ScrolledWindow, и они будут доступны независимо от размера, благодаря полосам прокрутки.

Следующая функция используется для создания нового ScrolledWindow:

  scrolled_window = gtk.ScrolledWindow(hadjustment=None, vadjustment=None)

Где первый аргумент это регулятор для горизонтального направления, а второй для вертикального. Почти всегда они установлены в None или не указаны.

  scrolled_window.set_policy(hscrollbar_policy, vscrollbar_policy)

Этот метод указывает политику по отношению к полосам прокрутки. Первый аргумент устанавливает политику для горизонтальной полосы прокрутки, второй для вертикальной.

Политика может быть POLICY_AUTOMATIC или POLICY_ALWAYS. POLICY_AUTOMATIC будет автоматически скрывать полосы прокрутки когда они не нужны, когда POLICY_ALWAYS будет показывать их всегда.

Вы можете поместить свой объект в ScrolledWindow, используя следующий метод:

  scrolled_window.add_with_viewport(child)

Пример scrolledwin.py размещает  таблицу со 100 экземплярами ToggleButton в ScrolledWindow. Прокомментированы только новые для вас части кода. Рисунок 10.7, “Пример ScrolledWindow” иллюстрирует запуск этой программы:

Рисунок 10.7. Пример ScrolledWindow

Scrolled Window Example

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

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # example scrolledwin.py
  4.  
  5. import pygtk
  6. pygtk.require('2.0')
  7. import gtk
  8.  
  9. class ScrolledWindowExample:
  10. def destroy(self, widget):
  11. gtk.main_quit()
  12.  
  13. def __init__(self):
  14. # Создаём новое диалоговое окно для размещения
  15. # в нём ScrolledWindow.
  16. window = gtk.Dialog()
  17. window.connect("destroy", self.destroy)
  18. window.set_title("ScrolledWindow example")
  19. window.set_border_width(0)
  20. window.set_size_request(300, 300)
  21.  
  22. # Создаём ScrolledWindow.
  23. scrolled_window = gtk.ScrolledWindow()
  24. scrolled_window.set_border_width(10)
  25.  
  26. # Политика может быть POLICY AUTOMATIC или POLICY_ALWAYS.
  27. # POLICY_AUTOMATIC будет автоматически скрывать
  28. # полосы прокрутки, когда POLICY_ALWAYS всегда будет их
  29. # показывать. Первую будем использовать для горизонтальной,
  30. # а вторую для вертикальной.
  31. scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS)
  32.  
  33. # Диалоговое окно создаётся с VBox размещённом в нём
  34. window.vbox.pack_start(scrolled_window, True, True, 0)
  35. scrolled_window.show()
  36.  
  37. # Создаём таблицу 10х10
  38. table = gtk.Table(10, 10, False)
  39.  
  40. # Указываем расстояние в 10 по х, и в 10 по у
  41. table.set_row_spacings(10)
  42. table.set_col_spacings(10)
  43.  
  44. # Размещаем таблицу в ScrolledWindow
  45. scrolled_window.add_with_viewport(table)
  46. table.show()
  47.  
  48. # Здесь просто заполняем таблицу виджетами
  49. # ToogleButton для демонстрации ScrolledWindow
  50. for i in range(10):
  51. for j in range(10):
  52. buffer = "button (%d,%d)" % (i, j)
  53. button = gtk.ToggleButton(buffer)
  54. table.attach(button, i, i+1, j, j+1)
  55. button.show()
  56.  
  57. # Добавляем кнопку "Close" в нижнюю часть окна
  58. button = gtk.Button("close")
  59. button.connect_object("clicked", self.destroy, window)
  60.  
  61. # И делаем её доступной по умолчанию
  62. button.set_flags(gtk.CAN_DEFAULT)
  63. window.action_area.pack_start( button, True, True, 0)
  64.  
  65. # Это превразает кнопку в кнопку по умолчанию. Простое нажатие клавиши
  66. # "Enter" активирует кнопку.
  67. button.grab_default()
  68. button.show()
  69. window.show()
  70.  
  71. def main():
  72. gtk.main()
  73. return 0
  74.  
  75. if __name__ == "__main__":
  76. ScrolledWindowExample()
  77. main()
  78.  

Попробуйте изменять резмеры окна. Обратите внимание на поведение полос прокрутки. Также вы можете использовать метод set_size_request() для того чтобы установить размер по умолчанию для окна или других виджетов.