9.13. Выбор цвета

Виджет выбора цвета предназначен для интерактивного выбора цвета пользователем. Этот составной виджет позволяет пользователю выбирать цвет тройками параметров: RGB (Red, Green, Blue) и HSV (Hue, Saturation, Value). Происходит это путём выбора одиночных значений ползунками, либо выбирая желаемый цвет из кольца hue-saturation или палитры предустановленных цветов. Опционально также может быть выбрана прозрачность.

Виджет выбора цвета излучает только один сигнал, "color_changed", который излучается всегда при смене цвета в виджете, когда пользователь выбирает его, либо вы выбираете его явно с помощью метода set_color().

Давайте посмотрим что же предлагает нам этот виджет. Виджет существует в двух вариациях: gtk.ColorSelection и gtk.ColorSelectionDialog.

  colorsel = gtk.ColorSelection()

Вы можете не использовать конструктор на прямую. Тогда создастся виджет ColorSelection без родителей. Виджет ColorSelection наследуется от VBox.

  colorseldlg = gtk.ColorSelectionDialog(title)

Где title это строка используемая в заголовке диалогового окна.

Это наиболее распространённый конструктор ColorSelection. Конструктор создаёт ColorSelectionDialog. Он содержит Frame, содержащий виджет ColorSelection, HSeparator и HBox с тремя кнопками: Ok, Cancel и Help. Вы можете управлять этими кнопками, используя атрибуты ok_button, cancel_button и help_button виджета ColorSelectionDialog (например, colorseldlg.ok_button). Виджет ColorSelection находится в атрибуте colorsel:

  colorsel = colorseldlg.colorsel

Виджет ColorSelection имеет несколько методов для изменения его характеристик и предоставления доступа к выбору цвета.

  colorsel.set_has_opacity_control(has_opacity)

Виджет ColorSelection поддерживает регулировку прозрачности цвета (также известной как альфа-канал). По умолчанию это отключено. Вызов метода с has_opacity равном TRUE включает прозрачность. Тем же образом has_opacity установленный в FALSE отключит прозрачность.

  colorsel.set_current_color(color)
colorsel.set_current_alpha(alpha)

Вы можете установить текущий цвет явно, вызовом метода set_current_color() с gtk.gdk.Color. Настройка прозрачности происходит с помощью метода set_current_alpha(). Значение alpha должно быть между 0 (полная прозрачность) и 65636 (полная непрозрачность).

  color = colorsel.get_current_color()
alpha = colorsel.get_current_alpha()

Когда вам нужно узнать текущий цвет, обычно при получении сигнала "color_changed", используйте эти методы.

Пример colorsel.py показывает использование ColorSelectionDialog. Эта программа отображает окно с областью для рисования. Щелчок по ней открывает окно выбора цвета, выбор цвета в диалоговом окне меняет цвет фона. Рисунок 9.13, “Пример окна выбора цвета” показывает программу в действии:

Рисунок 9.13. Пример окна выбора цвета

Color Selection Dialog Example

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

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # example colorsel.py
  4.  
  5. import pygtk
  6. pygtk.require('2.0')
  7. import gtk
  8.  
  9. class ColorSelectionExample:
  10. # Обработчик color_changed
  11. def color_changed_cb(self, widget):
  12. # Получаем colormap
  13. colormap = self.drawingarea.get_colormap()
  14.  
  15. # Получаем текущий цвет
  16. color = self.colorseldlg.colorsel.get_current_color()
  17.  
  18. # Устанавливаем цвет фона окна
  19. self.drawingarea.modify_bg(gtk.STATE_NORMAL, color)
  20.  
  21. # Обработчик событий области рисования
  22. def area_event(self, widget, event):
  23. handled = False
  24.  
  25. # Проверяем получили ли мы событие щелчка по кнопке
  26. if event.type == gtk.gdk.BUTTON_PRESS:
  27. handled = True
  28.  
  29. # Создаём окно выбора цвета
  30. if self.colorseldlg == None:
  31. self.colorseldlg = gtk.ColorSelectionDialog(
  32. "Выбор фонового цвета")
  33.  
  34. # Получаем виджет ColorSelection
  35. colorsel = self.colorseldlg.colorsel
  36.  
  37. colorsel.set_previous_color(self.color)
  38. colorsel.set_current_color(self.color)
  39. colorsel.set_has_palette(True)
  40.  
  41. # подключаем сигнал "color_changed"
  42. colorsel.connect("color_changed", self.color_changed_cb)
  43. # Показываем диалоговое окно
  44. response = self.colorseldlg.run()
  45.  
  46. if response -- gtk.RESPONSE_OK:
  47. self.color = colorsel.get_current_color()
  48. else:
  49. self.drawingarea.modify_bg(gtk.STATE_NORMAL, self.color)
  50.  
  51. self.colorseldlg.hide()
  52.  
  53. return handled
  54.  
  55. # Закрытие
  56. def destroy_window(self, widget, event):
  57. gtk.main_quit()
  58. return True
  59.  
  60. def __init__(self):
  61. self.colorseldlg = None
  62. # Создаём верхнее окно, указываем заголовоу и политики
  63. window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  64. window.set_title("Проба выбора цвета")
  65. window.set_resizable(True)
  66.  
  67. # Присоединяем события "delete" и "destroy" для выхода
  68. window.connect("delete_event", self.destroy_window)
  69.  
  70. # Создаём область для рисования, устанавливаем размер и отлавливаем события кнопки
  71. self.drawingarea = gtk.DrawingArea()
  72.  
  73. self.color = self.drawingarea.get_colormap().alloc_color(0, 65535, 0)
  74.  
  75. self.drawingarea.set_size_request(200, 200)
  76. self.drawingarea.set_events(gtk.gdk.BUTTON_PRESS_MASK)
  77. self.drawingarea.connect("event", self.area_event)
  78.  
  79. # Добавляем обрасть рисования на окно, показываем обоих
  80. window.add(self.drawingarea)
  81. self.drawingarea.show()
  82. window.show()
  83.  
  84. def main():
  85. gtk.main()
  86. return 0
  87.  
  88. if __name__ == "__main__":
  89. ColorSelectionExample()
  90. main()
  91.