Первое GUI-приложение на Python и PyQt

В предыдущем посте я рассказал про выбор IDE и GUI-библиотеки для разработки полноценных приложений на языке Python с графическим интерфейсом пользователя. Согласитесь, что пользоваться консольными программами удобно далеко не всегда. К тому же, если возникнет необходимость разработки программы для рядовых пользователей, то без графического интерфейса точно не обойтись. Поэтому будем учиться создавать такие интерфейсы.

Как я уже писал в прошлом посте, на сегодняшний день я остановился на библиотеке PyQt для создания графического интерфейса пользователя (впоследствии буду работать и с другими библиотеками). Сегодня мы создадим нашу первую программу, написанную на Python, которая будет обладать полноценным графическим интерфейсом. На все вопросы отвечу в комментариях.

Установка

Для начала установим библиотеку PyQt на наш компьютер (см. также Как установить Python в Windows и Linux). Скачиваем библиотеку с сайта Riverbank’а (скачать PyQt4):

Первое приложение на Python и PyQt

Выбираем нужный установочник для Windows или Linux:

Первое приложение на Python и PyQt

Скачиваем установочник на компьютер и запускаем для установки. При полной установке будет установлен сам Python 3.2. Ничего страшного, если он уже стоит у вас и там есть рабочие файлы и скрипты, они никуда не пропадут. Но если все же переживаете, то скопируйте их в другую директорию.

Первое приложение на Python и PyQt

Первое приложение на Python и PyQt

Первое приложение на Python и PyQt

Первое приложение на Python и PyQt

Первое приложение на Python и PyQt

Первое приложение на Python и PyQt

Первое приложение на Python и PyQt

Теперь можно открывать свою IDE и начинать писать программу с использованием библиотеки PyQt.

Установка PyQt на Linux производится несколько иначе, не так просто. Дело в том, что если установить библиотеку простым способом, то тогда она будет работать в предустановленной более ранней версии Python (у меня это 2.7), а в новой версии 3.2 нет.

Но это не беда. Только не вздумайте удалять старую версию, НИ В КОЕМ СЛУЧАЕ! Я по своей глупости удалил ее, впоследствии об этом пожалел. Дело в том, что в линуксе многое завязано на питоне, поэтому удаляя питон, вы удалите в том числе и многие другие программы и пакеты, к примеру, тот же рабочий стол. Короче, проблем потом много будет. Мне потребовалось восстанавливать систему и все удаленные пакеты.

Чтобы этого избежать и безболезненно установить PyQt на Linux и прикрутить его к последней версии Python, почитайте вот это руководство. Описана установка под Linux Ubuntu 10.04. У меня все тоже сработало под Linux Ubuntu 11.10. Так что, дерзайте. Все будет установлено так, как нужно.

Первая программа

Сегодня я вас только немного познакомлю с библиотекой PyQt, поэтому пока не будем трогать QtDesigner, а создадим небольшой интерфейс непосредственно в IDE (без визуального проектирования интерфейса).

Ниже привожу код нашей первой программы с пояснениями.

#!/usr/bin/python3.2

import sys
from PyQt4 import QtGui, QtCore

class TestGui(QtGui.QDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)

        self.setGeometry(600, 300, 500, 150)
        self.setWindowTitle("Первое GUI-приложение")
        self.setWindowIcon(QtGui.QIcon('data/crazy.ico'))

        lTitle = QtGui.QLabel("Пример GUI-приложения", self)
        lTitle.setAlignment(QtCore.Qt.AlignHCenter)
        lTitle.setGeometry(100,10,300,20)
        fntMyFont = QtGui.QFont(self)
        fntMyFont.setBold(True)
        fntMyFont.setPixelSize(18)
        lTitle.setFont(fntMyFont)

        lDescription = QtGui.QLabel("Это наше первое GUI-приложение\nСпециально для http://codeinlife.ru", self)
        lDescription.setAlignment(QtCore.Qt.AlignHCenter)
        lDescription.setGeometry(100, 35, 300, 40)
        fntMyFont2 = QtGui.QFont(self)
        fntMyFont2.setItalic(True)
        fntMyFont2.setPixelSize(14)
        lDescription.setFont(fntMyFont2)

        btnQuit = QtGui.QPushButton("Выйти", self)
        btnQuit.setGeometry(150, 75, 200, 30)
        self.connect(btnQuit, QtCore.SIGNAL('clicked()'), quit)

app = QtGui.QApplication(sys.argv)
tg = TestGui()
tg.show()
app.exec()

Первым делом мы подключаем к нашей программе необходимые библиотеки. В частности, здесь мы подключили системную библиотеку sys и библиотеку PyQt4, а точнее QtCore и QtGui из нее. Последние нужны для работы с графическими элементами библиотеки PyQt4, т.е. для создания окон и графических компонент.

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

В конструкторе определяем параметры окна (в данном случае это QDialog, о других типах поговорим в отдельном посте), создаем лейблы (QLabel) и определяем для них параметры. Тут вроде ничего сложного нет, поэтому особо не останавливаюсь, но если будут вопросы, велком в комментарии.

Также я добавил на форму кнопку (QPushButton) для выхода из программы. Создание кнопки осуществляет точно также, как и любого другого элемента. Но стоит остановится на действии этой кнопки. Дело в том, что принцип работы здесь несколько отличается, чем в привычных многих языках. Здесь все действия основываются на так называемых сигналах и слотах, которые определяют действие заданной связки. Т.е. в нашем примере мы связываем кнопку QPushButton сигналом clicked() с событием quit. Другими словами, инициируем выход из программы по нажатию на кнопку.

Вот и все. Создаем объект нашего класса и запускаем приложение.

