Вкладки (gtk.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:

#!/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)

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>