10.12. Виджет Notebook

Виджет NoteBook это собрание "страниц", которые перекрывают друг друга; каждая страница содержит различную информацию, но одновременно видна только одна страница. Этот виджет пришёл в программирование интерфейсов позже основных, и он предоставляет хороший способ раздельно показывать блоки информации, когда это нужно.

Первый вызов функции о котором вам нужно знать, как вы уже догадались, используется для создания виджета Notebook.

  notebook = gtk.Notebook()

Когда Notebook создан, есть несколько методов для работы с ним. Давайте рассмотрим их по отдельности.

Первый определяет где будут размещены индикаторы страниц. Эти индикаторы страниц, или "вкладки" могут быть размещены с четырёх сторон: сверху, снизу, слева или справа.

  notebook.set_tab_pos(pos)

pos принимает одно значение из следующих, которые говорят сами за себя:

  POS_LEFT
POS_RIGHT
POS_TOP
POS_BOTTOM

POS_TOP выбрана по умолчанию.

Далее мы рассмотрим как добавлять страницы. Есть три способа добавления страниц на NoteBook. Первые два мы рассмотрим вместе, т.к. они довольно похожи.

  notebook.append_page(child, tab_label)

notebook.prepend_page(child, tab_label)

Эти методы добавляют страницы сначала или с конца Notebook. Атрибут child это виджет, который помещается на страницу, и tab_label это метка для страницы. Виджет child должен быть создан отдельно, и обычно является другим контейнером, например таблицей.

Последний метод для добавления страниц содержит все свойства двух предыдущих, но позволяет указывать желаемую позицию для вставки страницы.

  notebook.insert_page(child, tab_label, position)

Параметры точно такие-же, как и в методах append() и prepend(), за исключением дополнительного параметра position. Этот параметр используется для указания позиции вставки страницы. Первая страница имеет номер 0.

Теперь, когда мы знаем как добавлять страницы, давайте посмотрим как их удалять.

  notebook.remove_page(page_num)

Этот метод принимает страницу, указанную номером page_num и удаляет её из виджета на который указывает notebook.

Чтобы узнать текущую страницу, используйте метод:

  page = notebook.get_current_page()

Следующие два метода являются простыми вызовами для перемещения по страницам вперёд или назад.

  notebook.next_page()

notebook.prev_page()

Замечание

Когда notebook находится на последней странице, и происходит вызов next_page() ничего не происходит. Таким же образом, если notebook находится на первой странице,и происходит вызов prev_page() ничего не происходит.

Следующий метод выбирает "активную" страницу. Если вы желаете чтобы Notebook открывался, например, с пятой страницы, вам нужно использовать этот метод. Без использования этого метода, по умолчанию отображается первая страница (с номером 0).

  notebook.set_current_page(page_num)

Следующие два метода используются для отображение или сокрытия вкладок и их границ соответственно.

  notebook.set_show_tabs(show_tabs)

notebook.set_show_border(show_border)

Следующий метод используется когда вы имеете большое число страниц, и вкладки не помещаются на странице. Он позволяет прокручивать вкладки используя стрелки.

  notebook.set_scrollable(scrollable)

show_tabs, show_border и scrollable могут принимать значение TRUE или FALSE.

Теперь давайте рассмотрим пример. Программа notebook.py создаёт окно с Notebook и шестью кнопками. Notebook содержит 11 страниц, добавленных тремя различными способами. Кнопки позволяют менять расположение вкладок, показывать или удалять вкладки и границы, удалять страницу, осуществлять переход вперёд и назад, и выходить из программы. Рисунок 10.9, “Пример виджета Notebook” показывает получаемое окно:

Рисунок 10.9. Пример виджета Notebook

