Глава 9. Разнообразные виджеты

Содержание

9.1. Метки
9.2. Стрелки
9.3. Всплывающие подсказки
9.4. Индикаторы прогресса
9.5. Диалоги
9.6. Изображения
9.6.1. Битовая графика
9.7. Линейки
9.8. Строки состояния
9.9. Поля ввода
9.10. Кнопки-счётчики
9.11. Выпадающие списки
9.12. Календарь
9.13. Диалог выбора цвета
9.14. Диалог выбора файла
9.15. Диалог выбора шрифта

9.1. Метки

Метки часто используются в GTK, и они относительно простые. Метки не излучают сигналов и они не связаны с X Window. Если вам нужно отлавливать сигналы, или делать вырезки, помещайте их в виджет EventBox, (см. Раздел 10.1, “Виджет EventBox”), или кнопку (см. Раздел 6.1, “Обычные кнопки”).

Для того чтобы создать метку, используйте:

  label = gtk.Label(str)

Единственный аргумент это строка, которую вы хотите отображать. Для того чтобы изменить текст метки, используйте метод:

  label.set_text(str)

label это  предварительно созданная вами метка, и str это новая строка. Место необходимое для новой строки автоматически займётся, если это необходимо. Вы можете создавать многострочные метки помещая переносы строки в строку метки.

Чтобы получить текущую строку, используйте:

  str = label.get_text()

label это созданная вами метка, и str это возвращаемая строка. Текст метки может быть выровнен используя:

  label.set_justify(jtype)

Значения для jtype:

  JUSTIFY_LEFT # the default
JUSTIFY_RIGHT
JUSTIFY_CENTER
JUSTIFY_FILL # does not work

Виджет label, также способен делать перенос длинных строк автоматически. Это может быть активировано использованием:

  label.set_line_wrap(wrap)

Аргумент wrap принимает значения TRUE или FALSE.

Если вы хотите подчеркнуть свою метку, вы можете выбрать шаблон для метки:

  label.set_pattern(pattern)

Аргумент pattern показывает как должно выглядеть подчёркивание. Он содержит строку с символами подчёркивания и побела. Подчёркивание означает что соответствующий символ в метке должен быть подчёркнут. Например строка "__ __" подчеркнёт первые два символа, четвёртый и пятый. Если вы просто хотите иметь подчёркнутую горячую клавишу ("Мнемоническую команду") в вашей метке, вы должны использовать set_text_with_mnemonic(str), вместо set_pattern().

Программа label.py это короткий пример иллюстрирующий эти методы. Этот пример использует виджет Frame (см. Раздел 10.5, “Рамки”), для лучшей демонстрации стилей меток. Пока вы можете игнорировать это, мы объясним виджет Frame позже.

В GTK+ 2.0, метка может содержать отметку для шрифта и других атрибутов текста, также метки могут быть выделяемые (для Copy&Paste). Эти расширенные возможности не будут объяснятся здесь.

Рисунок 9.1, “Примеры меток” показывает результат запуска программы.

Рисунок 9.1. Примеры меток

Label Examples

Это исходный код label.py :

  1. #!/usr/bin/env python
  2. # --*-- coding:utf-8 --*--
  3. # example label.py
  4.  
  5. import pygtk
  6. pygtk.require('2.0')
  7. import gtk
  8.  
  9. class Labels:
  10. def __init__(self):
  11. self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  12. self.window.connect("destroy", lambda w: gtk.main_quit())
  13.  
  14. self.window.set_title("Примеры меток")
  15. vbox = gtk.VBox(False, 5)
  16. hbox = gtk.HBox(False, 5)
  17. self.window.add(hbox)
  18. hbox.pack_start(vbox, False, False, 0)
  19. self.window.set_border_width(5)
  20.  
  21. frame = gtk.Frame("Обычная метка")
  22. label = gtk.Label("Это обычная метка")
  23. frame.add(label)
  24. vbox.pack_start(frame, False, False, 0)
  25.  
  26. frame = gtk.Frame("Многострочная метка")
  27. label = gtk.Label("Это многострочная метка.\nВторая строка.\n"
  28. "Третья строка")
  29. frame.add(label)
  30. vbox.pack_start(frame, False, False, 0)
  31.  
  32. frame = gtk.Frame("Метка выровненная по левому краю")
  33. label = gtk.Label("Это выровненная по левому краю\n"
  34. "Многострочная метка.\nТретья строка")
  35. label.set_justify(gtk.JUSTIFY_LEFT)
  36. frame.add(label)
  37. vbox.pack_start(frame, False, False, 0)
  38.  
  39. frame = gtk.Frame("Метка выравненная по правому краю")
  40. label = gtk.Label("Это выровненная по правому краю\nМногострочная метка.\n"
  41. "Четвёртая строка (Шутка ^_^)")
  42. label.set_justify(gtk.JUSTIFY_RIGHT)
  43. frame.add(label)
  44. vbox.pack_start(frame, False, False, 0)
  45.  
  46. vbox = gtk.VBox(False, 5)
  47. hbox.pack_start(vbox, False, False, 0)
  48. frame = gtk.Frame("Метка с переносами строк")
  49. label = gtk.Label("Это пример метки с переносами строк. Она "
  50. "не будет знимать всю доступную "
  51. "ей ширину, но она автоматически "
  52. "переносится по словам. "
  53. "Пришло время всем хорошим людям прийти "
  54. "на помощь своей стороне. "
  55. "Шла Саша по шоссе, и сосала сушку.\n"
  56. " Она правильно поддерживает несколько абзацев, "
  57. "и правильно добавляет "
  58. "дополнительные пробелы. ")
  59. label.set_line_wrap(True)
  60. frame.add(label)
  61. vbox.pack_start(frame, False, False, 0)
  62.  
  63. frame = gtk.Frame("Растянутая метка с переносами")
  64. label = gtk.Label("Это пример растянутой метки с переносами строк. "
  65. "Она будет занимать "
  66. "всю доступную ей ширину. "
  67. "Это предложение для доказательства "
  68. "данной точки зрения. Это другое предложение. "
  69. "Here comes the sun, do de do de do.\n"
  70. " Это новый абзац.\n"
  71. " Этот абзац новее, длиннее "
  72. "и лучше. И к сожалению он подошёл "
  73. "к концу.")
  74. label.set_justify(gtk.JUSTIFY_FILL)
  75. label.set_line_wrap(True)
  76. frame.add(label)
  77. vbox.pack_start(frame, False, False, 0)
  78.  
  79. #~ frame = gtk.Frame("Подчёркнутая метка")
  80. #~ label = gtk.Label("Строка подчёркнута!\n"
  81. #~ "А эта подчёркнута весьма странным образом")
  82. #~ label.set_justify(gtk.JUSTIFY_LEFT)
  83. #~ label.set_pattern(
  84. #~ "_________________________ _ _________ _ ______ __ _______ ___")
  85. #~ print label.get_pattern()
  86. #~ frame.add(label)
  87. #~ vbox.pack_start(frame, False, False, 0)
  88. self.window.show_all ()
  89.  
  90. def main():
  91. gtk.main()
  92. return 0
  93.  
  94. if __name__ == "__main__":
  95. Labels()
  96. main()

Заметьте, что "Растянутая метка с переносами" не растянута по ширине.

Код с подчёркиванием закомментирован, поскольку в этом виде не работает, но был представлен в статье John Finlay.