9.8. Строка состояния

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

Для того, чтобы разные части приложения могли использовать одну строку состояния, виджет Statusbar использует Context Indefiter, который используется для определения разных "пользователей". Отображается всегда верхнее сообщение, неважно с каким контекстом. Сообщения содержатся не в порядке контекстов, а по принципу Last-in-First-out (стек LIFO).

Для создания строки состояния необходимо вызвать:

  statusbar = gtk.Statusbar()

Для нового идентификатора контекста необходимо использовать следующий метод с коротким текстовым описание контекста:

  context_id = statusbar.get_context_id(context_description)

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

  message_id = statusbar.push(context_id, text)

statusbar.pop(context_id)

statusbar.remove(context_id, message_id)

Первый, push(), используется для помещения нового сообщения на statusbar. Он возвращает message_id, который может быть использован для удаления сообщения методом remove(), с  помощью комбинации message_id и context_id из стека statusbar'a.

Метод pop() удаляет высшее сообщение с заданным context_id.

Пример statusbar.py создаёт строку состояния и две кнопки, первая помещает сообщения в строку состояния, а вторая удаляет. Рисунок 9.9, “Пример строки состояния” показывает результат:

Рисунок 9.9. Пример строки состояния

Statusbar Example

Исходный код statusbar.py:

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # example statusbar.py
  4.  
  5. import pygtk
  6. pygtk.require('2.0')
  7. import gtk
  8.  
  9. class StatusbarExample:
  10. def push_item(self, widget, data):
  11. buff = " Элемент %d" % self.count
  12. self.count = self.count + 1
  13. self.status_bar.push(data, buff)
  14. return
  15.  
  16. def pop_item(self, widget, data):
  17. self.status_bar.pop(data)
  18. return
  19.  
  20. def __init__(self):
  21. self.count = 1
  22. # Создаём новое окно
  23. window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  24. window.set_size_request(250, 100)
  25. window.set_title("Статус-панель")
  26. window.connect("delete_event", lambda w,e: gtk.main_quit())
  27.  
  28. vbox = gtk.VBox(False, 1)
  29. window.add(vbox)
  30.  
  31. self.status_bar = gtk.Statusbar()
  32. context_id = self.status_bar.get_context_id("Пример статус-панели")
  33.  
  34. button = gtk.Button("добавить элемент")
  35. button.connect("clicked", self.push_item, context_id)
  36. vbox.pack_start(button, True, True, 2)
  37.  
  38. button = gtk.Button("убрать последний")
  39. button.connect("clicked", self.pop_item, context_id)
  40. vbox.pack_start(button, True, True, 2)
  41.  
  42. vbox.pack_start(self.status_bar, True, True, 0)
  43.  
  44. # Способ отображения всех виджетов, расположенных на окне.
  45. window.show_all()
  46.  
  47. def main():
  48. gtk.main()
  49. return 0
  50.  
  51. if __name__ == "__main__":
  52. StatusbarExample()
  53. main()
  54.