Notebook Example

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

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # пример notebook.py
  4.  
  5. import pygtk
  6. pygtk.require('2.0')
  7. import gtk
  8.  
  9. class NotebookExample:
  10. # Этот метод меняет расположение вкладок
  11. def rotate_book(self, button, notebook):
  12. notebook.set_tab_pos((notebook.get_tab_pos()+1) %4)
  13.  
  14. # Добавляем/удаляем вкладки и границы
  15. def tabsborder_book(self, button, notebook):
  16. tval = False
  17. bval = False
  18. if self.show_tabs == False:
  19. tval = True
  20. if self.show_border == False:
  21. bval = True
  22.  
  23. notebook.set_show_tabs(tval)
  24. self.show_tabs = tval
  25. notebook.set_show_border(bval)
  26. self.show_border = bval
  27.  
  28. # Удаляем страницу
  29. def remove_book(self, button, notebook):
  30. page = notebook.get_current_page()
  31. notebook.remove_page(page)
  32. # Теперь нужна перезагрузка Notebook --
  33. # Это форсированная перерисовка его.
  34. notebook.queue_draw_area(0,0,-1,-1)
  35.  
  36. def delete(self, widget, event=None):
  37. gtk.main_quit()
  38. return False
  39.  
  40. def __init__(self):
  41. window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  42. window.connect("delete_event", self.delete)
  43. window.set_border_width(10)
  44.  
  45. table = gtk.Table(3,6,False)
  46. window.add(table)
  47.  
  48. # Создаём Notebook, указываем расположение вкладок
  49. notebook = gtk.Notebook()
  50. notebook.set_tab_pos(gtk.POS_TOP)
  51. table.attach(notebook, 0,6,0,1)
  52. notebook.show()
  53. self.show_tabs = True
  54. self.show_border = True
  55.  
  56. # Давайте добавим несколько страниц
  57. for i in range(5):
  58. bufferf = "Append Frame %d" % (i+1)
  59. bufferl = "Append %d" % (i+1)
  60.  
  61. frame = gtk.Frame(bufferf)
  62. frame.set_border_width(10)
  63. frame.set_size_request(100, 75)
  64. frame.show()
  65.  
  66. label = gtk.Label(bufferf)
  67. frame.add(label)
  68. label.show()
  69.  
  70. label = gtk.Label(bufferl)
  71. notebook.append_page(frame, label)
  72.  
  73. # Теперь давайте добавим страницу в определённое место
  74. checkbutton = gtk.CheckButton("Проверьте меня, пожалуйста!")
  75. checkbutton.set_size_request(100, 75)
  76. checkbutton.show ()
  77.  
  78. label = gtk.Label("Insert")
  79. notebook.insert_page(checkbutton, label, 2)
  80.  
  81. # Наконец добавим страницы к концу Notebook
  82. for i in range(5):
  83. bufferf = "Prepend Frame %d" % (i+1)
  84. bufferl = "Prepend %d" % (i+1)
  85.  
  86. frame = gtk.Frame(bufferf)
  87. frame.set_border_width(10)
  88. frame.set_size_request(100, 75)
  89. frame.show()
  90.  
  91. label = gtk.Label(bufferf)
  92. frame.add(label)
  93. label.show()
  94.  
  95. label = gtk.Label(bufferl)
  96. notebook.prepend_page(frame, label)
  97.  
  98. # Выбираем стартовую страницу (4)
  99. notebook.set_current_page(3)
  100.  
  101. # Создаём несколько кнопок
  102. button = gtk.Button("закрыть")
  103. button.connect("clicked", self.delete)
  104. table.attach(button, 0,1,1,2)
  105. button.show()
  106.  
  107. button = gtk.Button("следующая")
  108. button.connect("clicked", lambda w: notebook.next_page())
  109. table.attach(button, 1,2,1,2)
  110. button.show()
  111.  
  112. button = gtk.Button("предыдущая")
  113. button.connect("clicked", lambda w: notebook.prev_page())
  114. table.attach(button, 2,3,1,2)
  115. button.show()
  116.  
  117. button = gtk.Button("позиция вкладок")
  118. button.connect("clicked", self.rotate_book, notebook)
  119. table.attach(button, 3,4,1,2)
  120. button.show()
  121.  
  122. button = gtk.Button("вкладки/границы\non/off")
  123. button.connect("clicked", self.tabsborder_book, notebook)
  124. table.attach(button, 4,5,1,2)
  125. button.show()
  126.  
  127. button = gtk.Button("удалить страницу")
  128. button.connect("clicked", self.remove_book, notebook)
  129. table.attach(button, 5,6,1,2)
  130. button.show()
  131.  
  132. table.show()
  133. window.show()
  134.  
  135. def main():
  136. gtk.main()
  137. return 0
  138.  
  139. if __name__ == "__main__":
  140. NotebookExample()
  141. main()
  142.  

Надеемся, что это поможет вам создавать свои собственные Notebook в ваших PyGTK приложениях.