Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Python

.pdf
Скачиваний:
63
Добавлен:
22.03.2016
Размер:
1.59 Mб
Скачать

РАЗДЕЛ 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]