Python
.pdfРАЗДЕЛ 3 |
|
|
|
|
|
|
Определим в модуле какие-нибудь функции. |
|
|
|||||||
|
|
|
|
|
|
|
Например: |
|
|
|
|
|
|
|
||
Создание модуля |
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
def hello(): |
|
|
|
|
|
|
|
|||||
Модуль (module) - базовое понятие языка. Содержит код и |
|
|
|
|
|
|
|
|
|
|||||||
|
print('Hello, world!') |
|
|
|
|
|||||||||||
глобальные переменные. Исполняется при загрузке. |
|
|
|
|
|
|||||||||||
Модули бывают написанные на питоне (.py файлы), C |
|
|
def fib(n): |
|
|
|
|
|
|
|
||||||
Extensions (.pyd и .so файлы, поддерживающие |
|
|
|
|
|
a = b = 1 |
|
|
|
|
|
|
|
|||
определенный интерфейс) и встроенные в интерпретатор |
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
||||||
(технически выполненные как C Extensions). |
|
|
|
|
|
for i in range(n - 2): |
|
|
|
|
||||||
Создание своего модуля в Python |
|
|
|
|
|
|
a, b = b, a + b |
|
|
|
|
|
|
|||
Помните |
, |
что |
модуль |
будут |
|
импортировать |
|
|
и |
|
|
|
|
|||
использовать в качестве переменной. |
|
|
|
|
|
return b |
|
|
|
|
|
|
|
|||
|
|
|
Сохраняем. Всё - модуль создан. Вы высхитительны! |
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
||||||||
Поэтому |
|
модуль |
нельзя |
именовать |
|
также |
, |
|
как |
и |
|
|
|
|||
ключевое слово. |
|
|
|
|
|
|
2. |
Для |
|
|
подключения |
модуля |
, |
в |
||
|
|
|
|
|
|
|
программой, например в main.py, добавим инструкцию |
|
|
|||||||
Также |
|
имена |
модулей |
нельзя |
начинать |
|
с |
цифры |
. |
|
|
|||||
|
|
|
|
|
|
|
import имя_модуля: |
|
|
|
|
|
|
|||
И |
нежелательно |
называть |
модуль |
|
|
также |
, |
|
как |
какую |
- |
|
|
|||
либо из встроенных функций. |
|
|
|
|
|
import mymodule |
|
- добавляет mymodule в текущее |
|
|
||||||
|
|
|
|
пространство имен и создает объект mymodule типа |
|
|
||||||||||
1. Для создания python модуля достаточно создать .py |
module. |
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|||||||
файл в папке с программой, либо в любой из директорий |
|
3. |
После |
|
|
импорта |
, |
доступ |
|
к |
||||||
из sys.path |
|
|
|
|
|
|
модуля можно получить через его имя: |
|
|
|
||||||
Создадим |
|
для |
примера |
модуль |
my |
|
.py |
в |
|
папке |
|
с |
|
|
||
нашей программой. |
|
|
|
|
|
|
mymodule.hello() |
|
|
|
|
|
|
|||
|
|
|
|
|
|
У |
каждого |
модуля |
есть |
|
наб |
|||||
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
атрибутов: |
|
|
|
|
|
|
|
50
__name__: str - полное имя модуля. Путь от начала с точками как разделителями. Например, 'xml.dom' или
'xml.dom.minidom'
__doc__: str - описание (так называемый docstring)
__file__: str - полный путь к файлу, из которого модуль был создан (загружен).
__cached__: str - [3.2+] нововведение, появившееся в
Python 3.2. Путь к .pyc файлу.
__package__: str - [2.5+] имя пакета, в котором лежит модуль (пустая строка для модулей верхнего уровня). Появился для поддержки относительного импорта from . import a.
__loader__: Loader - [2.3+] ссылка на объект,
который выполнял загрузку данного модуля. Присутствует только для тех модулей, которые были обработаны через механизм расширения импорта.
Использование модуля как самостоятельную программу
Для |
использования |
модуля |
как |
программы следует добавить в него(обычно в конец |
|
||
модуля) следующий код: |
|
|
if __name__ == "__main__":
someFunction()
переменная __name__ - всегда равна "__main__", если модуль запущен как отдельная программа:
python mymodule.py
самостоятельной
51
РАЗДЕЛ 4
Импортирование пакетов модулей
Пакеты — способ организации иерархии множества модулей Python за счёт использования имён модулей и имён каталогов разделённых точками.
К примеру, вы собираетесь разработать набор модулей для работы со звуковыми файлами. Вам может понадобиться создать пакет модулей для конвертирования звуковых данных в различные форматы файлов. Также у вас будут операции для обработки звуковых данных и модули для исполнения этих операций. Представим возможную структуру пакета:
sound/ |
- пакет верхнего уровня |
__init__.py |
- инициализация пакета работы со |
звуком (sound) |
|
formats/ |
- подпакет для конвертирования |
форматов файлов |
|
__init__.py |
|
wavread.py |
- модуль чтения wav |
wavwrite.py |
- модуль записи wav |
aiffread.py |
- модуль чтения aiff |
aiffwrite.py |
- модуль записи aiff |
auread.py |
- модуль чтения au |
auwrite.py |
- модуль записи au |
... |
|
effects/ |
- подпакет для звуковых эффектов |
__init__.py |
|
echo.py |
- модуль добавления эха |
surround.py |
- модуль добавления объёмного |
звука |
|
reverse.py |
- модуль обращения записи в |
обратную сторону |
|
... |
- подпакет для фильтров |
filters/ |
|
__init__.py |
|
equalizer.py |
- модуль включения эквалайзера |
karaoke.py |
- модуль включения режима |
караоке |
|
...
Можно явно импортировать из пакета определённые модули, например:
import sound.effects.echo |
#подгружается модуль |
|
sound.effects.echo sound.effects.echo.echofilter() |
||
#вызываем его, используя его полное имя |
||
Другой способ импортирования подмодуля: |
||
from sound.effects import echo |
#подгружается модуль |
|
echo из каталога sound.effects |
|
|
echo.echofilter() |
#теперь он доступен без |
|
префикса пакета |
|
|
52
Также мы можем явно импортировать желаемую |
|
|
|
|||
функцию или переменную: |
|
|
|
|
|
|
from sound.effects.echo import echofilter |
|
#подгружается |
|
|
|
|
модуль echo |
|
|
|
|
|
|
|
# |
и |
мы |
вызываем |
из |
него |
функцию echofilter |
|
|
|
|
|
|
echofilter() |
#можно вызывать |
|
|
|
||
функцию непосредственно |
|
|
|
|
|
|
|
|
|
|
|
|
|
53
ГЛАВА 5
Написание графического интерфейса, используя библеотеку Tkiner
Tkinter – это кроссплатформенная библиотека для разработки графического интерфейса на языке Python (начиная с Python 3.0 переименована в tkinter). Tkinter
расшифровывается как Tk interface. Tkinter входит в стандартный дистрибутив Python.
Начало работы
Чтобы убедиться, что Tkinter установлен и работает, воспользуемся стандартной функцией Tkinter _test(): import tkinter
Tkinter._test()
После выполнения данного кода должно появиться окно с данными о версии библиотеки и кнопкой выхода. Примеры простой программы
Hello world
Первым делом нам нужно создать главное окно, написав: from tkinter import *
root = Tk()
Теперь создадим кнопку, при нажатии на которую будет выводиться текст в консоль:
def Hello(event): # функция вывода нашего приветствия
print "Yet another hello world"
btn = Button(root, |
#родительское окно |
|
text="Click me", |
#надпись на кнопке |
|
width=30,height=5, #ширина и высота |
||
bg="white",fg="black") |
#цвет фона и надписи |
|
btn.bind("<Button-1>", Hello) |
#при нажатии ЛКМ на |
|
кнопку вызывается функция Hello |
||
btn.pack() |
#расположить кнопку на главном |
|
окне |
|
|
root.mainloop() |
#запускаем цикл обработки |
|
событий |
|
|
В целом, всё выглядит предельно простым. Создаём экземпляр класса Button, указываем родителя и при желании список параметров. Есть еще немало параметров, таких как шрифт, толщина рамки и т.д. Затем привязываем к нажатию на кнопку событие (можно привязать несколько разных событий в зависимости, например, от того, какой кнопкой мыши был нажат наш btn).
mainloop() запускает цикл обработки событий; пока мы не вызовем эту функцию, наше окно не будет реагировать на внешние раздражители.
Упаковщики Упаковщики отвечают за то, как виджеты будут
располагаться на главном окне.Всего упаковщиков три: pack()
Автоматически размещает виджеты в родительском окне. Для каждого виджета нужно вызвать метод упаковщика, иначе он не будет отображён. Имеет параметры side, fill, expand.
Пример:
from tkinter import * root = Tk()
Button(root, text = '1').pack(side = 'left') Button(root, text = '2').pack(side = 'top') Button(root, text = '3').pack(side = 'right') Button(root, text = '4').pack(side = 'bottom') Button(root, text = '5').pack(fill = 'both') root.mainloop()
grid()
Размещает виджеты на сетке. Основные параметры: row/column – строка/столбец в сетке, rowspan/columnspan
– сколько строк/столбцов занимает виджет. Пример:
from tkinter import * root = Tk()
Button(root, text = '1').grid(row = 1, column = 1) Button(root, text = '2').grid(row = 1, column = 2) Button(root, text = '__3__').grid(row = 2, column = 1, columnspan = 2)
root.mainloop()
place()
Позволяет размещать виджеты в указанных координатах с указанными размерами.
Основные параметры: x, y, width, height. Пример:
from tkinter import * root = Tk()
Button(root, text = '1').place(x = 10, y = 10, width = 30) Button(root, text = '2').place(x = 45, y = 20, height = 15) Button(root, text = '__3__').place(x = 20, y = 40) root.mainloop()
55
ГЛАВА 6
Сборка приложения на Python с помошью cx_Freeze
Не всегда удобно хранить написанную нами программу в виде .py файла. В этом случае мы лишаемся возможности ее запуска на машинах, на которых не установлен интерпретатор. Исправить данный недостаток можно собрав нашу программу в .exe или .msi файл (для Windows). Есть несколько этапов сборки и ряд ошибок, которые могут возникнуть. Разберем все сначала.Итак, первое, что нам нужно - это установленная утилита cx_Freeze. После установки в каталоге python33 (в зависимости от расположения вашего интерпретатора) появится папка Scripts, в которой уже должны быть кое-какие файлы. Давайте создадим в этом каталоге папку dist (так уж принято её называть) и закинем в неё скрипт, который хотим скомпилировать.
Теперь опишем такой файл-инициализатор:
Может Вы ещё не поняли, я поясню: файл, который будет компилировать Python-скрипты, сам является таковым. Сохраняем этот файл под именем setup.py в том же каталоге, что и скрипт, который хотим скомпилировать(где-то в области xxx\python33\Scripts\dist).
Так, теперь, примера ради(и чтобы сразу закрыть тему переноса Python GUI в плоскость .exe), напишем такой скрипт:
Будем считать, что скомпилировать Мы хотим именно этот скрипт. Начинать-то нужно с малого. Сохраним его под именем script.py. Это же имя Вы можете увидеть в последней строке файла setup.py, под атрибутом script. Конечно, Вы не могли не заметить импортирования модуля re. Дело в том, что ни один скомпилированный
.exe-файл не будет работать, если в нём не импортируется re. Запомните это! Хотя, если забудете, неработающий .exe выдаст ошибку, Traceback которой напомнит Вам, что к чему.
Теперь внимательно! Поднимаемся на один каталог вверх.
Если компилируемый и компилирующий файлы находятся в каталоге dist, то после подъёма Вы должны увидеть папку c именем dist. Кликаем на неё правой кнопкой мыши и нажимаем "Командная строка". В появившейся консоли пишем следующую команду:
И нажимаем клавишу Enter. По консоли должны побежать надписи. Как только они остановятся и Вы увидите курсор для ввода, можете закрыть консоль, зайти в каталог dist/build/exe.win32-#.# и отыскать свой .exe
файл. Вот и всё!
Сборка установочного файла:
Для удобства передачи скомпилированного приложения, его можно положить в .msi файл. Это стандартный установочный файл Windows, который при запуске предложит пользователю выбрать каталог установки и распакует туда все данные. Сделать .msi-файл можно, запустив в консоли команду:
Так же, как build. Собранный файл можно найти в каталоге dist, который появится в первом dist, то есть python33/Script/dist/dist.
Обратите внимание:
Возможно ваша программа состоит из нескольктх сопутствующих файлов, которых будет достаточно много. Могу сказать только одно: не трогайте их! cx_Freeze в эти самые файлы зашивает интерпретатор Python и все нужные для выполнения скрипта модули, так что изменять их или удалять - это плохая идея. В принципе, существует метод заливания всего этого добра в один самораспаковывающийся архив. Делается это с помощью стандартной утилиты Windows (по крайней мере, в XP она точно есть), однако этот метод имеет большое количество недостатков и его использование не желательно. Более того, разработчики утверждают, что сшивать всё в один файл нежелательно, потому что сжимающие утилиты используют не совсем корректный подход к проблеме, изза чего антивирусы могут распознать в Вашем файле угрозу.
А так же не забывайте о таком замечательном предмете, как ярлыки. Они помогут Вам и Вашим пользователям запускать скомпилированный скрипт прямо с рабочего стола, без долгого поиска .exe среди множества других файлов. (Создавать ярлыки, я думаю, все умеют).
В принципе, если Вы допустите какую-нибудь ошибку при компилировании скрипта, Вы увидите соответствующий Traceback при запуске .exe, но есть некоторые проблемы, которые могут возникнуть и на которые нужно обратить внимание.
57
Слёт кодировки:
Во-первых, при компилировании скриптов очень часто возникают проблемы с символьными данными, в частности, все русские буквы превращаются в, так называемые, кракозябры. Дабы зафиксировать этот баг, в начале каждого компилируемого скрипта прописывайте две команды:
Это нужно для того, чтобы заранее исключить проблемы с кодировкой исходного кода.
Потеря вложенных модулей:
Иногда получается, что при компилировании теряются вложенные модули, те самые, к которым нужно обращаться через точку. Проблема эта решается очень просто, нужно всего лишь импортировать каждый из вложенных модулей по отдельности, например:
Дело в том, что, работая в IDLE, Мы можем написать чтото, вроде:
Всё пройдёт, как надо. Однако при работе с cx_Freeze такой номер не всегда это сработает в приложении, так что приучайтесь отдельно импортировать каждый из вложенных пакетов. В случае пропуска одного из них Ваш
.exe выдаст ошибку пользователю, как только тот обратится к функции\классу из потерянного модуля.
Пронос файлов:
Если в Вашем приложении предусмотрено взаимодействие с графическим интерфейсом, а оно, скорее всего, так и есть, Вам может понадобиться несколько картинок или, к примеру, звуковых файлов. Вам нужно просто взять эти файлы и скопировать в папку с уже скомпилированным файлом .exe. Например, в программе встречается такая строка:
В таком случае, компилируем файл, открываем каталог, в котором он находится, создаем папку icons и добавляем туда файл pa.gif. Этого будет достаточно.
58
Иконка для .exe:
Это достаточно интересная и очень простая часть. Для того, чтобы прицепить к своему .exe-файлу иконку, в конце файла setup.py нужно прописать соответствующую команду:
Основным здесь является, естественно, параметр icon, обращаться с которым не так уж трудно.
Отсутствующие dll:
Это ещё одна возможная проблема. Бывает, при запуске пользователь получает окно с надписью: "MSVCR100.dll отсутствует, попробуйте переустановить программу." или что-то в этом роде. Чтобы решить эту проблему, клиенту нужно установить MS Visual Studio, обычно 2010. Однако разумнее поставлять установочный файл данной утилиты в одной упаковке со своим приложением.
59