Python для обеспечения географических исследований Лекция 5 Сегодня на повестке дня: Смотрим на решение домашних задачек Некоторые полезные функции Графический интерфейс для приложений Python. PyQt4 2 def fact (x): i=1 factorial = 1 while (i <= x): factorial = factorial * i i=i+1 return factorial print 'Enter number:' a = input() print fact(a) 3 import math def listSum (x): s = 0.0 for i in x: s=s+i return s def listOtklonsSrKv (x): otklKvSum = 0.0 otklons = listOtklons (x) for i in otklons: otklKvSum = otklKvSum + i*i return math.sqrt(otklKvSum/len(x)) def listSredn (x): return listSum(x) / len(x) def listOtklons (x): otkl = [] for i in x: print 'Enter numbers:' l = input () print listOtklonsSrKv(l) otkl.append(i-listSredn(x)) return otkl 4 import math import mylib print 'Enter numbers:' l = input () print mylib.listOtklonsSrKv(l) 5 f = open("text.txt","r") for line in f: print line[3:7] 6 import mylib print 'Enter file name' fileName = input() f = open (fileName,'r') a = [] for line in f: a.append(int(line)) print mylib.listOtklonsSrKv(a) 7 Библиотека OS os.listdir(path=".") - список файлов и директорий в папке Очень полезно, чтобы циклом пройти по всем файлам в папке. При применении мы получаем список всех имён как трок import os a = os.listdir("C:/") print a 8 os.getcwd() - текущая рабочая директория. os.mkdir(path, mode=0o777, *, dir_fd=None) - создаёт директорию. os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None) - переименовывает файл или директорию из src в dst. 9 Библиотека SYS От неё обычно нужно только одно, но очень важное: получение аргументов командной строки. sys.argv - список аргументов командной строки, передаваемых сценарию Python. sys.argv[0] является именем скрипта. import sys print sys.argv 10 Обычно пользователю удобно передавать в качестве аргументов командной строки пути до файлов, какие-то настройки и т.д. import sys f = open (sys.argv[1],'r') for line in f: print line 11 Библиотека list Множество полезных функций работы со списками list.append(x) Добавляет элемент в конец списка list.extend(L) Расширяет список list, добавляя в конец все элементы списка L list.insert(i, x) Вставляет на i-ый элемент значение x list.remove(x) Удаляет первый элемент в списке, имеющий значение x list.pop([i]) Удаляет i-ый элемент и возвращает его. Если индекс не указан, удаляется последний элемент list.index(x, [start [, end]]) Возвращает положение первого элемента от start до end со значением x ist.count(x) Возвращает количество элементов со значением x 12 list.sort([key = функция]) Сортирует список на основе функции list.reverse() Разворачивает список a = [1,6,8,2,100,102] a.sort() print a a = [1,6,8,2,100,102] b = a.index(2) print b При отсутствии вернет ошибку NotInList – нужно обрабатывать исключение 13 Ключевое слово in в логических выражениях позволяет узнавать, есть ли интересный нам элемент в списке if a in list: <инструкции> if 3 in [4,7,3,2,6]: print ‘Obvious!’ 14 Стандартная работа со строками S1 + S2 Конкатенация (сложение строк) S1 * 3 Повторение строки S[i] Обращение по индексу S[i:j:step]Извлечение среза len(S) Длина строки 15 str in S Проверка на вхождение подстроки в строку S.find(str, [start],[end]) Поиск подстроки в строке. Возвращает номер первого вхождения или -1 S.rfind(str, [start],[end]) Поиск подстроки в строке. Возвращает номер последнего вхождения или -1 a = "Somewhere in time" print a.find("time") 16 S.replace(шаблон, замена) Замена шаблона S.split(символ) Разбиение строки по разделителю a = "MSU is best university in the world. I love MSU" b = a.replace ("MSU","SPSU") print b a = "SPSU is best university in the world. I love SPSU. Great!" b = a.split(".") print b 17 Проверка состояния строки S.isdigit() Состоит ли строка из цифр S.isalpha() Состоит ли строка из букв S.isalnum() Состоит ли строка из цифр или букв S.islower() Состоит ли строка из символов в нижнем регистре S.isupper() Состоит ли строка из символов в верхнем регистре S.isspace() Состоит ли строка из неотображаемых символов (пробел, символ перевода страницы ('\f'), "новая строка" ('\n'), "перевод каретки" ('\r'), "горизонтальная табуляция" ('\t') и "вертикальная табуляция" ('\v')) S.istitle() Начинаются ли слова в строке с заглавной буквы S.upper() Преобразование строки к верхнему регистру S.lower() Преобразование строки к нижнему регистру 18 До сих пор мы с вами делали только консольные приложения. Ясно, что обычно приходится сталкиваться с графическими интерфейсами (окошками с кнопочками). 19 Что такое графический интерфейс? Некоторое множество визуальных компонентов Компоненты эти: позволяют с собой взаимодействовать (заполнить текстовое поле и т.п.) реагируют на действия (нажатие кнопки мыши и т.п.) взаимодействуют между собой (нажатие кнопки меняет текст) Примеры компонентов: 20 Язык сам по себе не управляет визуальными формами операционной системы, эту задачу решают специальные фреймворки. Для Python их довольно много, несколько десятков, разной мощности и удобства: … AVC Dabo Tkinter (standart) WxPython PyQt … https://wiki.python.org/moin/GuiProgramming 21 Мы посмотрим на один из самых мощных фреймворков: PyQt. PyQt работает на всех платформах, поддерживаемых Qt: Linux и другие UNIXподобные ОС, Mac OS X и Windows. Существует 2 версии: PyQt5, поддерживающий Qt 5, и PyQt4, поддерживающий Qt 4. PyQt распространяется под лицензиями GPL (2 и 3 версии) и коммерческой. PyQt практически полностью реализует возможности Qt. А это более 600 классов, более 6000 функций и методов, включая: Существующий набор виджетов графического интерфейса; стили виджетов; доступ к базам данных с помощью SQL (ODBC, MySQL, PostgreSQL, Oracle); парсер XML; поддержку SVG; интеграцию с WebKit, движком рендеринга HTML; поддержку воспроизведения видео и аудио. 22 23 PyQt устанавливается для Windows как обычное приложение (.exe) в папку C:\Python27\Lib\site-packages\PyQt Там находятся все необходимые утилиты и вспомогательные приложения. После установки PyQt становится автоматически виден питону: import PyQt4 В Linux: sudo apt-get install python-qt4 pyqt4-dev-tools 24 Работа с подобными фрейморками часто строится на непрерывном использовании технической документации и поисковых систем, поскольку совершенно бесполезно пытаться запомнить структуру (свойства и методы) всех компонентов, синтакис конструкций реакции на действия и т.д. Попробуем посмотреть! 25 import sys from PyQt4 import QtGui app = QtGui.QApplication(sys.argv) widget = QtGui.QWidget() widget.resize(250, 150) widget.setWindowTitle('PyQt4 sample') widget.show() sys.exit(app.exec_()) 26 Мы подключаем модуль sys – для получения аргументов командной строки и модуль QtGui – для работы с виджетами. Каждое приложение написанное на PyQt4, должно создавать объект QApplication. Далее мы создаем объект приложения и в конструкторе ему передаем аргументы командной строки. Эти аргументы специфичны только для приложений написанных на PyQt4. Класс QApplication находится в модулеQtGui. Далее создаём обычный пустой виджет. QWidget – это основной GUI-класс в PyQt4. Так как мы создаем виджет без параметров(без родителя), то он не является потомком и это значит что он станет независимым окном. Задаем виджету(окну) размер 250×150, где 250 – ширина, а 150 высота. Далее мы задаём заголовок для нашего окна. Делаем виджет видимым. Последняя строка является вызовом главного цикла программы(MainLoop), т.е. с этой строки программа начнет принимать события(сигнал закрытия окна, клик мышью и т.д.). 27 Теперь попробуем добавить компоненты. Начнем с простой кнопки. Всё значительно усложняется. import sys from PyQt4 import QtGui, QtCore class WithQuitButton(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setGeometry(300, 300, 200, 100) self.setWindowTitle(self.trUtf8('Окно с кнопкой')) quit = QtGui.QPushButton(self.trUtf8('Выход!'), self) quit.setGeometry(10, 10, 60, 35) self.connect(quit, QtCore.SIGNAL('clicked()'), QtGui.qApp, QtCore.SLOT('quit()')) app = QtGui.QApplication(sys.argv) qb = WithQuitButton() qb.show() sys.exit(app.exec_()) 28 В PyQt4 все события(нажатие кнопки, ввод текста и т.д.) реализуются через концепцию сигналов и слотов, т.е. если хотите обработать клик по кнопке, то вам необходимо соединить сигнал «клик» с необходимым слотом. Слотом может являться обычная функция или встроенная функция(например выход «quit»). Соединение происходит через функцию QtCore.QObject.connect, а разъединение через QtCore.QObject.disconnect. 29 30 Для рисование интерфейсов не в коде, PyQt4 поставляется вместе с графическим редактором: QtDesigner Живет в C:\Python27\Lib\site-packages\PyQt4\designer.exe 31 Оно позволяет собирать оконные интерфейсы почти что мышкой. Задавать им свойства, наполнять чем-то и т.д. Из QtDesigner формы сохраняются в файл .ui Его нужно сконвертировать в .py с помощью специальной утилиты pyuic4.bat C:\Python27\Lib\site-packages\PyQt4\pyuic.bat Командой C:\Python27\Lib\site-packages\PyQt4\pyuic.bat interface.ui –o interface.py Затем этот interface.py можно подключать к своим сценариям. 32 Н.А. Прохоренок — PyQt. Создание оконных приложений на Python 3 33 Спасибо за внимание! e.kazakov@spbu.ru ekazakov.info/students 34