Глава 6. Виджет Button

Содержание

6.1. Обычные кнопки
6.2. Виджет ToggleButton
6.3. Виджет CheckButton
6.4. Виджет RadioButton

6.1. Обычные кнопки

Мы уже видели почти всё, что нужно знать о кнопках. Они довольно простые. Вы можете использовать функцию gtk.Button() для создания кнопки с меткой, передаваемой строковым параметром, или создать пустую кнопку не указывая строку. Также вы можете разместить метку или картинку в новую кнопку. Для этого создайте новую коробку, и разместите объекты в ней, используя обычный метод pack_start(), затем используйте метод add() для размещения коробки в кнопке.

Функция создания коробки:

  button = gtk.Button(label=None, stock=None)

если текст label указан, то он используется как надпись для кнопки. Если указан stock он используется как иконка и надпись для кнопки одновременно. Stock может содержать:

  STOCK_DIALOG_INFO
STOCK_DIALOG_WARNING
STOCK_DIALOG_ERROR
STOCK_DIALOG_QUESTION
STOCK_DND
STOCK_DND_MULTIPLE
STOCK_ADD
STOCK_APPLY
STOCK_BOLD
STOCK_CANCEL
STOCK_CDROM
STOCK_CLEAR
STOCK_CLOSE
STOCK_CONVERT
STOCK_COPY
STOCK_CUT
STOCK_DELETE
STOCK_EXECUTE
STOCK_FIND
STOCK_FIND_AND_REPLACE
STOCK_FLOPPY
STOCK_GOTO_BOTTOM
STOCK_GOTO_FIRST
STOCK_GOTO_LAST
STOCK_GOTO_TOP
STOCK_GO_BACK
STOCK_GO_DOWN
STOCK_GO_FORWARD
STOCK_GO_UP
STOCK_HELP
STOCK_HOME
STOCK_INDEX
STOCK_ITALIC
STOCK_JUMP_TO
STOCK_JUSTIFY_CENTER
STOCK_JUSTIFY_FILL
STOCK_JUSTIFY_LEFT
STOCK_JUSTIFY_RIGHT
STOCK_MISSING_IMAGE
STOCK_NEW
STOCK_NO
STOCK_OK
STOCK_OPEN
STOCK_PASTE
STOCK_PREFERENCES
STOCK_PRINT
STOCK_PRINT_PREVIEW
STOCK_PROPERTIES
STOCK_QUIT
STOCK_REDO
STOCK_REFRESH
STOCK_REMOVE
STOCK_REVERT_TO_SAVED
STOCK_SAVE
STOCK_SAVE_AS
STOCK_SELECT_COLOR
STOCK_SELECT_FONT
STOCK_SORT_ASCENDING
STOCK_SORT_DESCENDING
STOCK_SPELL_CHECK
STOCK_STOP
STOCK_STRIKETHROUGH
STOCK_UNDELETE
STOCK_UNDERLINE
STOCK_UNDO
STOCK_YES
STOCK_ZOOM_100
STOCK_ZOOM_FIT
STOCK_ZOOM_IN
STOCK_ZOOM_OUT

Программа buttons.py предоставляет пример использования gtk.Button() для создания кнопки с картинкой и надписью. Код создания коробки отделён, так что вы сможете использовать его в своих программах. В дальнейшем ещё будут примеры использования картинок. Рисунок 6.1, “Кнопка с картинкой и надписью” показывает окно содержащее картинку и надпись:

Рисунок 6.1. Кнопка с картинкой и надписью

Button with Pixmap and Label

Исходный код программы buttons.py:

  1. #!/usr/bin/env python
  2. # --*-- coding:utf-8 --*--
  3. # example-start buttons buttons.py
  4.  
  5. import pygtk
  6. pygtk.require('2.0')
  7. import gtk
  8.  
  9. # Создаём новый HBox с надписью и картинкой
  10. # размещаем их там и возвращаем коробку.
  11.  
  12. def xpm_label_box(parent, xpm_filename, label_text):
  13. # Создаём коробку для картинки и надписи
  14. box1 = gtk.HBox(False, 0)
  15. box1.set_border_width(2)
  16.  
  17. # Создаём картинку
  18. image = gtk.Image()
  19. image.set_from_file(xpm_filename)
  20.  
  21. # Создаём надпись
  22. label = gtk.Label(label_text)
  23.  
  24. # Размещаем надпись и картинку в HBox
  25. box1.pack_start(image, False, False, 3)
  26. box1.pack_start(label, False, False, 3)
  27.  
  28. image.show()
  29. label.show()
  30. return box1
  31.  
  32. class Buttons:
  33. # Наш обычный callback
  34. def callback(self, widget, data=None):
  35. print "Привет снова - %s была нажата" % data
  36.  
  37. def __init__(self):
  38. # Создаём новое окно
  39. self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  40.  
  41. self.window.set_title("Картинки на кнопках!")
  42.  
  43. # Использовать это со всеми окнами будет хорошим решением.
  44. self.window.connect("destroy", lambda wid: gtk.main_quit())
  45. self.window.connect("delete_event", lambda a1,a2:gtk.main_quit())
  46.  
  47. # Устанавливаем ширину границы окна.
  48. self.window.set_border_width(10)
  49.  
  50. # Создаём новую кнопку
  51. button = gtk.Button()
  52.  
  53. # Привязываем сигнал "clicked" к нашему callback
  54. button.connect("clicked", self.callback, "классная кнопка")
  55.  
  56. # Это вызывает нашу функцию создания коробки
  57. box1 = xpm_label_box(self.window, "info.xpm", "классная кнопка")
  58.  
  59. # Размещаем окно со всеми виджетами
  60. button.add(box1)
  61.  
  62. box1.show()
  63. button.show()
  64.  
  65. self.window.add(button)
  66. self.window.show()
  67.  
  68. def main():
  69. gtk.main()
  70. return 0
  71.  
  72. if __name__ == "__main__":
  73. Buttons()
  74. main()
  75.  

Строки 12-30 определяют вспомогательную функцию xpm_label_box(), которая создаёт горизонтальную коробку с шириной границы 2 (строки 14-15), заполняет её картинкой (строка 25) и меткой (строка 26).

Строки 36-70 определяют класс Buttons. Строки 37-66 определяют конструктор, который создаёт окно (строка 39), устанавливает заголовок (строка 41), подключает сигналы "delete_event" и "destroy" (строки 44-44). Строка 51 создаёт кнопку без метки. Её сигнал "clicked" присоединяется к методу callback() в строке 54. Функция xpm_label_box() вызывается в строке 57 для создания картинки и метки, укладываемые в кнопку.

Функция xpm_label_box() может быть использована для размещения картинок и надписей в любой виджет, который может быть контейнером.

Виджет-кнопка имеет следующие сигналы:

      pressed - Излучается по нажатию кнопки

released - Излучается по отжатию кнопки

clicked - Излучается при отжатии нажатой кнопки (по клику)

enter - Излучается при наведении курсора на кнопку

leave - Излучается при выходе курсора из области кнопки