3.2. Улучшаем "Привет, Мир!"

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

Запущенная программа helloworld2.py создаёт окно, показанное на Рисунке 3.1, “Улучшенный пример 'Привет, Мир!'”.

Рисунок 3.1. Улучшенный пример "Привет, Мир!"

Upgraded Hello World Example

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

Отличие этого кода от первого helloworld по порядку.

Как написано выше - здесь нет обработчика события "destroy".

Строки 13-14 определяют callback метод похожий на метод hello() в первом helloworld. Отличие заключается в том, что новый метод выводит сообщение содержащее переданные ему данные.

Строка 27 устанавливает строку заголовка для окна (смотрите Рисунок 3.1, “Улучшенный пример 'Привет, Мир!'”).

Строка 39 создаёт горизонтальную коробку (gtk.HBox) для размещения двух кнопок, создаваемых в строках 45 и 60. Строка 42 добавляет горизонтальную коробку в контейнер окна.

Строки 49 и 64 подключают метод callback() для сигнала "clicked" от кнопок. Каждая кнопка передаёт методу callback() свою строку.

Строки 53 и 66 размещают кнопки в горизонтальную коробку. Строки 57 и 70 просят GTK отобразить кнопки.

Строки 71-72 просят GTK отобразить коробку и окно в соответственном порядке.