9.4. Индикаторы прогресса

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

  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:

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # example progressbar.py
  4.  
  5. import pygtk
  6. pygtk.require('2.0')
  7. import gtk, gobject
  8.  
  9. # Обновляем значение индикатора прогресса
  10. # для получения какого-то движения
  11. def progress_timeout(pbobj):
  12. if pbobj.activity_check.get_active():
  13. pbobj.pbar.pulse()
  14. else:
  15. # Рассчитываем значение индикатора прогресса, используя
  16. # установку диапазона значений в регуляторе
  17. new_val = pbobj.pbar.get_fraction() + 0.01
  18. if new_val > 1.0:
  19. new_val = 0.0
  20. # Устанавливаем новое значение
  21. pbobj.pbar.set_fraction(new_val)
  22.  
  23. # Т.к. это функция-прерывание, возвращаем TRUE
  24. # для того чтобы функция продолжала вызываться
  25. return True
  26.  
  27. class ProgressBar:
  28. # Callback который переключает отображение текста
  29. # на индикаторе прогресса
  30. def toggle_show_text(self, widget, data=None):
  31. if widget.get_active():
  32. self.pbar.set_text("текст индикатора")
  33. else:
  34. self.pbar.set_text("")
  35.  
  36. # Callback который переключает режим активности
  37. # в индикаторе прогресса
  38. def toggle_activity_mode(self, widget, data=None):
  39. if widget.get_active():
  40. self.pbar.pulse()
  41. else:
  42. self.pbar.set_fraction(0.0)
  43.  
  44. # Callback который переключает направление индикатора прогресса
  45. def toggle_orientation(self, widget, data=None):
  46. if self.pbar.get_orientation() == gtk.PROGRESS_LEFT_TO_RIGHT:
  47. self.pbar.set_orientation(gtk.PROGRESS_RIGHT_TO_LEFT)
  48. elif self.pbar.get_orientation() == gtk.PROGRESS_RIGHT_TO_LEFT:
  49. self.pbar.set_orientation(gtk.PROGRESS_LEFT_TO_RIGHT)
  50.  
  51. # Очищаем выделенную память и удаляем таймер
  52. def destroy_progress(self, widget, data=None):
  53. gobject.source_remove(self.timer)
  54. self.timer = 0
  55. gtk.main_quit()
  56.  
  57. def __init__(self):
  58. self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  59. self.window.set_resizable(True)
  60.  
  61. self.window.connect("destroy", self.destroy_progress)
  62. self.window.set_title("ProgressBar")
  63. self.window.set_border_width(0)
  64.  
  65. vbox = gtk.VBox(False, 5)
  66. vbox.set_border_width(10)
  67. self.window.add(vbox)
  68. vbox.show()
  69.  
  70. # Создаём объект выравнивания по центру
  71. align = gtk.Alignment(0.5, 0.5, 0, 0)
  72. vbox.pack_start(align, False, False, 5)
  73. align.show()
  74.  
  75. # Создаём индикатор прогресса
  76. self.pbar = gtk.ProgressBar()
  77.  
  78. align.add(self.pbar)
  79. self.pbar.show()
  80.  
  81. # Добавляем callback timer для обновления значения индикатора прогресса
  82. self.timer = gobject.timeout_add (100, progress_timeout, self)
  83.  
  84. separator = gtk.HSeparator()
  85. vbox.pack_start(separator, False, False, 0)
  86. separator.show()
  87.  
  88. # Строки, колонки, однородность.
  89. table = gtk.Table(2, 2, False)
  90. vbox.pack_start(table, False, True, 0)
  91. table.show()
  92.  
  93. # И переключатель для выбора отображения текста
  94. check = gtk.CheckButton("Показать текст")
  95. table.attach(check, 0, 1, 0, 1,
  96. gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL,
  97. 5, 5)
  98. check.connect("clicked", self.toggle_show_text)
  99. check.show()
  100.  
  101. # Добавляем переключатель для выбора режима активности
  102. self.activity_check = check = gtk.CheckButton("Режим активации")
  103. table.attach(check, 0, 1, 1, 2,
  104. gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL,
  105. 5, 5)
  106. check.connect("clicked", self.toggle_activity_mode)
  107. check.show()
  108.  
  109. # И переключатель для смены направлений
  110. check = gtk.CheckButton("Справа налево")
  111. table.attach(check, 0, 1, 2, 3,
  112. gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL,
  113. 5, 5)
  114. check.connect("clicked", self.toggle_orientation)
  115. check.show()
  116.  
  117. # Добавляем кнопку выхода
  118. button = gtk.Button("close")
  119. button.connect("clicked", self.destroy_progress)
  120. vbox.pack_start(button, False, False, 0)
  121.  
  122. # Это делает кнопку кнопкой по умолчанию.
  123. button.set_flags(gtk.CAN_DEFAULT)
  124.  
  125. # Заставляет кнопку быть кнопкой по умолчанию. Простое нажатие
  126. # кнопки "Enter" вызовет нажатие кнопки.
  127. button.grab_default ()
  128. button.show()
  129.  
  130. self.window.show()
  131.  
  132. def main():
  133. gtk.main()
  134. return 0
  135.  
  136. if __name__ == "__main__":
  137. ProgressBar()
  138. main()
  139.