Индикатор прогресса (gtk.ProgressBar)

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

  progressbar = gtk.ProgressBar(adjustment=None)

Аргумент adjustment указывает регулятор используемый с progressbar. Если он не указан, то будет создан новый. Теперь, когда индикатор прогресса создан, мы можем использовать его.

  progressbar.set_fraction(fraction)

Объект progressbar это объект индикатора загрузки, которым вы хотите управлять, и аргумент (fraction) это количество “выполнения”, т.е.  процент заполнения индикатора с 0 до 100%. Данные передаются методу в  виде действительного числа в диапазоне от 0 до 1.

Индикатор прогресса может выбрать одно из направлений, используя метод:

  progressbar.set_orientation(orientation)

Аргумент orientation может принимать одно из следующих значений для указания направления заполнения индикатора прогресса:

  PROGRESS_LEFT_TO_RIGHT
  PROGRESS_RIGHT_TO_LEFT
  PROGRESS_BOTTOM_TO_TOP
  PROGRESS_TOP_TO_BOTTOM

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

  progressbar.pulse()

Размер шага индикатора активности может быть установлен следующей функцией, где fraction находится между 0.0 и 1.0.

  progressbar.set_pulse_step(fraction)

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

  progressbar.set_text(text)

Замечание

Учтите, что set_text() не поддерживает форматирование в стиле printf() для GTK+ 1.2 Progressbar.

Вы можете отключить отображение строки, вызвав set_text() ещё раз, без аргумента.

Текущая строка с индикатором прогресса может быть получена методом:

  text = progressbar.get_text()

Индикаторы прогресса обычно используются для отображения прерываний или других подобных функций (см. Глава 19, Прерывания, IO и бездействующие функции) для создания иллюзии многозадачности. Используются методы set_fraction() или pulse() тем же образом.

Программа progressbar.py предоставляет пример использования индикатора прогресса, используя прерывания. Этот код также показывает как сбрасывать индикатор прогресса. Рисунок 9.4, “Пример индикатора прогресса” показывает получаемое окно:

Рисунок 9.4. Пример индикатора прогресса

ProgressBar Example

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

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# example progressbar.py

import pygtk
pygtk.require('2.0')
import gtk, gobject

# Обновляем значение индикатора прогресса
# для получения какого-то движения
def progress_timeout(pbobj):
    if pbobj.activity_check.get_active():
        pbobj.pbar.pulse()
    else:
        # Рассчитываем значение индикатора прогресса, используя
        # установку диапазона значений в регуляторе
        new_val = pbobj.pbar.get_fraction() + 0.01
        if new_val > 1.0:
            new_val = 0.0
        # Устанавливаем новое значение
        pbobj.pbar.set_fraction(new_val)

    # Т.к. это функция-прерывание, возвращаем TRUE
    # для того чтобы функция продолжала вызываться
    return True

class ProgressBar:
    # Callback который переключает отображение текста
    # на индикаторе прогресса
    def toggle_show_text(self, widget, data=None):
        if widget.get_active():
            self.pbar.set_text("текст индикатора")
        else:
            self.pbar.set_text("")

    # Callback который переключает режим активности
    # в индикаторе прогресса
    def toggle_activity_mode(self, widget, data=None):
        if widget.get_active():
            self.pbar.pulse()
        else:
            self.pbar.set_fraction(0.0)

    # Callback который переключает направление индикатора прогресса
    def toggle_orientation(self, widget, data=None):
        if self.pbar.get_orientation() == gtk.PROGRESS_LEFT_TO_RIGHT:
            self.pbar.set_orientation(gtk.PROGRESS_RIGHT_TO_LEFT)
        elif self.pbar.get_orientation() == gtk.PROGRESS_RIGHT_TO_LEFT:
            self.pbar.set_orientation(gtk.PROGRESS_LEFT_TO_RIGHT)

    # Очищаем выделенную память и удаляем таймер
    def destroy_progress(self, widget, data=None):
        gobject.source_remove(self.timer)
        self.timer = 0
        gtk.main_quit()

    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_resizable(True)

        self.window.connect("destroy", self.destroy_progress)
        self.window.set_title("ProgressBar")
        self.window.set_border_width(0)

        vbox = gtk.VBox(False, 5)
        vbox.set_border_width(10)
        self.window.add(vbox)
        vbox.show()
  
        # Создаём объект выравнивания по центру
        align = gtk.Alignment(0.5, 0.5, 0, 0)
        vbox.pack_start(align, False, False, 5)
        align.show()

        # Создаём индикатор прогресса
        self.pbar = gtk.ProgressBar()

        align.add(self.pbar)
        self.pbar.show()

        # Добавляем callback timer для обновления значения индикатора прогресса
        self.timer = gobject.timeout_add (100, progress_timeout, self)

        separator = gtk.HSeparator()
        vbox.pack_start(separator, False, False, 0)
        separator.show()

        # Строки, колонки, однородность.
        table = gtk.Table(2, 2, False)
        vbox.pack_start(table, False, True, 0)
        table.show()

        # И переключатель для выбора отображения текста
        check = gtk.CheckButton("Показать текст")
        table.attach(check, 0, 1, 0, 1,
                     gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL,
                     5, 5)
        check.connect("clicked", self.toggle_show_text)
        check.show()

        # Добавляем переключатель для выбора режима активности
        self.activity_check = check = gtk.CheckButton("Режим активации")
        table.attach(check, 0, 1, 1, 2,
                     gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL,
                     5, 5)
        check.connect("clicked", self.toggle_activity_mode)
        check.show()

        # И переключатель для смены направлений
        check = gtk.CheckButton("Справа налево")
        table.attach(check, 0, 1, 2, 3,
                     gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL,
                     5, 5)
        check.connect("clicked", self.toggle_orientation)
        check.show()

        # Добавляем кнопку выхода
        button = gtk.Button("close")
        button.connect("clicked", self.destroy_progress)
        vbox.pack_start(button, False, False, 0)

        # Это делает кнопку кнопкой по умолчанию.
        button.set_flags(gtk.CAN_DEFAULT)

        # Заставляет кнопку быть кнопкой по умолчанию. Простое нажатие 
        # кнопки "Enter" вызовет нажатие кнопки.
        button.grab_default ()
        button.show()

        self.window.show()

def main():
    gtk.main()
    return 0

if __name__ == "__main__":
    ProgressBar()
    main()
Предыдущая страница На уровень выше  Следующая страница
9.3. Всплывающие подсказки (gtk.Tooltips) К оглавлению  9.5. Диалог (gtk.Dialog)

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

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

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