PyQt. Первая графическая программа

Я предполагаю, что процесс инсталляции прошёл гладко.

Перед тем как начать работать давайте убедимся, что всё встало как надо. Для этого зайдем в Питон:

$ python

Затем, находясь в среде Питона, импортируем модуль QtCore.

Вы можете набирать команды руками, а можете закопипастить их из браузера по Ctrl-Insert и Shift-Insert.

>>> from PyQt4 import QtCore

и посмотрим на версии Qt:

>>> QtCore.QT_VERSION_STR

Среда Python помнит историю набранных и выполненных команд. Нажмите на клавиатуре клавишу «стрелка вверх» и получите предыдущую команду. Добавьте в команду две буквочки «PY». (Вы видите, чем они (команды) отличаются?)

>>> QtCore.PYQT_VERSION_STR

В общем, у вас должно получиться что-то типа такого:

pyqt4-4

Получилось? — Вот и отлично!

Теперь перейдем к освоению навыков по созданию графической программы. Для того чтобы понять смысл как создавать такие проги, не нужно пытаться сразу «сбацать» навороченную программу. Пусть для начала это будет прога, состоящая из одной кнопки и одной текстовой метки (лэйболочки).

В контексте Qt кнопки называются Push Button, а лэйболочки — Label. Соответственно, классы, которые отвечают за эти виджеты называются QPushButton и QLabel.

Прога не будет ничего делать. При нажатии на кнопку «Выход» она просто закончит свою работу. Сама же прога будет выглядеть так:

pyqt4-7

Вы обратили внимание на то, что слово «Мир» написано жирным шрифтом?

Что делают строители, перед тем как начать строить здание? — Правильно! Расчищают площадку для строительства. Вот и мы тоже создадим себе площадку для строительства нашей программы. Для этого мы создадим директорий и зайдем в него.

pyqt4-5

Здесь команда «mkdir -p test/qt» создаст в домашем директории поддиректорий test, а в нем ещё один — qt. Вторая команда «cd !$» эквивалентна команде «cd test/qt«. На первый взгляд странный аргумент !$ говорит команде — «возьми аргумент из предыдущей команды».

После исполнения второй команды мы оказываемся на нашей «стройплощадке». Далее нам нужно создать текстовый файл на языке Python. Причем не просто создать текстовый файл, а еще сделать его исполняемым. Всё это можно выполнить руками, но я предлагаю сделать это с помощью утилиты, которую я опубликовал в статье «Автоматизируй это!»

