В предыдущем посте я рассказал про выбор IDE и GUI-библиотеки для разработки полноценных приложений на языке Python с графическим интерфейсом пользователя. Согласитесь, что пользоваться консольными программами удобно далеко не всегда. К тому же, если возникнет необходимость разработки программы для рядовых пользователей, то без графического интерфейса точно не обойтись. Поэтому будем учиться создавать такие интерфейсы.
Как я уже писал в прошлом посте, на сегодняшний день я остановился на библиотеке PyQt для создания графического интерфейса пользователя (впоследствии буду работать и с другими библиотеками). Сегодня мы создадим нашу первую программу, написанную на Python, которая будет обладать полноценным графическим интерфейсом. На все вопросы отвечу в комментариях.
Установка
Для начала установим библиотеку PyQt на наш компьютер (см. также Как установить Python в Windows и Linux). Скачиваем библиотеку с сайта Riverbank’а (скачать PyQt4):
Выбираем нужный установочник для Windows или Linux:
Скачиваем установочник на компьютер и запускаем для установки. При полной установке будет установлен сам Python 3.2. Ничего страшного, если он уже стоит у вас и там есть рабочие файлы и скрипты, они никуда не пропадут. Но если все же переживаете, то скопируйте их в другую директорию.
Теперь можно открывать свою 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, то пишите в комментариях, решим все проблемы.
UPD. А вот и обещанные скрины программы в Linux Ubuntu:
P.S. В ближайших постах обсудим литературу, с которой лучше всего начинать как изучение самого языка Python, так и библиотеки PyQt. Ну и, конечно, рассмотрим возможности QtDesigner, чтобы ускорить процесс создания графического интерфейса.
P.P.S. Друзья, немного запоздало, но все же, поздравляю вас с прошедшим профессиональным праздником — днем вебмастера, который прошел 4 апреля (4.04). Интересных проектов, успешной работы и хорошего конверта! 😉
Спасибо за полезную информацию, а когда будет статья по QtDesigner?
Думаю, что на этой неделе уже напишу про проектирование интерфейса в QtDesigner и подключение спроектированного интерфейса к программе. Подписывайтесь на обновления, чтобы не пропустить.
Все это здорово , но объяснит ли мне автор , почему при команде для повторения фразы » Hello World » 100 тыс. раз python 3 зависает , команда не выполняется , при всем при том что у меня CPU intel 2500K и памяти 8 Gb ? Попробуйте сами господа .
Скиньте код функции, которая выводит фразу 100 тысяч раз, может быть просто там ошибка. А я пока попробую у себя это.
Может быть, окно, которое должно при этом получиться, не влезает в какие-нибудь графические ограничения?
Вы про что именно?
А когда продолжение статьи ?:)
Думаю, что на днях опубликую статью, так сказать, с калькулятором на Python, чтобы более наглядно показать работу языка. Ну, и не за горами подборка литературы для изучения питона.
Буду ждать
Повторю вопрос других: а когда продолжение статьи)?
Ребят, написал про литературу: С чего начать изучение Python?
Хорошее введение, но когда же продолжение. Сам начинал на Питоне, забросил, теперь нагоняю.
Уже написал небольшое продолжение про литературу здесь.
В последней строке под линух ошибулину выдает нужно так sys.exit(app.exec_())
Не понятно какпользоваться IDE. Статья явно не для новичка. Скачал, установил и облом.. Куда код писать? Какой тип программы в настройках выбирать???
Речь про стандартную IDLE Python. Создаете там новый файл, пишите код и запускаете через Shell (в меню Run -> Run Module (F5))
строка 17 и 25 так fntMyFont = QtGui.QFont(self) не заработало, а вот так fntMyFont = QtGui.QFont() заработало. не знаю почему…
У меня убунту 14.04 Половина пакетов не устанавливается ни в какую. Библиотек он тоже не видит(. Что делать?
Проверьте корректность своей сборки убунту. Либо обновитесь до 16.04.
Здравствуйте! Скопировал и сохранил Ваш код, запускаю его в 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’
Напишите пожалуйста, в чём может быть дело?
Столкнулся с такой же проблемой. Полечил заключением проблемных строк в try/except
Исправил заменив строки QtGui.QFont(self) на QtGui.QFont()
Здравствуйте. Я создал файл с расширением .py и вставил весь код, сохранил и открывал и ничего. Почему так? Можете помочь? sobkomax111@gmail.com
А что значит «ничего»? Вы запускаете через IDLE или как-то иначе? Ошибки показывает?
Здравствуйте! Скопировал и сохранил Ваш код, запускаю его в 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 вобоих и все заработало .почему не знаю ,еше новичок но это точно связано с классами и обьектами. может ошибка текста?
Ну, как я понимаю, тут мы определяем fntMyFont как функцию QtGui.QFont, а не создаем метод в блоке класса «TestGui» также, как и fntMyFont2. То есть, если бы было указано, что-то вроде:
def fntMYFont2(self):
fntMyFont2 = QtGui.QFont()
fntMyFont2.setItalic(True)
fntMyFont2.setPixelSize(14)
lDescription.setFont(fntMyFont2)
return fntMyFont2
в этом случае будет работать, надеюсь поможет)
с учетом табуляции, конечно
Здравствуйте, скопировал ваш код полностью в PyCharm, выдал в Run следующее:Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
Что это значит?
Автор статьи если это все еще актуально ответьте на мой вопрос
тут вот я зашел на сайт по ссылке которую указали чтоб скачать PyQt вот там они в расширение .zip а у вас на скринах оно в .exe
вообщем я скачал тот зип , там нет установочного файла .ехе
как быть ?