Разницы, в какой ОС вы будете писать это — нет. К примеру, у меня работает данный код как в Windows, так и в Linux. Поскольку сейчас сижу на работе, то нет возможности сделать скрин из линукса (будет вечером). А пока вот скрины работающей программы в Windows XP SP3:

Первое GUI-приложение на Python и PyQt

Первое GUI-приложение на Python и PyQt

Первое GUI-приложение на Python и PyQt

Вот так, позже выложу еще скрины с линукса. Если есть какие-то вопросы по созданию GUI-приложений на Python, то пишите в комментариях, решим все проблемы.

UPD. А вот и обещанные скрины программы в Linux Ubuntu:

Первое GUI-приложение на Python и PyQt

Первое GUI-приложение на Python и PyQt

P.S. В ближайших постах обсудим литературу, с которой лучше всего начинать как изучение самого языка Python, так и библиотеки PyQt. Ну и, конечно, рассмотрим возможности QtDesigner, чтобы ускорить процесс создания графического интерфейса.

P.P.S. Друзья, немного запоздало, но все же, поздравляю вас с прошедшим профессиональным праздником — днем вебмастера, который прошел 4 апреля (4.04). Интересных проектов, успешной работы и хорошего конверта! 😉

С Днем Вебмастера

29 комментария(ев) к записи “Первое GUI-приложение на Python и PyQt”

  1. Спасибо за полезную информацию, а когда будет статья по QtDesigner?

    • Думаю, что на этой неделе уже напишу про проектирование интерфейса в QtDesigner и подключение спроектированного интерфейса к программе. Подписывайтесь на обновления, чтобы не пропустить.

  2. Станислав:

    Все это здорово , но объяснит ли мне автор , почему при команде для повторения фразы » Hello World » 100 тыс. раз python 3 зависает , команда не выполняется , при всем при том что у меня CPU intel 2500K и памяти 8 Gb ? Попробуйте сами господа .

  3. pomidoroff:

    Может быть, окно, которое должно при этом получиться, не влезает в какие-нибудь графические ограничения?

  4. bodrich:

    А когда продолжение статьи ?:)

    • Думаю, что на днях опубликую статью, так сказать, с калькулятором на Python, чтобы более наглядно показать работу языка. Ну, и не за горами подборка литературы для изучения питона.

  5. Василий:

    Повторю вопрос других: а когда продолжение статьи)?

  6. Хорошее введение, но когда же продолжение. Сам начинал на Питоне, забросил, теперь нагоняю.

  7. Андр:

    В последней строке под линух ошибулину выдает нужно так sys.exit(app.exec_())

  8. Антон:

    Не понятно какпользоваться IDE. Статья явно не для новичка. Скачал, установил и облом.. Куда код писать? Какой тип программы в настройках выбирать???

  9. Wiom:

    строка 17 и 25 так fntMyFont = QtGui.QFont(self) не заработало, а вот так fntMyFont = QtGui.QFont() заработало. не знаю почему…

  10. Лидия:

    У меня убунту 14.04 Половина пакетов не устанавливается ни в какую. Библиотек он тоже не видит(. Что делать?

  11. Олег:

    Здравствуйте! Скопировал и сохранил Ваш код, запускаю его в IDLE, но выходит сообщение: Traceback (самый последний вызов последнего):
       Файл «C: \ Users \ Пользователь \ Desktop \ Python \ GUI app.py», строка 33, в
         Tg = TestGui ()
       Файл «C: \ Users \ Пользователь \ Desktop \ Python \ GUI app.py», строка 15, в __init__
         fntMyFont = QtGui.QFont (само)
    TypeError: QFont (): Аргумент 1 имеет неожиданный тип ‘TestGui’

    Напишите пожалуйста, в чём может быть дело?

  12. Максим:

    Здравствуйте. Я создал файл с расширением .py и вставил весь код, сохранил и открывал и ничего. Почему так? Можете помочь? sobkomax111@gmail.com

  13. григорий:

    Здравствуйте! Скопировал и сохранил Ваш код, запускаю его в IDLE, но выходит сообщение: Traceback (самый последний вызов последнего):
    Файл «C: \ Users \ Пользователь \ Desktop \ Python \ GUI app.py», строка 33, в
    Tg = TestGui ()
    Файл «C: \ Users \ Пользователь \ Desktop \ Python \ GUI app.py», строка 15, в __init__
    fntMyFont = QtGui.QFont (само)
    TypeError: QFont (): Аргумент 1 имеет неожиданный тип ‘TestGui’

    Напишите пожалуйста, в чём может быть дело?

    я убрал «само» т.е self вобоих и все заработало .почему не знаю ,еше новичок но это точно связано с классами и обьектами. может ошибка текста?

    • wubecaf:

      Ну, как я понимаю, тут мы определяем fntMyFont как функцию QtGui.QFont, а не создаем метод в блоке класса «TestGui» также, как и fntMyFont2. То есть, если бы было указано, что-то вроде:
      def fntMYFont2(self):
      fntMyFont2 = QtGui.QFont()
      fntMyFont2.setItalic(True)
      fntMyFont2.setPixelSize(14)
      lDescription.setFont(fntMyFont2)
      return fntMyFont2
      в этом случае будет работать, надеюсь поможет)

  14. Ярослав:

    Здравствуйте, скопировал ваш код полностью в PyCharm, выдал в Run следующее:Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
    Что это значит?

  15. Акбар:

    Автор статьи если это все еще актуально ответьте на мой вопрос
    тут вот я зашел на сайт по ссылке которую указали чтоб скачать PyQt вот там они в расширение .zip а у вас на скринах оно в .exe
    вообщем я скачал тот зип , там нет установочного файла .ехе
    как быть ?

Оставить комментарий к записи Антон

(обязательно)

(обязательно)