(http://wp.me/p1H7g0-1dH).

В общем, достаточно набрать команду:

$ mkpy pyqt1

и на «стройплощадке» появится текстовый исполняемый файл pyqt1.py:

pyqt4-6

, в котором будет содержаться текст шаблона:

#!/usr/bin/env python
#coding:utf-8

''' pyqt1.py '''

Теперь нужно запустить текстовый редактор и набрать в нём недостающий текст программы. Я пользуюсь редактором pluma, поэтому я набираю в консоли команду:

$ pluma pyqt1.py &

и перехожу в окно редактора.

Если влом напрягаться, можете тупо опять скопипастить текст отсюда. Должно получиться следующее:

#!/usr/bin/env python
#coding:utf-8

''' pyqt1.py '''

from PyQt4 import QtCore, QtGui
import sys

app = QtGui.QApplication(sys.argv)

wnd = QtGui.QWidget()
wnd.setWindowTitle(u"Первая программа на PyQt")
wnd.resize(300, 70)

lblHello = QtGui.QLabel(u"<center>Привет, <b>Мир</b></center>")
btnQuit = QtGui.QPushButton(u"Выход")

vbox = QtGui.QVBoxLayout()
vbox.addWidget(lblHello)
vbox.addWidget(btnQuit)
wnd.setLayout(vbox)

QtCore.QObject.connect(btnQuit, QtCore.SIGNAL("clicked()"), QtGui.qApp, QtCore.SLOT("quit()"))

wnd.show()

sys.exit(app.exec_())

Вы видите, почему слово «Мир» на лейболочке оказалось жирным?

А тэги «<center>» и «</center>» ни о чём вам не напоминают? Если вы подумали, что Qt позволяет вставлять HTML-евские тэги, то вы правильно думаете!

Однако, давайте сохраним файл и запустим программу!

Нажмите на кнопку «Выход», программа должна закрыться.

Ну что, получилось? — Я вас искренне поздравляю!

За основу программы я взял код из книги Николая Прохорёнка «Python3 и PyQt. Разработка приложений» http://wp.me/p1H7g0-1hO

Python3 и PyQt

Я там чуть-чуть подправил текст программы, сохранив её суть.

Итак, нам удалось оторвать переднюю стойку шасси от полосы. Продолжаем разгон!

В книге предлагается изменить стиль программы с процедурного стиля на ООП (Объектно Ориентированный). Мы тоже не будем отходить далеко от этой тропинки, переделаем свою программу на ООП.

С точки зрения обучения ремеслу «как писать графические программы» это весьма важный шаг. Дело в том, что подавляющее большинство графических программ в своей основе так или иначе подразумевают ООП и много-поточность. И кстати говоря, не так давно программисты пришли к заключению, что принцип ООП наиболее всего оправдан ни где-нибудь «там», а именно в области построения графических программ. В других направления ООП тоже «работает» не плохо, но в направлении создания графических программ — он работает самым эффективным образом.

Итак, давайте снова создадим питоновский файл:

$ mkpy pyqt1a

и запишем в него код:

#!/usr/bin/env python
#coding:utf-8

''' pyqt1a.py '''

from PyQt4 import QtCore, QtGui

#===============================================================================
class MyWindow(QtGui.QWidget):
  def __init__(self, parent=None):
    QtGui.QWidget.__init__(self, parent)
    self.lblHello = QtGui.QLabel(u"<center>Привет, <b>Мир</b>!</center>")
    self.lblHello.setAlignment(QtCore.Qt.AlignCenter)

    self.btnQuit = QtGui.QPushButton(u"Выход")
    self.btnQuit.setToolTip(self.trUtf8('Для выхода из проги нажмите <b>сюда</b>.'))

    self.vbox = QtGui.QVBoxLayout()
    self.vbox.addWidget(self.lblHello)
    self.vbox.addWidget(self.btnQuit)
    
    self.setLayout(self.vbox)

    self.connect(self.btnQuit, QtCore.SIGNAL("clicked()"), QtGui.qApp.quit)
    
    self.setWindowIcon(QtGui.QIcon('/usr/share/icons/mate/22x22/apps/preferences-system-bluetooth.png'))
    self.setGeometry(100, 300, 250, 50)
    self.setWindowTitle(self.trUtf8('Приложение с иконкой'))

    self.setToolTip(self.trUtf8('Это <b>QWidget</b>.'))
    #QtGui.QToolTip.setFont(QtGui.QFont('Liberation Sans', 8))
   

  def closeEvent(self, event):
    reply = QtGui.QMessageBox.question(self, self.trUtf8('Подтвердите!'),
              self.trUtf8("Вы уверены что хотите выйти?"),
              QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
 
    if reply == QtGui.QMessageBox.Yes:
      event.accept()
    else:
      event.ignore()
    
    
#===============================================================================
if __name__ == "__main__":
  import sys
  app = QtGui.QApplication(sys.argv)

  wnd = MyWindow()
  #wnd.setWindowTitle(u"Окно в стиле ООП")
  #wnd.resize(250, 70)
  wnd.show()

  sys.exit(app.exec_())

Кода стало больше. Да, это так! Помимо всего прочего я добавил в код ещё кое-какой функциональности.

В частности, я добавил иконку. Я добавил тул-типы (подсказки) на кнопку и на само окно программы. Если задержать мышинный курсор на секунду-две на кнопке «Выход» или на самом окне, то выскочит желтая подсказка.

Я добавил в прогу диалог подтверждения для выхода из проги. Этот диалог появится когда прогу попытаются закрыть не через кнопку «Выход», а через комбинацию клавиш Alt-F4 или топнут по крестику заголовке окна.

Я также в некоторых местах использовал функцию преобразования строк с кириллицей — self.trUtf8() вместо готовых юникодовских строк u»…». Честно говоря, так делать не то чтобы нельзя (часть кода писать так, а часть кода писать эдак), но … Просто такой стиль письма говорит скорее не о хорошем владении программистом обоими технологиями, а о том, что горе-программист только-что узнал о второй технологии и теперь втыкает свои знания там где надо и не надо. Смешение в одной программе двух подобных друг другу технологий — это не безвкусица у программиста, а его непрофессионализм!

Когда я был молодым, я писал проги обработки файлов, я мешал код системных вызовов с кодом стандартной библиотеки С. Старшие товарищи мне крутили у виска и требовали переделать. А я не понимал их мотивов (они, собственно, и не раскрывали мне своих профессиональных секретов), и обижался. Со временем, я набил себе шишек и понял, что безрассудно смешение ведет к проблемам, которые трудно разруливать. В общем, не повторяйте моих ошибок! Учитесь на своих.

Ну, так или иначе, сейчас программа должна выглядеть так:

pyqt4-8

Я сейчас преднамеренно не погружаюсь в код и не объясняю, что в нём делают те или иные команды (операторы). Нам сейчас важно научиться получать из текстового файла работающую программу.

Если вы дочитали до этой строки и у вас получилось запустить программу, то я вас поздравляю! Вам реально удалось немного оторваться от земли. Но чтобы по настоящему взлететь, нужно еще кое-что. И этим мы займёмся в следующей статье. Я имею в виду — автоматическую генерацию кода на основе визуально расставленных виджетов на экранной форме.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s