Виджет 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” показывает получаемое окно:
Исходный код для notebook.py:
#!/usr/bin/env python # -*- coding: utf-8 -*- # пример notebook.py import pygtk pygtk.require('2.0') import gtk class NotebookExample: # Этот метод меняет расположение вкладок def rotate_book(self, button, notebook): notebook.set_tab_pos((notebook.get_tab_pos()+1) %4) # Добавляем/удаляем вкладки и границы def tabsborder_book(self, button, notebook): tval = False bval = False if self.show_tabs == False: tval = True if self.show_border == False: bval = True notebook.set_show_tabs(tval) self.show_tabs = tval notebook.set_show_border(bval) self.show_border = bval # Удаляем страницу def remove_book(self, button, notebook): page = notebook.get_current_page() notebook.remove_page(page) # Теперь нужна перезагрузка Notebook -- # Это форсированная перерисовка его. notebook.queue_draw_area(0,0,-1,-1) def delete(self, widget, event=None): gtk.main_quit() return False def __init__(self): window = gtk.Window(gtk.WINDOW_TOPLEVEL) window.connect("delete_event", self.delete) window.set_border_width(10) table = gtk.Table(3,6,False) window.add(table) # Создаём Notebook, указываем расположение вкладок notebook = gtk.Notebook() notebook.set_tab_pos(gtk.POS_TOP) table.attach(notebook, 0,6,0,1) notebook.show() self.show_tabs = True self.show_border = True # Давайте добавим несколько страниц for i in range(5): bufferf = "Append Frame %d" % (i+1) bufferl = "Append %d" % (i+1) frame = gtk.Frame(bufferf) frame.set_border_width(10) frame.set_size_request(100, 75) frame.show() label = gtk.Label(bufferf) frame.add(label) label.show() label = gtk.Label(bufferl) notebook.append_page(frame, label) # Теперь давайте добавим страницу в определённое место checkbutton = gtk.CheckButton("Проверьте меня, пожалуйста!") checkbutton.set_size_request(100, 75) checkbutton.show () label = gtk.Label("Insert") notebook.insert_page(checkbutton, label, 2) # Наконец добавим страницы к концу Notebook for i in range(5): bufferf = "Prepend Frame %d" % (i+1) bufferl = "Prepend %d" % (i+1) frame = gtk.Frame(bufferf) frame.set_border_width(10) frame.set_size_request(100, 75) frame.show() label = gtk.Label(bufferf) frame.add(label) label.show() label = gtk.Label(bufferl) notebook.prepend_page(frame, label) # Выбираем стартовую страницу (4) notebook.set_current_page(3) # Создаём несколько кнопок button = gtk.Button("закрыть") button.connect("clicked", self.delete) table.attach(button, 0,1,1,2) button.show() button = gtk.Button("следующая") button.connect("clicked", lambda w: notebook.next_page()) table.attach(button, 1,2,1,2) button.show() button = gtk.Button("предыдущая") button.connect("clicked", lambda w: notebook.prev_page()) table.attach(button, 2,3,1,2) button.show() button = gtk.Button("позиция вкладок") button.connect("clicked", self.rotate_book, notebook) table.attach(button, 3,4,1,2) button.show() button = gtk.Button("вкладки/границы\non/off") button.connect("clicked", self.tabsborder_book, notebook) table.attach(button, 4,5,1,2) button.show() button = gtk.Button("удалить страницу") button.connect("clicked", self.remove_book, notebook) table.attach(button, 5,6,1,2) button.show() table.show() window.show() def main(): gtk.main() return 0 if __name__ == "__main__": NotebookExample() main()
Надеемся, что это поможет вам создавать свои собственные Notebook в ваших PyGTK приложениях.
Предыдущая страница | На уровень выше | Следующая страница |
10.11. Панель инструментов (gtk.Toolbar) | Оглавление | 10.13. Встраивание процессов (gtk.Plug, gtk.Socket) |