Здесь я напишу о создании виджетов и о том что это вообще такое. Во первых сразу скажу что это не для всех смартов. Точно работает на n95, n95-2, [...] читать полностью
Программирование для смартфонов » страница 6
категории RSS
Для начала вот из свеженького - накопал сегодня в инете новый англоязычный ресурс для питонопрогеров, особенно начинающих - тут. Хотя, конечно, не стоит забывать об ОЧЕНЬ полезном ресурсе здесь . Как-никак книга о мобильном питоне есть, пусть на английском. И если книга недоступна (желающие скинуться на книгу 40 евро пишите в личку), то все исходники примеров там лежат. От операций с файлами и блютусом, до камеры и веб-клиентов.
Во-вторых для н70 и не только. Замечали жалобы или пропадания индикаторов и антенны на этом телефоне? Ааа.. то-то. Программы надо писать *хорошо* =)
Решение проблемы такое. Можно использовать мой template здесь . Запуск скриптов из-под консоли питона или из-под обособленного приложения отличается, что в данном шаблоне и предусмотрено. И не надо никаких бесконечных циклов при старте. Даже если надо использовать графику, есть соответствующий метод при создании объекта Canvas, но об этом читаем у Газетдинова Альберта в его статьях здесь
Второе решение. Использовать для основной функции e32.ao_sleep(0, func), где func - это и есть ваша функция с бесконечным циклом. Но так делать нехорошо =) Хотя порой и просто позволяет решить проблему, особенно если жалобы идут, а у вас не н70.
Третье решение. А что делать, когда циклы нужны? например в NAP (плейер аудиокниг) используется рисование секунд и минут прослушивания. Тогда вспоминаем о e32.Ao_timer(). Таймер позволяет вызывать через нужный период времени нужную функцию. И еще его перед выходом можно легко остановить (то есть цикл ожидания очередного вызова не блокирует работу всей программы).
Думаю, для тех, кому грызть гранит привычно, приведенной инфы достаточно. Напомню, документация по родным симбовым модулям лежит рядом с самим питоном в архиве файлов для ветеранских осей.
Надеюсь, программисты знают программиста jbak. И его замечательную программу (среди прочих замечательных) jbak tools. И знаете про мультибуфер в ней. Тогда загляните вот сюда , какие вкусности от нашего участника lyucifeer уже сто лет лежат в обменнике.
Вроде все, что хотел сегодня сказать =) Успехов, полуночники! DimonVideo
Всем привет снова =) Моя вторая статья по питону. Вернее даже просто солянка некоторых вещей. Для начала вот из свеженького - накопал сегодня [...] читать полностью
4000
Эту статью я написал для новичков, которым сам недавно был и наверное до сих пор являюсь.
В процессе моего обучения языку программирования Python подошел такой момент, когда основы я уже знал(достаточно для написания первой программы),
но вот как из этих самых основ слепить что-то похожее на программу даже не представлял. Нужна была практика.
Сейчас я уже более менее знаю как это делается, и решил поделиться с начинающими, так как я с этой проблемой потратил много времени.
В этой статье я расскажу принцип написания наверное самых популярных программ среди начинающих. Такими являются калькулятор и аудиоплеер.
В прикрепленных файлах примеры.
Итак, начнем наверное с калькулятора.
Сразу появляется вопрс \"какие модули надо импортировать\". Самый необходимый модуль, нужный в любой программе(пракрически) это appuifw .
Его нужно импортировать в любом случае. Больше пока никакие модули не нужны.
Итак калькулятор: он должен иметь четыре функции, это плюс, минус, умножить, разделить.
Сначала пишем функцию, которая запрашивает у пользователя два числа(в этом поможет модуль appuifw и его функция query), а потом слаживает их и печатает на экран результат.
Чтоб печатать результат на экран, нам понадобитьса этот самый экран. В этом нам тоже помжет модуль appuifw (appuifw.app.body и т.д.)
И так, у нас есть функция, которая спрашивает два числа, слаживает их и выводит на экран. Теперь нам маверное нужно меню, в котором пользователь будет выбирать нужное ему действие.
Создаем меню. В этом нам снова поможет модуль appuifw. Пример создания меню можете посмотреть в любой программе на Python.
Ну что, нужно посмотреть результат того, что Вы написали. Для того, чтоб программа не отработала за одну сикунду(мы ведь не успеем нечего увидеть),
я обычно делал паузу в программе(в конце всего кода) на определённое время, для этого нужен модуль e32 он имеет функцию-паузу(e32.ao_sleep(2)).
Хорошо, а теперь запускаем и смотрим результат, предварительно устраняя ошибки.
Но ведь калькулятор должен уметь не только складывать числа, но и остальные действия тоже...
Для этого пошем еще три функции(минус, умножить, разделить) и добавляем их в меню. Функции пишем по тому же принципу, берем от пользователя два числа
выполняем с ними необходимые действия и выводим их на Экран. Перед выводом нам нужно очистить экран от предидущего результата. Делаем функцию очистки.
Добавляем эти функции в меню. Проверяем работу программы, попутно устраняя возникающие ошибки.
Теперь подумаем, вспомним математику..делить на ноль нельзя..но ведь пользователь легко может ввести ноль..для этого делаем проверку введённого числа,
и если это ноль, сообщаем неграмотному пользователю что делить на ноль нельзя.
Теперь запускаем программу, проверяем ее на различные баги и исправляем возникшие.
Программа в принципе готова, теперь осталось сделать так, чтоб пользователь знал автора программы. добавляем соответствующий пункт в меню.
Поздоровляю, Ваша первая программа готова!!!
Теперь поговорим о аудиоплеере.
Эта программа будет сложнее, но невозможного не существует!
Итак, со звуками у нас(в Python\"е) работает модуль audio .
Значит кроме модуля appuifw нам точно понадобиться еще и модуль audio. Импортируем их оба.
Так как это Ваша первая прогркмма, плеер будет проигрывать одну песню, допустим по адресу \"C:/sound.wav\"
Сначала пишем функцию, которая открывает эту мелодию и включает ее. Потом я думаю пользователь может захотеть остановить воспроизведение раньше, чем песня закончиться..
Пишем функцию для остановки...думаю пауза тоже не помешает..
;)
Чтоб плеер был совсем продвинутый, можно еще добавить регулеровку звука(в примере не реализовано).
Еще советую добавить проверку файла, вдруг он потеряется, чтоб программа в этом случае не зависла, а сообщила пользователю об отсутствии файла.
Значит процесс написания программы начинается с:
1. Четко определяемся что программа должна уметь делать в общем.
2. Определяем главную функцию программы(например плеер воспроизводить песню).
3. Пишем главную функцию программы(можно это представлять, если позволяет фантазия).
4. Обращиваем функцию дополнительными участками кода(например проверка наличия файла в плеере или проверка деления на ноль в калькуляторе).
5. Добавляем к основной функции дополнительные, для удобства и функциональности(функция \"стоп\" в плеере, регулеровка звука..).
6. Проверяем программу на ошибки и предотвращаем их появление.
Вот в принципе и все. Удачных Вам программ и большой их популярности.
С уважением liosha.
(wap.liosha.wen.ru)Прикрепленный файл: 1859_calk.zip (1.70 кб)Прикрепленный файл: 1859_pleer.zip (1.45 кб)Прикрепленный файл: 1859_statya.zip (2.74 кб) liosha2007
Всем привет. Эту статью я написал для новичков, которым сам недавно был и наверное до сих пор являюсь. В процессе моего обучения языку программирования [...] читать полностью
5932
Python на Symbian S60: математические функции и работа со временем пример PyMath.py
Модуль math
Модуль math предоставляет доступ к стандартным математическим функциям:
cos(x)
Возвращает косинус числа x.
sin(x)
Возвращает синус числа x.
tan(x)
Возвращает тангенс числа x.
acos(x)
Возвращает арккосинус числа x.
asin(x)
Возвращает арксинус числа x.
atan(x)
Возвращает арктангенс числа x.
atan2(x, y)
Эквивалентно atan(x/y). Аргумент y может быть равен нулю - в этом случае возвращается pi/2.
cosh(x)
Возвращает гиперболический косинус числа x.
sinh(x)
Возвращает гиперболический синус числа x.
tanh(x)
Возвращает гиперболический тангенс числа x.
log(x)
Возвращает натуральный логарифм числа x.
log10(x)
Возвращает десятичный логарифм числа x.
sqrt(x)
Возвращает квадратный корень из числа x.
pow(x, y)
Ввенное число с нулевой дробной частью -большее, чем число x.
floor(x)
Возвращает наибольшее вещественное число с нулевой дробной частью -меньшее, чем число x.
fabs(x)
Возвращает абсолютное значение числа x.
fmod(x, y)
Возвращает остаток от деления x на y и эквивалентно x%y.
exp(x)
Возвращает e**x.
frexp(x)
Возвращает пару чисел в виде кортежа (m, e), где m - мантисса (вещественное число), а e - экспоненциальная часть (целое число). Для чисел m и e всегда выполняется условие x=m*2**e. Если аргумент x равен нулю, возвращает (0.0, 0). В противном случае всегда выполняется 0.5 time.altzone
-10800
>>>
clock()
Функция возвращает текущее процессорное время от начала включения смартфона. Может быть использовано для замера производительности.
sleep(secs)
Останавливает выполнение программы на secs секунд.
time()
Возвращает время с начала эпохи по Гринвичу.
>>> time.time()
1186563710.0
>>>
ctime()
Возвращает местное время с начала эпохи.
>>> time.time()
1186574510.0
>>>
gmtime(secs)
Преобразует время secs (выражено в секундах) в кортеж, представляющее время по Гринвичу. Этот кортеж состоит из 9 целых чисел:
1) год (1970-2038);
2) месяц (1-12);
3) день (1-31);
4) час (0-23);
5) минута (0-59);
6) секунда (0-61);
7) день недели (0-6, 0 - это понедельник);
8) число дней от начала года (0-366);
9) флаг коррекции летнего времени (0, 1, -1).
>>> time.localtime(1186563710.0)
(2007, 8, 8, 6, 1, 50, 2, 220, -1)
>>>
localtime(secs)
Преобразует время secs (выражено в секундах) в кортеж, представляющий местное время.
>>> time.localtime(1186563710.0)
(2007, 8, 8, 9, 1, 50, 2, 220, -1)
>>>
mktime(time_tuple)
Преобразует кортеж time_tuple во время в секундах.
>>> time.localtime((2007, 8, 8, 6, 1, 50, 2, 220, -1))
1186563710.0
>>>
asctime(time_tuple)
Преобразует кортеж time_tuple в строку.
>>> time.asctime((2007, 8, 8, 6, 1, 50, 2, 220, -1))
\'Tue Aug 08 06:01:50 2007\'
>>>
strftime(format, time_tuple)
Преобразует кортеж time_tuple в соответствии с форматом format в строку. Format представляет из себя строку, содержащую следующие управляющие символы:
1) %a - сокращенное название дня недели;
2) %A - полное название дня недели;
3) %b - сокращенно название месяца;
4) %B - полное название месяца;
5) %c - дата и время;
6) %d - десятичное представление даты (\'01\'- \'31\');
7) %H - десятичное представление часа (\'00\'-\'23\');
8) %I - десятичное представление часа (\'01\'-\'12\');
9) %j - десятичное представление года (\'001\'-\'366\');
10) %m - десятичное представление месяца (\'01\'-\'12\');
11) %M - десятичное представление минут (\'01\'-\'59\');
12) %p - обозначение \'AM\' (до полудня) или \'PM\' (после полудня);
13) %S - десятичное представление секунд (\'00\'-\'61\');
14) %U - десятичное представление порядкового номера недели (\'00\'-\'53\');
15) %w - десятичное представление дня недели (\'0\'- \'6\');
16) %W - десятичное представление порядкового номера недели (\'00\'-\'53\');
17) %x - дата;
18) %X - время;
19) %y - представление года без указания века (\'00\'- \'99\');
20) %Y - полное десятичное представление года;
21) %Z - название часового пояса;
22) %% - символ \'%\'.
>>> time.strftime(\'%a %b %d %H:%M:%S %Y\', (2007, 8, 8, 6, 1, 50, 2, 220, -1))
\'Tue Aug 08 06:01:50 2007\'
>>>
strptime(string, format)
Разбирает строку string в соответствии с форматом format (смотри выше) и возвращает кортеж.
>>> time.strptime(\'Tue Aug 08 06:01:50 2007\', \'%a %b % d %H:%M:%S %Y\')
(2007, 8, 8, 6, 1, 50, 2, 220, -1)
>>>
Вместе со статьей идет пример PyMath.py, который дает возможность осуществить все возможные математические действия над числами, получить случайные числа, показать время в различной форме. Теперь подробнее.
PyMath.py
В начале программы, как всегда, подключаем необходимые модули:
import e32,appuifw,math,random,operator,time
Новый модуль operator включает арифметические функции, аналогичные обычным операторам. Т.е. операцию сложения - «1 2» - можно написать как operator.add(1, 2). Зачем это нужно? Читайте дальше.
Описание меню:
appuifw.app.menu =
Меню получилось невероятно функциональным за счет использования lambda и стандартизации вызова различных функций, подробнее - ниже.
Участок кода для определения источника запуска программы стандартен, поэтому рассмотрю остальные функции программы.
def out(argument):
appuifw.query(u\'Ответ:\', \'text\', unicode(argument)).
Функция для вывода информации пользователю:
def one(function):
argument=appuifw.query(u\'Введите аргумент функции:\', \'float\')
if argument:
try:
result=function(argument)
except:
appuifw.note(u\'Плохой аргумент.\', \'error\')
else:
out(result)
Функция для обработки одноаргументных функций (с помощью lambda передается имя функции, имеющей один аргумент):
1) запрос у пользователя аргумента функции;
2) если аргумент введен, то вычисляем результат функции;
3) если произошла ошибка, информируем пользователя об этом;
4) иначе выводим результат на экран.
Таким образом, вместо определения 12 функций для сложения, вычитания, умножения, деления, получения квадратного корня, логарифмов и тригонометрических функций, прямо из меню вызываем one() с именем нужной нам функции. Колоссальная оптимизация!
def two(function):
try:
argument1, argument2=appuifw.multi_query(u\'Первый аргумент:\', u\'Второй аргумент:\')
except:
pass
else:
try:
result=function(float(argument1), float(argument2))
except:
appuifw.note(u\'Плохие аргументы.\', \'error\')
else:
out(result)
Аналог one(), только для двухаргументных функций:
1) получаем от пользователя аргументы функций;
2) если они не введены, то пропускаем все;
3) иначе - вычисляем результат вычисления функции с двумя аргументами;
4) если произошла ошибка -информируем пользователя;
5) иначе выводим результат.
С помощью two() сократили огромное количество кода! Раздувание меню оправдано, когда на другой чаше весов находится необходимость написать несколько десятков однотипных функций. Вероятно, вы так и сделали бы, но lambda идет на помощь!
Вдруг кому-то непонятны lambda функции для работы с модулем time, поэтому я расшифрую одну из них в многострочный код.
Дано:
out(time.strftime(\'%H:%M:%S\',time.gmtime( time.clock ()))).
Подробно:
1) time.clock - получаем время по Гринвичу в секундах;
2) time.gmtime - преобразуем время в секундах в кортеж чисел с информацией о времени;
3) time.strftime - преобразуем кортеж чисел в строку в соответствии с шаблоном;
4) out - выводим строку.
Остальные lambda функции работают по аналогии.
Таким образом, был показан прекрасный пример оптимизации. Использование lambda в меню дает возможность написать одну функцию вместо нескольких похожих. Конечно, это не единственная сфера применения - используйте lambda там, где это необходимо. Возможно, из-за нее придется перегруживать строки кодом (как в нижней части меню примера), тогда будет легче расшифровать код и вынести его в отдельную функцию. Какой подход вы выберите, напрямую зависит от вашего опыта и профессионализма. И не забывайте -все хорошо в меру!
Комментируем! DimonVideo
Автор: Газетдинов Альберт Python на Symbian S60: математические функции и работа со временем пример PyMath.py Модуль math Модуль math предоставляет доступ [...] читать полностью
4614
Ho вeдь, пpи выбope *.py фaйлa зaпycкaeтcя ycтaнoвщик и пepeдaeт пapaмeтp cкpиптy default.py. Этo кaк paз тo, чтo нyжнo. Пoxoжe, этa вoзмoжнocть былa coзнaтeльнo иcключeнa Nokia. Bce нижeнaпиcaнoe пpoвepeнo тoлькo для 7 ocи. И в oбщeм-тo, тoлькo для тeлeфoнa Nokia 3230 :) Koпиpyeм фaйл e:/system/apps/appmgr/appmgr.app в e:/system/apps/appmgr/py_app_template.tmp, пocлe чeгo ocтaлocь измeнить любым peдaктopoм знaчeниe cмeщeния UID в фaйлe e:/system/apps/appmgr/uid_offset_in_app. Meняeм cтapoe знaчeниe нa \'0x460\'.
Haдeюcь, чтo ничeгo нe зaбыл. Cкpипты, ycтaнoвлeныe мoдифициpoвaным appmgr мoгyт пpинимaть пapaмeтpы. He зaбyдьтe нaзнaчить accoциaцию. :) Ha caмoм дeлe, я нe измeнял cтaндapтный ycтaнoвщик, a cдeлaл нoвый. Coвeтyю нa вcякий cлyчaй cдeлaть пoлный backup. Yдaчи. MACTEP3230 MACTEP3230
Haвepнoe, мнoгиe Python-пpoгpaммиcты пытaлиcь coздaть пpoгpaммy типa пpocмoтpщика фaйлoв. Пpи этoм cyщecтвyeт oднa пpoблeмa. Cтaндapтный ycтaнoвщик cкpиптoв нe пoзвoляeт [...] читать полностью
3525
Python на Symbian S60: работа с файлами (модуль os и path) пример FileMan.py
Модуль os
Модуль os позволяет работать с файлами и папками. Сразу отмечу, русские названия файлов и папок возвращаются и принимаются всеми функциями этого модуля в кодировке UTF-8, поэтому необходимо использовать функции для перекодирования строк - методы decode и encode.
listdir(path)
Возвращает список имен файлов и папок в папке с именем path.
mkdir(path)
Создает папку с именем path.
makedirs(path)
Работает аналогично функции mkdir(), но автоматически создает все необходимые промежуточные папки.
remove(path)
Удаляет файл с именем path.
rmdir(path)
Удаляет каталог с именем path.
removedirs(path)
Работает аналогично функции rkdir(), но автоматически удаляет все родительские пустые папки.
rename(, dst)
Переименовывает файл или папку с именем в dst.
Модуль path
Модуль path встроен в модуль os и позволяет работать с путями к файлам и папкам.
split(path)
Возвращает кортеж из пары строк -(head, tail). Где: tail - последний компонент пути (имя папки или файла), head - остальная часть пути:
>>> os.path.split (\'c:\\\\system\\\\apps\\\\Python\\\\Python.app\')
(\'c:\\\\system\\\\apps\\\\Python\\\\\', \'Python.app\')
>>>
splitdrive(path)
Возвращает кортеж из пары строк -(drive, tail). Где: drive - имя диска, head -остальная часть пути:
>>> os.path.splitdrive (\'c:\\\\system\\\\apps\\\\Python\\\\Python.app\')
(\'c:\\\\\', \'system\\\\apps\\\\Python\\\\Python.app\')
>>>
splitext(path)
Возвращает кортеж из пары строк -(root, ext). Где: ext - расширение файла, head - остальная часть пути:
>>> os.path.splitext (\'c:\\\\system\\\\apps\\\\Python\\\\Python.app\')
(\'c:\\\\system\\\\apps\\\\Python\\\\Python\', \'.app\')
>>>
dirname(path)
Возвращает имя каталога пути path. Это первый элемент пары split(path):
>>> os.path.dirname (\'c:\\\\system\\\\apps\\\\Python\\\\Python.app\')
\'c:\\\\system\\\\apps\\\\Python\'
>>>
basename(path)
Возвращает основное имя пути path. Это второй элемент пары split(path):
>>> os.path.basename (\'c:\\\\system\\\\apps\\\\Python\\\\Python.app\')
\'Python.app\'
>>>
join(path1, path2,...)
Объединяет пути path:
>>> os.path.join(\'c:\\\\\', \'system\\\\apps\\\\Python\\\\\', \'Python.app\')
\'c:\\\\system\\\\apps\\\\Python\\\\Python.app\'
>>>
exists(path)
Возвращает 1, если файл или каталог с именем path существует.
isfile(path)
Возвращает 1, если path указывает на файл.
isdir(path)
Возвращает 1, если path указывает на папку.
getatime(path)
Возвращает время последнего доступа к файлу или папке с именем path.
getmtime(path)
Возвращает время последнего внесения изменения в файл или папку с именем path.
getsize(path)
Возвращает размер файла или папки с именем path.
Работа с файлами
Python обладает встроенными возможностями для открытия файлов, чтения их содержимого или записи в них различных данных.
open(filename, mode)
Возвращает объект-файл с именем filename. Характер работы определяет аргумент mode (по умолчанию \'r\'):
1) \'r\' - файл открывается для чтения данных;
2) \'w\' - для записи данных;
3) \'a\' - для дописывания данных.
Данный объект имеет следующие методы:
read(size)
Считывает из файла данные размером size и возвращает в виде строки. Если аргумент опущен, то считывается все содержимое файла.
readline()
Считывает из файла одну строку, включая символ перехода на новую строку («\\n»).
readlines()
Считывает из файла все строки и возвращает их в виде списка.
write(string)
Записывает строку string в файл.
writelines(lines)
Записывает строки из списка lines в файл. Символ перехода на новую строку между ними не добавляется.
tell()
Возвращает текущее положение в файле в байтах от начала файла.
seek(offset, whence)
Изменяет положение на offset. Характер определения положения зависит от аргумента whence (по умолчанию 0):
1) 0 - новое положение отсчитывается от начала файла;
2) 1 - от конца файла;
3) 2 - от текущего положения в файле;
truncate(size)
Усекает файл до размера size.
close()
Закрытие файла. Запомните! Любое открытие файла должно сопровождаться последующим закрытием с помощью этого метода.
На этом все. Ниже будет дано описание программы FileMan.py, которая предоставляет основные возможности любого файл-менеджера: навигация по дискам и папкам, удаление и открытие файлов.
FileMan.py
Программа начинается с подключения нужных модулей:
import os,e32,appuifw,key_codes
И создания нужных переменных:
list=e32.drive_list()
path=
В list будет храниться тот список имен файлов и папок, который передается объекту Listbox для отображения. path хранит список строк, который показывает путь к тому месту в файловой системе, где мы находимся. Т.е. если мы будем находиться в папке \'c:\\\\system\\\\apps\\\\\', выглядеть path будет следующим образом:
Заканчивается программа строками для создания объекта Listbox (при этом ему передается начальный список имен дисков и указывается, чтобы при нажатии на джойстик вызывалась функция select). Также привязывается к нажатию на «C» вызов функции delete:
appuifw.app.body=listbox=appuifw.Listbox(list, select)
listbox.bind(key_codes.EKeyBackspace, delete)
Также создим меню с единственной функцией для выхода из программы и опишем код для определения источника запуска программы (все стандартно).
Опишу функции основной части программы:
def create():
global list,path
if len(path)==0:
list=e32.drive_list()
else:
full_path=\'\\\\\'.join(path)
dirs,files=,
for name in os.listdir(full_path):
if os.path.isdir(full_path \'\\\\\' name):
dirs.append(name.decode(\'utf-8\'))
else:
files.append(name.decode(\'utf-8\'))
dirs.sort()
files.sort()
list= dirs files
listbox.set_list(list)
Функция для создания списка имен папок и файлов в новой папке (в ту, которую мы зашли) и его отображении на объекте Listbox:
1) подключаем глобальные переменные;
2) если путь к файлу по длине равен нулю, то отображаем список дисков;
3) иначе мы получаем путь к новой папке с помощью метода строк для объединения элементов списка;
4) создаем два пустых списка для хранения имен файлов и папок соответственно;
5) создаем цикл для перебора имен всех файлов и папок, находящихся в новой папке;
6) если путь указывает к папке, то добавляем его имя в список для папок, по пути перекодируя его.
7) иначе это путь к файлу, поэтому его имя добавляется в другой список.
8) сортируем оба списка по алфавиту;
9) создаем список для вывода, как сумма элемента обозначающего кнопку назад («<< DimonVideo
Автор: Газетдинов Альберт Python на Symbian S60: работа с файлами (модуль os и path) пример FileMan.py Модуль os Модуль os позволяет работать с файлами [...] читать полностью
6879
Python на Symbian S60: словари и объект Form, вкладки пример FormBox.py
Объект Form - это диалоговое окно, элементы которого можно редактировать по своему усмотрению. Используется форма для вывода информации (свойств файла, например) и настройки программы. Каждый элемент формы состоит из названия и поля с данными (число, текст и т.д.).
Создание объекта
Form создается как обычный объект, при этом ему передаются аргументы, которые отвечают за его содержимое и вид:
>>> import appuifw
>>> form = appuifw.Form(fields )
>>>
Аргумент fields должен представлять список кортежей, каждый из которых отвечает за один элемент формы -),...]. Где:
1) label - название элемента (строка);
2) type - тип поля элемента (строка, варианты будет даны чуть ниже);
3) value - значение элемента по умолчанию (не обязателен).
Существуют следующие типы полей элементов формы:
1) «text» - текст;
2) «number» - целое число;
3) «float» - вещественное число;
4) «date» - дата;
5) «time» - время;
6) «combo» - список.
Аргумент flags (он необязательный) настраивает вид элементов формы и может принимать следующие значения:
FFormViewModeOnly
Устанавливает, что поля элементов формы доступны только для просмотра (их редактирование не допускается).
FFormEditModeOnly
Устанавливает, что поля элементов формы доступны и для редактирования.
FFormAutoLabelEdit
Разрешает возможность редактирования не только полей элементов, но и их названий.
FFormAutoFormEdit
Разрешает динамически изменять содержимое формы (т.е. удалять и добавлять элементы прямо по ходу работы).
FFormDoubleSpaced
Указывает представить элементы в двухстрочном виде: на первой строке расположено имя, на втором - поле.
Работа нескольких флагов одновременно организуется с помощью логической операции « | ».
После создания Form есть доступ к следующим атрибутам:
menu
Меню формы. Атрибуту необходимо присвоить список, состоящий из кортежей. Каждый кортеж отвечает за один пункт меню: . Где: title - имя пункта, callback - имя функции, вызываемой сразу после нажатия на пункт. Меню должно быть только одноуровневым (т.е. никаких вложений). Кроме того, в случае когда установлен флаг FFormEditModeOnly (редактирования полей) появится пункт меню «Изменить».
save_hook
Этому атрибуту присваивается имя функции, которой передается единственный аргумент - содержимое формы. Задача save_hook - проверить верность введенных данных и вернуть логическое значение: True, если новое содержимое принимается как дозволенное, False - данные неприемлемы.
Также Form имеет несколько методов (функций то бишь):
execute()
Активирует форму, после чего она становится видимой и доступной для работы.
insert(index, field)
Вставляет новый элемент field после элемента с индексом index.
pop()
Возвращает значение последнего элемента и сразу же удаляет.
length()
Возвращает количество элементов формы.
Теперь рассмотрим практическую работу с формой. Во-первых, создадим список элементов (для наглядности имя элемента соответствую типу поля, также установлено значение по умолчанию):
>>> list = , 2))]
>>>
Заметьте:
1) в текстовом поле использованы русские символы (Юникод);
2) элемент типа \'float\' не может иметь значение по умолчанию;
3) при использовании типов \'date\' и \'time\' значения указываются в секундах;
4) в \'combo\' использован кортеж, состоящий из списка строк (каждый из которых представляет собой один вариант выбора) и номера варианта, выделенное по умолчанию: (, index)
Пока никаких флагов не устанавливаем, поэтому сразу создадим форму и запустим :
>>> import appuifw
>>> form = appuifw.Form(list)
>>> form.execute()
>>>
Получили список одноуровневых элементов (имя, двоеточие и поле), но которые нельзя изменить. Этот вариант подходит в основном для вывода информации (например, свойства чего-либо). Для осуществления ввода данных необходимо установить флаг FFormEditModeOnly
>>> form = appuifw.Form(list, appuifw.FFormEditModeOnly)
>>> form.execute()
>>>
Если нужно больше места для имени и поля, можно использовать флаг FFormDoubleSpaced
>>> form = appuifw.Form(list, appuifw.FFormEditModeOnly | appuifw.FFormDoubleSpaced)
>>> form.execute()
>>>
После выхода из формы данные становятся доступны для просмотра -объект Form превращается в список полей:
>>> form
1.33333
>>> form
u\'Symbian\'
>>>
Первоначальные сведения об объекте Form я дал, теперь расскажу, как организовать в программе вкладки:
set_tabs(tab_texts)
Создаем вкладки, название которых содержится в списке tab_texts. Аргументу callback присваивается имя функции, вызываемой после каждого перехода по вкладкам. При этом передается аргумент в виде номера активированной вкладки. Переход по вкладкам происходит с использованием клавиш «Влево» и «Вправо».
>>> import appuifw
>>> def change(index):
... if index == 0:
... appuifw.app.body = appuifw.Text(u\'Hello World!\')
... elif index == 1:
... appuifw.app.body = appuifw.ListBox()
...
>>> list_tabs =
>>> appuifw.app.set_tabs(list_tabs, change)
>>> appuifw.app.activate_tab(0)
>>>
activate_tab(index)
Активирует вкладку под номером index.
На этом пока все, продолжу я статью рассказом о новом типе данных -словарь.
Создание и изменение словаря
Словарь - это последовательность, доступ к элементам которого производится по ключу. Ключами могут быть как числа, так и строки. По характеру работы словарь аналогичен своему книжному аналогу - например, англо-русский словарь: мы ищем в нем какое-то слово и получаем перевод.
Создается словарь путем перечисления пары ключ : значение через запятую, все это нужно заключить в фигурные скобки. Обращение к значению элемента производится только по ключу:
>>> dict = {\'S\' : \'Symbian\', \'WM\' : \'Windows Mobile\'}
>>> dict
\'Symbian\'
>>>
Примечание - если в словарь записывается несколько значений с одинаковым ключом, то сохраняется только последний:
>>> dict = {\'S\' : \'Symbian S60\', \'WM\' : \'Windows Mobile\', \'S\' : \'Symbian UIQ\'}
>>> dict
\'Symbian UIQ\'
>>>
У словаря можно получить длину функцией len(), удаляется запись с помощью оператора del, кроме того, словарь поддается изменению:
>>> dict = {\'S\' : \'Symbian\', \'WM\' : \'Windows Mobile\', \'L\' : \'Linux}
>>> len(dict)
3
>>> del dict
>>> dict
{\'S\' : \'Symbian\', \'WM\' : \'Windows Mobile\'}
>>> len(dict)
2
>>> dict = \'Symbian S60\'
>>> dict = \'Palm\'
>>> len(dict)
3
>>> dict
{\'S\' : \'Symbian S60\', \'WM\' : \'Windows Mobile\', \'P\' : \'Palm\'}
>>>
Как вы могли обратить внимание, если при попытке изменить словарь мы обращаемся по несуществующему ключу (dict = \'Palm\'), то создается новая запись (\'P\' : \'Palm\'), т.е. это является одним из способов добавления новых элементов в словарь.
Методы словарей
clear()
Удаляет все записи из словаря:
>>> dict = {1 : \'One\', 2 : \'Two\', 3 : \'Three\'}
>>> dict.clear()
>>> dict
{}
>>>
copy()
Возвращает копию словаря:
>>> dict1 = {1 : \'One\', 2 : \'Two\', 3 : \'Three\'}
>>> dict2 = dict1.copy()
>>> dict2
{1:\'One\', 2:\'Two\', 3: Three\'}
>>>
has_key(k)
Возвращает 1, если словарь содержит запись с ключом k:
>>> dict = {1 : \'One\', 2 : \'Two\', 3 : \'Three\'}
>>> dict.has_key(3)
1
>>> dict.has_key(4)
0
>>>
items()
Возвращает список записей в виде (key, value):
>>> dict = {1 : \'One\', 2 : \'Two\', 3 : \'Three\'}
>>> dict.items()
>>>
keys()
Возвращает список всех ключей:
>>> dict = {1 : \'One\', 2 : \'Two\', 3 : \'Three\'}
>>> dict.keys()
>>>
values()
Возвращает список всех значений:
>>> dict = {1 : \'One\', 2 : \'Two\', 3 : \'Three\'}
>>> dict.keys()
>>>
update(m)
Добавляет в словарь все записи словаря m:
>>> dict1 = {1 : \'One\', 2 : \'Two\', 3 : \'Three\'}
>>> dict2 = {4 : \'Four\', 5 : \'Five\'}
>>> dict1.update(dict2)
>>> dict1
{1 : \'One\', 2 : \'Two\', 3 : \'Three\', 4 : \'Four\', 5 : \'Five\'}
>>>
get(k )
Возвращает значение с ключом k, но только если он есть, иначе возвращает значение v (по умолчанию None):
>>> dict =
>>> dict.get(3, \'Error\')
\'Three\'
>>> dict.get(4, \'Error\')
\'Error\'
>>>
setdefault(k )
Возвращает значение с ключом k, если такого ключа нет, то метод возвращает значение v (по умолчанию None), при этом одновременно добавив в словарь новую запись k : v:
>>> dict =
>>> dict.setdefault(4, \'Four\')
\'Four\'
>>> dict
{1 : \'One\', 2 : \'Two\', 3 : \'Three\', 4: \'Four\'}
>>>
Для закрепления теории приведу пример FormBox.py, где в интерактивном режиме можно изменить содержимое формы, причем все данные хранятся в словаре.
FormBox.py
Структура программы на этот раз необычная. В начале мы, как всегда, подключаем модули. Однако в конце переработано все.
Во-первых, мы создаем словарь, где уже вбит один элемент по умолчанию, и форму, где также имеется уже готовый элемент. Атрибуты информируют форму о возможности редактирования полей элементов и выделении каждому элементу по две строки:
dict = {u\'Безымянный\': u\'Пусто\'}
form = appuifw.Form(, appuifw.FFormAutoLabelEdit | appuifw.FFormDoubleSpaced)
Во-вторых, мы указываем форме вызывать функцию save_dict при каждом изменении и создаем меню (заметьте, пункт «Изменить» уже имеется по умолчанию):
form.save_hook = save_dict
form.menu =
В-третьих, изменили код проверки источника запуска программы. Теперь, при запуске примера из интерактивной консоли, изменяем подпись и нейтрализуем функцию выхода из программы (делаем ее «пустышкой» на основе lambda). В самом конце она будет вызваться, но если программа запущена из консоли, то ничего не произойдет. А вот если программа запущена из другого *.app приложения, то функция для выхода сработает на совесть (что нам и надо, так как иначе сама программа не закроется).
if appuifw.app.full_name().lower().find(u\"python\")!=-1:
appuifw.app.title=u\'FormBox\'
appuifw.app.set_exit=lambda:0
Также добавлен бесконечный цикл, который при выходе из формы запрашивает выход уже из программы. В случае положительного ответа команда break прервет выполнение цикла и сработает функция выхода, иначе вновь запустится форма (причем данные формы никуда не пропадут и все вернется обратно в целости и сохранности).
while 1:
form.execute()
if appuifw.query(u\'Выйти из программы?\', \'query\'):
break
А теперь рассмотрим остальные функции в теле программы.
def save_dict(list):
global dict
dict={}
for index in list:
dict]=index
return True
Функция обновляет содержимое словаря в соответствии с новым содержимым формы:
1) делаем словарь пустым;
2) перебираем циклом все элементы полученного списка (напомню, аргументу функции передается содержимое формы в виде списка кортежей);
3) для каждого элемента формы создаем запись в словаре (ключом становится имя элемента - , значением - его поле );
4) обязательно возвращаем True, чтобы форма приняла новое содержимое, иначе в случае возврата False все изменения отменятся;
def insert():
global dict
try:
key, volume = appuifw.multi_query(u\'Название элемента:\', u\'Содержимое элемента:\')
except:
pass
else:
dict=volume
form.insert(len(dict)-1, (key, \'text\', volume))
Функция для вставки нового элемента в форму:
1) получаем от пользователя название имени и содержимое поля будущего элемента формы;
2) если ввод был отменен, произойдет ошибка (при отмене возвращается None, а это не кортеж, и он не распаковывается - вот это и приведет к ошибке) и функция завершится;
3) иначе создаем в словаре новую запись;
4) вставляем в конец формы новый элемент.
def pop():
global dict
if len(dict)==1:
appuifw.note(u\'Форма должна содержать хотя бы один элемент.\', \'error\')
return False
else:
element=form.pop()
del dict]
return True
Функция для удаления последнего элемента формы:
1) если длина словаря равна единице, то информируем пользователя об ошибке (так как в форме должен быть минимум один элемент) и возвращаем False (зачем это, скажу ниже);
2) иначе получаем последний элемент формы и одновременно удаляем его;
3) удаляем из словаря значение по ключу (первый элемент кортежа) и возвращаем True.
def clear():
while pop():
pass
Функция для удаления всех элементов формы (хотя один по-любому останется). Представляет из себя бесконечный цикл для удаления элементов с конца и выполняется до тех пор, пока функция pop() не вернет False (т.е. больше элементов удалять уже нельзя). Именно для этого случая мы в вышеописанной функции и использовали return False/True, ведь для самого pop() они не нужны, а так убили двух зайцев и получили простейшую функцию.
def keys():
global dict
appuifw.query(u\', \'.join(dict.keys()), \'query\')
Функция для вывода всех ключей из словаря. Преобразует список ключей в строку, при этом элементы списка соединяются между собой запятыми с помощью метода строки.
def values():
global dict
appuifw.query(u\', \'.join(dict.values()), \'query\')
Функция для вывода всех значений в словаре (аналогичен вышеописанной функции).
def has_key():
global dict
key=appuifw.query(u\'Введите имя элемента.\', \'text\', u\'Безымянный\')
if key:
if dict.has_key(key):
appuifw.note(u\'Элемент с таким ключом существует.\')
else:
appuifw.note(u\'Нет элемента с таким ключом.\', \'error\')
Функция проверяет наличие в словаре элемента с заданным ключом:
1) получаем ключ от пользователя;
2) если ключ введен, то проверяем наличие ключа в словаре, и если такой существует, то информируем пользователя об этом;
3) если нет, то выводим соответствующее сообщение об ошибке.
На заметку - if key выполняется как if key!=None, т.е. на русском это звучит как «Если пользователь что-то ввел...»
def get():
global dict
key=appuifw.query(u\'Введите имя элемента.\', \'text\', u\'Безымянный)
if key:
appuifw.note(dict.get(key, u\'Нет такого элемента.\'))
Функция выводит значение элемента по его ключу:
1) запрашиваем ключ;
2) если он введен, демонстрируем найденное значение. Причем функция работает так, что если значения с таким ключом нет в словаре, то возвращается значение по умолчанию, если же такой ключ есть, то возвращается существующее значение.
Объект Form пригодится любому программисту. Можно просто осуществлять с помощью него настройку приложения, а можно вообще сделать форму главным элементом интерфейса вашей программы, т.е. как сделано в примере. Главное - грамотно использовать все методы объекта и удовлетворение пользователя будет гарантировано. DimonVideo
Автор: Газетдинов Альберт Python на Symbian S60: словари и объект Form, вкладки пример FormBox.py Объект Form - это диалоговое окно, элементы которого можно [...] читать полностью
6304
Python на Symbian S60: списки и объект Listbox пример ListBox.py
Объект Listbox - это поле со списком строк. Программист может дополнить его: сделать меню «Функции» или привязать к нажатиям на клавиши определенные события.
Создается и активируется объект так же, как и Text, при этом ему передаются два аргумента - список строк и имя функции:
>>> list =
>>> def callback():
... pass
...
>>> import appuifw
>>> appuifw.app.body = body = appuifw.Listbox(list, callback)
>>>
Разберем код. Объект находится в модуле appuifw, который подключается с помощью команды import. Listbox присваивается атрибуту app.body («тело» программы). Список list содержит строки Unicode, которые и выводятся на экран. callback будет вызываться каждый раз при нажатии на джойстик.
Для создания двухуровневого списка необходимо указать список кортежей, каждый из которых состоит из 2-х строк Unicode: первый отвечает за верхний (крупным шрифтом) уровень, второй - за нижний (мелким шрифтом). Общий вид: :
>>> list =
>>> def callback():
... pass
...
>>> import appuifw
>>> appuifw.app.body = body = appuifw.Listbox(list, callback)
>>>
Методы объекта
bind(event_code, callback)
Привязывает запуск функции callback к нажатию на клавишу с кодом event_code
current()
Возвращает номер активной строки (т.е. та, которая выделена на данный момент).
set_list(list )
Устанавливает новый список list с уже активной строкой current (если отсутствует, то активна первая строка).
Сейчас же подробно рассмотрю уже известный тип данных - список.
Создание и изменение списка
В первых статьях я рассказал, что списки используются для группировки значений (элементов), разделенных запятыми и заключенными в квадратные скобки:
>>> list =
>>>
Элементы списка могут быть разного типа:
>>> list = ]
>>>
Списки можно складывать как числа (т.е. объединять их):
>>>
>>>
Обращение к элементам списка производится по индексам элементов. При этом нумерация списков идет с нуля:
>>> list =
>>> list
1
>>>
Если индекс меньше нуля, то происходит отсчет с конца списка:
>>> list =
>>> list
\'Two\'
>>>
Можно получить срез списка различными способами:
>>> list =
>>> list
>>> list
>>> list
>>> list
>>> list
>>> list list
>>>
В отличие от строк, элементы списка можно изменять:
>>> list =
>>> list=2
>>> list=3
>>> list
>>>
Причем использовать в качестве нового элемента другой список:
>>> list =
>>> list =
>>> list
>>> list =
>>> list =
>>> list
>>>
Встроенная функция len() определяет длину списка, а оператор del удаляет элемент по индексу или срезу (если он указан):
>>> list =
>>> len(list)
5
>>> del list
>>> list
>>> del
>>> list
>>> len(list)
2
>>>
Методы списков
append(x)
Добавляет элемент x в конец списка:
>>> list =
>>> list.append(\'Three\')
>>> list
>>>
extend(t)
Добавляет элементы последовательности t в конец списка (т.е. объединяет их):
>>> list1 =
>>> list2 =
>>> list1.extend(list2)
>>> list1
>>>
count(x)
Возвращает количество элементов в списке со значением x (т.е. перебирает весь список и определяет, сколько раз встречается элемент x):
>>> list =
>>> list.count(3)
2
>>> list.count(4)
1
>>>
index(x)
Возвращает наименьший индекс элемента x в списке, если такого элемента нет в списке, произойдёт ошибка):
>>> list =
>>> list.index(4)
2
>>> list
4
>>>
insert(i, x)
Вставляет в список элемент x перед i-ым элементом, если i меньше нуля, то x вставляется в начало, если i больше длины списка - в конец):
>>> list =
>>> list.insert(1, 2)
>>> list
>>> list.insert(9, 4)
>>> list
>>> list.insert(-5, 0)
>>> list
>>>
pop(i)
Возвращает i-ый элемент c одновременным удалением, если i не указан, то подразумевается последний элемент:
>>> list =
>>> list.pop(0)
1
>>> list
>>> list.pop()
4
>>> list
>>>
remove(x)
Удаляет из списка первый элемент со значением x, если такого значения нет, то произойдет ошибка:
>>> list =
>>> list.remove(3)
>>> list
>>>
sort()
Сортирует список (от 1 до 9, от «a» до «z» и т.д.):
>>> list =
>>> list.sort()
>>> list
>>>
reverse()
Сортирует список в обратном порядке:
>>> list =
>>> list.reverse()
>>> list
>>>
Кроме обычных способов, Python предоставляет дополнительные возможности при конструировании списков:
>>>
>>>
Расшифрую:
1) в центре находится цикл for, который перебирает последовательность (список, кортеж, строка), идущую после оператора in;
2) слева находятся выражения, обрабатывающие элементы последовательности;
3) справа находятся условные выражения, которые фильтруют элементы, не удовлетворяющие условию (необязательная часть).
Это очень удобно, когда нужно быстро создать или отсортировать список по условию. Использование обычного цикла привело бы к написанию такого кода:
>>> list =
>>> for index in range(9):
... if index > 5:
... list.append(index)
...
>>> list
>>>
Работа с кортежами
Кортежи создаются с помощью обычного перечисления элементов через запятую, при этом элементы могут быть различных типов данных. У кортежей можно получать значения элементов по индексу, доступно использование срезов и отрицательных индексов. Но кортеж изменить нельзя, к тому же у них нет ни одного метода:
>>> tuple = (1, 2.0, \'Three\')
>>> tuple
\'Three\'
>>> tuple
(1, 2.0)
>>> len(tuple)
3
>>>
Кортеж, состоящий из одного элемента, создается так:
>>> tuple = (1,)
>>> tuple
(1,)
>>>.
Чтобы закрепить теорию работы со списками, я написал обучающую программу. Как и в прошлый раз, объясню структуру программы и работу некоторых функций прямо в статье (для большой ясности). Программа называется ListBox.py и предназначена для интерактивной работы со списками, используются возможности объекта Listbox.
ListBox.py
Функционал программы строится на основе методов списка:
1) добавить элемент;
2) сортировать список;
3) просмотреть последний элемент и удалить его;
4) удалить элемент по имени;
5) удалить выделенный элемент из списка;
6) найти элемент по имени.
В начале программы создаем список, который будет подопытным кроликом. Затем идет описание всех функции. В конце представлено несколько блоков кода.
Во-первых, создаем объект Listbox, который присваиваем переменной listbox (использовать эту переменную в функциях удобнее, чем громоздкую конструкцию appuifw.app.body). При создании передаем объекту два аргумента: начальный список (показывает количество элементов в списке) и имя функции info (вызывает при каждом нажатии на джойстик). Также привязываем с помощью метода bind вызов функции delete на клавишу «С»:
appuifw.app.body = listbox = appuifw.Listbox(,info)
listbox.bind(key_codes.EKeyBackspace, delete)
Во-вторых, описываем меню «Функции»:
appuifw.app.menu =
В-третьих, приводим код (уже известный по программе TextBox.py) для проверки того, откуда запущена программа: из консоли или как самостоятельное приложение.
Теперь опишем функции программы. Обратите внимание на команду global, которая даёт возможность использовать глобальную переменную list внутри тела функции.
def info():
global list
index=listbox.current()
if index>0:
appuifw.note(list)
Функция вызывается при нажатии на джойстик и выводит имя того элемента, который выделен:
1) получаем номер выделенной строки;
2) если номер больше нуля (нулевой элемент - это надпись с количеством элементов), то инициируем всплывающее окошко с его именем в списке.
def create():
global list
index=listbox.current()
number=
listbox.set_list(number list, index)
Общая функция, которая вызывается для обновления объекта Listbox:
1) сохраняем номер выделенной строки;
2) создаем переменную, содержащую строку с количеством элементов в списке;
3) обновляем объект Listbox, передав ему новый список и старое расположение курсора (если это не сделать, то курсор автоматически переместится на начало).
def delete():
global list
index=listbox.current()
if index>0:
del list
create()
Функция удаляет выделенный элемент списка:
1) получаем номер выделенного элемента;
2) если он больше нуля, то удаляем элемент из списка;
3) обновляем объект Listbox.
def append():
global list
text=appuifw.query(u\'Введите имя элемента:\', \'text\', u\'Безымянный\')
if len(text)>=0:
list.append(text)
create()
Функция добавляет в конец списка новый элемент:
1) получаем от пользователя имя нового элемента (по умолчанию «Безымянный»);
2) если имя введено, то добавляем в конец списка новый элемент;
3) обновляем объект Listbox.
def pop():
global list
element=list.pop()
appuifw.note(u\'Элемент \' element u\' удален.\')
create()
Функция:
1) получает последний элемент из списка;
2) инициирует всплывающее окошко с этим элементом;
3) обновляет объект Listbox.
def remove():
global list
text=appuifw.query(u\'Введите имя удаляемого элемента:\', \'text\', u\'Безымянный\')
if len(text)>=0:
try:
list.remove(text)
except:
appuifw.note(u\'Элемента с таким именем нет.\',\'error\')
else:
create()
Функция удаляет элемент по его имени:
1) получаем от пользователя имя элемента (по умолчанию «Безымянный»);
2) если имя введено, то удаляем его из списка;
3) если такого имени в списке нет, то сообщаем пользователю об этом;
4) иначе обновляем объект Listbox.
def sort():
global list
list.sort()
create()
Функция сортирует список и обновляет объект Listbox.
def index():
global list
text=appuifw.query(u\'Введите имя элемента:\', \'text\', u\'Безымянный\')
if len(text)>=0:
try:
index=list.index(text)
except:
appuifw.note(u\'Такого элемента нет.\',\'error\')
else:
number=
listbox.set_list(number list, index 1)
Функция для поиска элемента по его имени:
1) получаем от пользователя имя элемента;
2) если имя было введено, то определяем имя элемента в списке;
3) в случае неудачи информируем пользователя об ошибке;
4) иначе обновляем объект Listbox с выделением той строки, где расположен искомый элемент. DimonVideo
Автор: Газетдинов Альберт Python на Symbian S60: списки и объект Listbox пример ListBox.py Объект Listbox - это поле со списком строк. Программист может дополнить [...] читать полностью
3905
Все статьи Альберта в другом формате можно взять здесь
Программная платформа Symbian Series 60 (или S60) — самая популярная в мире смартфонов и коммуникаторов, если судить по продажам мобильных устройств. Поэтому приложения именно для этой платформы актуальны как никогда. Создание программ — процесс увлекательный, и данная статья поможет всем желающим попробовать свои силы в этом деле.
Казалось бы, совсем недавно смартфоны стоили весьма прилично, да и на прилавках появлялись редко; программирование для «умников» было увлечением сложным и малоперспективным. Однако сейчас приобрести «умный телефон» можно за приемлемую цену, а создавать для него программы имеют возможность не только профессионалы и энтузиасты, но и обычные пользователи. Причина этого в том, что появились простые в освоении языки программирования для Symbian Series 60.
КОМПИЛЯТОРЫ И ИНТЕРПРЕТАТОРЫ
Есть два принципиально различных типа программ: самостоятельные приложения и исполняемые файлы, которые запускаются только при наличии установленной в устройстве специальной среды — интерпретатора.
В первом случае для «перевода» текста программы на язык, понятный какой-либо платформе (в нашем случае S60), необходим компилятор — специальное приложение, которое, как правило, входит в состав средств разработчика. Итак, пропускаем написанный код через компилятор и на выходе получаем самостоятельное приложение для совместимой платформы. Достаточно скопировать его на соответствующий аппарат и элементарно запустить. Поясним. В случае с Windows XP компилятор выдает EXE-файл. Все, что требуется от пользователя для запуска, — это двойной клик. Компилируемые языки программирования в освоении сложны, зато творческих возможностей предоставляют больше. C , например, — стандарт де-факто при разработке ПО, в том числе и для многих мобильных платформ.
Плюсы
максимальная скорость и минимально потребляемые ресурсы
для работы программы требуются только ее собственные файлы
удобное средство для создания коммерческих продуктов
Минусы
— сложные для освоения языки
— необходимость создания различных версий продукта для разных платформ
Интерпретатор занимается тем, что объясняет данному устройству, как следует выполнять код программы. Пожалуй, самый известный пример интерпретатора — виртуальная машина Java, которая, кстати, по умолчанию наличествует не только в смартфонах, но и практически в любых современных телефонах. Интерпретатор Java — универсален. Одна и та же Java-программа, как правило, выполняется и на Windows Mobile коммуникаторе, и на каком-нибудь музыкальном телефоне Sony Ericsson.
Минусы интерпретаторов — в относительно медленной скорости работы, а кроме того, они обладают изрядным аппетитом в плане потребления ресурсов. Зато такие языки просты для изучения. Помимо Java, к интерпретаторам можно отнести, например, «настольный» Basic, который преподается почти во всех школах.
Плюсы
легкость освоения
в ряде случаев — возможность написания и отладка программ на самом устройстве
Минусы
— зависимость программы от интерпретатора
— медленная работа и большое потребление оперативной памяти
— трудность создания коммерческих продуктов
ПИТОН СЪЕЛ МЫШЬ
Как было сказано, интерпретаторы отлично подойдут для новичков и тех, кто хочет понять общие принципы написания программ Symbian Series 60. Здесь выбор будет лежать между двумя средами программирования: Python и mShell («Питон» и «Мышь» на жаргоне программистов).
Python — разновидность одноименного компьютерного языка программирования; официально поддерживается компаниями Symbian и Nokia. Установочные файлы можно найти на страничке https://sourceforge.net/project/showfiles.php?group_id=154155. Существуют различные версии для смартфонов с Symbian OS 6.1, 7.0s, 8.0, 8.1 и 9.1. Состоит Python из двух частей — PythonForS60 и PythonScriptShell. Первый файл отвечает за функции языка, а после установки второго в Меню смартфона появляется значок для запуска консоли Python.
После этого можно работать с файлами, имеющими расширение .py (содержат текст программы на языке Python), и писать программы прямо на смартфоне. Невидимая в Меню PythonInstaller поможет установить новые PY-файлы и библиотеки, а также создать на их основе программу со своим значком в Меню.
Плюсы
возможность использования сторонних библиотек
создание самостоятельных приложений на основе Python-программ
широкое распространение и наличие сообщества программистов
Минусы
— мало похож на популярные языки (Basic, Pascal, C)
— отсутствие собственного редактора для набора текста программы
mShell создан фирмой infowing AG (www.mshell.net). Поддерживаются смартфоны с Series 60 2nd Edition (Symbian OS v7.0s, v8.0, v8.1) и Series 60 3rd Edition (Symbian OS v9.1). После установки необходимо осуществить бесплатную процедуру регистрации через SMS. Оболочка mShell дает возможность запускать несколько M-файлов (текст программы на языке mShell) одновременно и редактировать их, а также предоставляет справку по любой функции.
Плюсы
Pascal-подобный язык
высокая скорость работы, особенно с двухмерной графикой
имеется собственная среда разработчика с удобной помощью
Минусы
— плохая распространенность
— запуск программ только из среды mShell
Итог: Python выглядит более привлекательным — он позволяет создавать приложения со своим значком в Меню, которые к тому же удастся упаковать в SIS-файлы. Однако mShell списывать со счетов не стоит — скорость работы и потребление ресурсов выгодно отличают его от других языков, к тому же разработчики обещали в будущем дополнить его компилятором (!).
ВЕЗДЕСУЩАЯ JAVA
На данный момент почти все выпускаемые сотовые телефоны имеют предустановленную возможность для запуска Java-программ (мидлетов). Большая распространенность этой технологии привлекает внимание разработчиков коммерческих продуктов (особенно игр), но и обычный пользователь может сделать что-нибудь свое. Для этого на компьютере необходимо установить следующие программы со страницы java.sun.com/javame/:
1) Java 2 Standard Edition SDK — компиляторы и утилиты для создания Java-мидлетов;
2) J2ME Wireless Toolkit — эмуляторы и средства для отладки Java-мидлетов;
3) NetBeans IDE (для работы с J2ME необходим еще и NetBeans Mobility Pack) — среда разработчика.
Продуктом процесса разработки станут JAD- и JAR-файлы. Выбор технологии Java будет оптимальным, если хотите, чтобы ваш продукт охватил большое количество телефонов.
Реализация Java на смартфонах с версией Symbian 6-8 оставляет желать лучшего: долгая загрузка, медленная скорость работы, большое потребление оперативной памяти. Однако Symbian 9.2 преподнесла сюрпризы: загрузка мидлетов моментальная, да и с оперативной памятью дело обстоит не так плачевно. Таким образом, все последующие модели смартфонов от Nokia начнут адекватно работать с технологией Java. А уверенность в безоблачном будущем — то, что нужно любому разработчику!
Плюсы
большая популярность и легкость создания программ
поддержка практически в любом сотовом телефоне
богатая документация и наличие ресурсов данной тематики
Минусы
— не самая высокая скорость работы
— нет доступа ко всем телефонным возможностям
ШИЛО НА МЫЛО
Язык Java показался сложным? Тогда стоит использовать программы-посредники: «скармливайте» им программу, написанную на родственниках таких популярных языков, как Pascal и Basic, и на выходе получайте готовый Java-мидлет.
MidletPascal можно скачать с сайта разработчиковwww.midletpascal.com(временно не работает), за пользование программой денег не просят. Поставляется MidletPascal с собственной, дружественной к пользователю средой разработки (IDE). Среда имеет встроенный компилятор, инспектор кода Java и обеспечивает построение архива JAR, что избавляет от установки Java SDK. В итоге компиляция и компоновка мидлетов проста, как нажатие на кнопку. Порадует вас встроенная справка по доступным функциям: работа с графикой, SMS, звуками, файлами и т. д.
OmegaBasic — специализированная среда разработки для создания программ и игр. Включает удобный редактор, поддерживает работу с проектами. Можно просматривать несколько файлов, ставить закладки, распечатывать справку по функциям. OmegaBasic позволяет работать с графикой, картами, звуком, музыкой, анимацией, видео и сетью. В качестве основного языка программирования используется Basic. Можно программировать и на Java, используя расширенный набор API OmegaBasic. Сайт разработчика — omegabasic.thegamecreators.com, оттуда можно скачать триальную версию, в которой программы ограничиваются 250 строками кода. Для функционирования OmegaBasic необходимо установить на ПК Java 1.4 SDK и Java Mobile 1.2 SDK.
MobileBasic — такая же специализированная среда. Ее особенность — наличие сервисов по так называемой немедленной OVER-THE-AIR («по воздуху») установке написанных мидлетов на телефоны. Написав программу, программист в MobileBasic может сохранить ее в виде JAD- и JAR-файлов. Эти файлы с помощью MidletUploader выгружаются на сервер MobileBasic. Сервер создает WAP/WML-страницы, подключившись к которым с помощью WAP-браузера телефона можно установить мидлет. Кроме этого сервиса, в MobileBasic имеется графический редактор, редактор карт и плиточных изображений, а также редактор мелодий для телефонов Nokia.
Скачать демо-версию MobileBasic можно со страницы www.mobilebasic.com/desktopedition.html. Стоимость продукта — 24,99 фунтов стерлингов, ограничение триальной версии — максимум 1 Кб исходного кода. На сайте не стоит пренебрегать регистрацией, иначе запустить MobileBasic получится не более 30 раз. Как и в прошлом случае, необходимы установленные на компьютер Java SDK.
Итог: OmegaBasic и MobileBasic — почти близнецы в плане подхода к написанию кода, к тому же обладают схожим функционалом. Недостатки: необходимость приобретать платную версию и устанавливать Java SDK. На этом фоне ярко выделяется MidletPascal — самый популярный, простой в установке, и главное — бесплатный!
ТЯЖЕЛАЯ АРТИЛЛЕРИЯ
C for Symbian — наилучший (и, по сути, единственный) язык для создания профессиональных и коммерческих приложений для смартфонов Symbian Series 60. Именно на нем пишется сама система и предустановленное программное обеспечение. Если вы полны решимости программировать на C for Symbian, то необходимо установить:
1) среду разработки — CodeWarrior (www.forum.nokia.com/codewarrior), Carbide.с (www.forum.nokia.com/main/resources/tools_and_sdks/carbide_cpp/) или другое;
2) SDK для Symbian соответствующей Edition и Feature Pack под нужную среду разработки (www.forum.nokia.com/info/sw.nokia.com/id/4a7149a5-95a5-4726-913a-3c6f21eb65a5/S60-SDK-0616-3.0-mr.html);
3) Java 2 Standard Edition;
4) Perl версии не ниже 5.003.07.
При создании программ на C for Symbian можно получить доступ ко всем возможностям смартфона, что не идет ни в какое сравнение с Java и прочими интерпретируемыми языками. Полученные продукты будут потреблять минимум ресурсов и работать с максимальной скоростью, так как между программой и системой не будет посредников-интерпретаторов.
При компиляции программного кода создается не только приложение, а также иконка и необходимые файлы ресурсов. Все это в конце концов упаковывается в установочный файл SIS. После его подписи (если необходимо) разработчик может распространять и продавать программу как готовый продукт.
* * *
Экскурс подошел к концу, а значит пора решаться на выбор средства программирования. Если хотите получить профессиональный продукт — необходимо использовать C for Symbian, популярная Java не так быстра и не поддерживает всех возможностей платформы S60, зато может запускаться и на обычных телефонах, причем не только от Nokia.
Python — отличный выбор для тех, кто собирается писать несложные, но полезные программы; возможность отлаживать программы прямо на смартфоне уникальна. Мы подготовили серию статей, обучающих программированию на мобильном Python, и приложили ряд примеров и любопытных программ, написанных специально для Mobi. В наших закромах также найдется материал по работе с MidletPascal.
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
Самая популярная платформа
Платформу Series 60 создала компания Nokia. Финны решили поделиться удачной разработкой — они не только сами выпускают огромное количество S60-смартфонов, но и предоставляют лицензии другим производителям. S60-аппараты есть в активе Samsung, Panasonic, LG и других. Samsung, к примеру, недавно представила свой первый S60-смартфон с GPS — Samsung i550.
Темная лошадка
Невозможно не упомянуть о языке Ruby (русская страничка preview.ruby-lang.org/ru/). Он обладает двумя серьезными минусами, которые сдерживают его распространение на S60: отсутствие графического интерфейса и доступа к «телефонным» функциям смартфона. Программы на этом языке не могут работать с графикой, SMS, камерой и т. д. Выигрывает Ruby за счет быстрых математических вычислений и работы с интернетом. Будем ждать дальнейшего развития проекта!
Вооружение программиста
Программирование для любой платформы невозможно без SDK — Software Development Kit (набор разработчика), обычно его можно получить бесплатно из интернета. Практически всегда только SDK содержит компилятор, эмулятор и другие приложения.
Вся работа с компилятором и другими утилитами идет в командной строке DOS, а сама программа и конфигурационные файлы набираются в любом текстовом редакторе.
Для удобной работы существует IDE (Integrated Development Environment) — среда разработчика, посредник между SDK и пользователем. IDE содержит текстовый редактор, функции для создания и управления проектом, а также средства, автоматизирующие работу. IDE укажет компилятору из SDK обработать программу, создаст необходимые файлы и выведет ошибки, если таковые имеются. За такие блага часто приходится платить наличными — в основном IDE разрабатываются сторонними фирмами.
Кстати, некоторые IDE, например MidletPascal, обладают встроенным компилятором, что позволяет обойтись без установки SDK. Мобильные же интерпретаторы сами по себе реализованы как среда разработчиков, и компиляторов не предполагают.
Язык в языке
Существуют Java-мидлеты, которые позволяют прямо на смартфоне писать и запускать программы. MobileBasic, например, можно скачать со страницы www.mobilebasic.com/phoneedition.html. Стоимость — 9,99 евро, триальный период — 30 дней. Вся работа ведется в командной строке, где нужно набрать текст на языке Basic и нажать джойстик. В случае успешного выполнения будет напечатано READY, в противном случае появится подробное сообщение об ошибке.
На практике процесс ввода кода и запуска программы получился крайне неудобным. Тем не менее в последней версии разработчики обещают богатые возможности работы с вычислениями, графикой, файлами и интернетом.
Более привлекателен DROS — эмулятор старого доброго DOS. Мидлет позволяет запускать BAS-файлы — программы на языке Basic. Язык не так богат функциями, упор сделан на создание игр. Большой плюс — удобный редактор текста программы, а главное — он абсолютно бесплатен! Скачать ZIP-архив можно с сайта www.whoredoeuvre.com, где кроме самого мидлета будут примеры и инструкция с описанием программы и языка Basic.
Сертификация в Symbian 9
При написании коммерческого приложения для Symbian 9 (а это все новые смартфоны от Nokia) разработчик должен купить сертификат на право использования необходимых библиотек с нужными функциями, что стоит денег. Возможность доступа к функциям подтверждается соответствующей подписью установочного файла. Бесплатные приложения можно создать, но они буду иметь ограниченный функционал. Все это продвигается компанией Symbian и Nokia как новое слово в безопасности и борьбе с мобильными вирусами. DimonVideo
Автор : Газетдинов Альберт (по ссылке и оригиналы статей с картинками) Все статьи Альберта в другом формате можно взять здесь Программная [...] читать полностью
9136
Cпиcкoвыe включeния - этo мoщнoe cpeдcтвo языкa Python, кoтopoe пoявилocь нaчинaя c
вepcии 2.0. C пoмoщью cпиcкoвыx включeний мoжнo coздaвaть cпиcки из oднoй или нecкoлькиx пocлeдoвaтeльнocтeй,
в cooтвeтcтвии c ycтaнoвлeнными ycлoвиями. Cинтaкcиc иx тaкoв:
>>> a =
>>> map(lambda x: x**3-3, a)
>>>
>>> b =
>>> filter(lambda x: x>0, b)
>>>
Bce кoмaнды for ... in выпoлняютcя cлeвa нaпpaвo.
Фpaзы if ... нeoбязaтeльны, нo пpи иx yкaзaнии мoжнo oгpaничить кoл-вo элeмeнтoв в coздaвaeмoм cпиcкe.
Пpивeдy нecкoлькo пpимepoв. Пpeдпoлжим Baм нeoбxoдимo
кo вceм элeмeнтaм cпиcкa пpибaвить 5. Bмecтo иcпoльзoвaния циклa for:
>>> a =
>>> map(lambda x: x**3-3, a)
>>>
>>> b =
>>> filter(lambda x: x>0, b)
>>>
Yпpocтитe кoд c пoмoщью cпиcкoвыx включeний:
>>> a =
>>> map(lambda x: x**3-3, a)
>>>
>>> b =
>>> filter(lambda x: x>0, b)
>>>
Пpи иcпoльзoвaнии cпиcкoвыx включeний кoд cтaл бoлee кopoтким и быcтpым.
Boт кaк зaпoлнить cпиcoк квaдpaтaми чиceл oт 0 дo 10 и квaдpaтaми тoлькo чeтныx чиceл:
>>> a =
>>> map(lambda x: x**3-3, a)
>>>
>>> b =
>>> filter(lambda x: x>0, b)
>>>
Пpи paбoтe c фaйлaми:
>>> a =
>>> map(lambda x: x**3-3, a)
>>>
>>> b =
>>> filter(lambda x: x>0, b)
>>>
Пpимepы oбpaбoтки нecкoлькиx пocлeдoвaтeльнocтeй:
>>> a =
>>> map(lambda x: x**3-3, a)
>>>
>>> b =
>>> filter(lambda x: x>0, b)
>>>
Kpoмe тoгo paзpaбoтчики Python peкoмeндyют иcпoльзoвaть cпиcкoвыe включeния вмecтo
фyнкций map и filter, т.к. этo бoлee мoщнoe и oбычнo бoлee быcтpoe cpeдcтвo. Пpивeдy
пapy пpимepoв зaмeны map и filter нa cпиcкoвыe включeния.
>>> a =
>>> map(lambda x: x**3-3, a)
>>>
>>> b =
>>> filter(lambda x: x>0, b)
>>>
Cпиcкoвыe включeния - oчeнь мoщнoe и yдoбнoe cpeдcтвo,
cпocoбнoe yпpocтить и yбыcтpить нeкoтopыe кoнcтpyкции в Baшeй пpoгpaммe. DimonVideo
Heдaвнo нaткнyлиcя в интepнeтe нa cтaтью o cпиcкoвыx включeнияx языкa Python, peшил вылoжить. Aвтopoм cтaтьи являeтcя Gregory Dryapak.Cпиcкoвыe включeния - этo мoщнoe cpeдcтвo [...] читать полностью
4563