На сайте android.com опубликован исходный код операционной системы Andorid 1.0. Собрать ОС самому можно только на Ubuntu (6.06 и новее) или Mac OS с разделом, [...] читать полностью
Программирование для смартфонов » страница 5
категории RSS
Компания Trolltech анонсировала Qt для S60. На сайте доступен релиз в статусе \"technology preview\". Полноценный релиз запланирован на середину 2009г. Trolltech также не исключает выхода других \"technology preview\" или бета релизов до этой даты.
Qt (произносится «кьют») — кросс-платформенный инструментарий разработки ПО на языке программирования C .
Позволяет запускать написанное с его помощью ПО в большинстве современных операционных систем путём простой компиляции программы для каждой ОС без изменения исходного кода. Включает в себя все основные классы, которые могут потребоваться при разработке прикладного программного обеспечения, начиная от элементов графического интерфейса и заканчивая классами для работы с сетью, базами данных и XML. Qt является полностью объектно-ориентированным, легко расширяемым и поддерживающим технику компонентного программирования. (c) wiki
Существуют версии Qt для Windows CE, Windows, Embedded Linux (например, платформа Maemo) и Mac OS X.
На сайте Trolltech Qt доступна в двух вариантах: под специальной \"technology preview\" лицензией (104 Мб, zip) и под GNU GPLv2 и v3 с полным доступом к исходному коду (242 Мб, zip).
В анонсе указано, что Qt бедет поддерживаться на устройствах под управлением S60 3rd Edition Feature Pack 1 и далее.
Установка:
Для установки Qt необходима IDE Carbide.c 1.3.1. К этой версии Carbide необходимо скачать патч (для того, чтобы обновить Nokia X86 compiler). Отмечу, что готовящаяся к выходу Carbide.c v2 (недавно была выпущена вторая бета версия) имеет встроенную поддержку Qt.
Затем, если вы используете SDK 3RD ed FP1, вы должны обновить библиотеку Rpipe для WINSCW и ARMV5, взяв более новую версию из Open C плагина. А также скачать и скопировать в папку epoc32\\\\tool\\\\ файл getexports.exe.
Для S60 5th ed SDK v0.9 достаточно обновить файл wsini.ini.
Для работы приложений Qt на телефоне должна быть установлена библиотека P.I.P.S (входит в Open C плагин). Все версии Symbian, начиная с 9.3 (3rd ed FP2) имеют встроенную библиотеку P.I.P.S. Для устройств под управлением Symbian 9.2 ее нужно установить вручную.
Trolltech разместила видеоурок по установке GPL варианта Qt, а также видео, демонстрирующее выполнение приложения, созданного при помощи Qt, на 3х различных операционных системах.
Дополнительную информацию по установке Qt можно найти здесь.
https://devmobile.ru/index.php?option=com_content&task=view&id=313&Itemid=2
https://snipurl.com/4p4uh DimonVideo
Хотел назвать статью Qt для S60 но движок ругнулся на короткое название =) Статья изобилует ссылками, поэтому рекомендую смотреть оригинал. [...] читать полностью
5275
Некоторые сведения о языке программирования NS Basic:
* Поддерживает платформы Symbian UIQ 3 и Symbian S60 3rd
* Легок в использовании
* Поддержка математических и тригонометрических функций
* Поддержка TCP/IP
* Создание sis приложений, работающих самостоятельно
* Поддержка БД
* Среда разработки Project Builder
Для того, чтобы разогреть интерес разработчиков компания объявила о снижении цен на NS Basic для Symbian OS:
Standard Edition Single Developer - 99.95$ вместо 149.95$
Pro Edition - 149.95$ вместо 299.95$
Ссылки:
Сайт: https://www.nsbasic.com/symbian
Видео: https://www.nsbasic.com/symbian/info/helloworldvideo.html
Туториал: https://www.nsbasic.com/symbian/info/technotes/TT01.htm
FAQ: https://www.nsbasic.com/symbian/info/faq.html
Демо версия: https://www.nsbasic.com/symbian/info/demo.html
Спецификации: https://www.nsbasic.com/symbian/info/Specifications.html
Источник
https://devmobile.ru/index.php?option=com_content&task=view&id=306&Itemid=2 DimonVideo
Компания NS Basic Corp. предлагает разработчикам свой язык программирования NS Basic для Windows Mobile, Palm OS, Newton и даже Windows. Не так давно они выпустили версию [...] читать полностью
6353
Сообщество Forum Nokia представило интересный документ S60 5th Edition: What\'s New for Developers, суммирующий все изменения S60 5th edition по сравнению с предыдущей, 3-й редакцией.
Далее следует мой вольный пересказ этого материала.
* Symbian 9.4 имеет улучшенный механизм подкачки страниц памяти, распространяющийся на все элементы системы, что ускоряет запуск приложений и снижает вероятность out-of-memory ошибок.
* Графический интерфейс S60 5th ed поддерживает разрешение 640 x 360 Quarter High-Definition (QHD) (в 3-й редакции поддерживался 240 x 320 Quarter Video Graphics Adapter (QVGA))
* Функция TouchScreen с поддержкой тактильной обратной связи (при помощи вибро механизма). Полная и ITU-T экранные клавиатуры с поддержкой рукописного ввода.
* Новая подсистема работы с сенсорами позволяет реализовать поддержку акселерометров, магнитометров и пр.
* Графический интерфейс дополнен новыми компонентами, к примеру toolbar\'ом для быстрого запуска приложений.
* Функциональность встроенных приложений расширена, некоторые полностью переписаны. Добавлено приложение для поиска информации на устройстве.
* Поддержка нескольких внутренних и внешних накопителей емкостью до 32 GB.
Разработчикам Symbian C предоставляются следующие API:
* Accessory Monitoring API - Мониторинг и поучение информации о таких аксессуарах как: гарнитура, пульты дистанционного управления, устройства для слабослышащих (loopset), TTY и дополнительные аудио-видео устройства.
* Choice List API - Новый UI компонент для выбора элементов из вертикального списка.
* Generic Button API - Рисование произвольных кнопок с иконками и надписями.
* Hierarchical Lists API - Позволяет представлять данные в виде иерархических списков и деревьев в различных стилях.
* Hostlet Connection API - Создание и взаимодействие с приложениями, предоставляющими доступ к web сервисам
* Incoming Call Monitor API - Позволяет приложению зарегистрироваться как обработчика входящих звонков.
* Messaging Integration API - Позволяет глубже интегрировать сторонние MTM сервисы в UI
* Sensor APIs - Ряд классов позволяющих регистрировать ускорение (акселерометр), ориентацию, магнитные поля (магнитометр), толчки (tap sensor) и пр.
* Stylus Pop-up Menu API - вызов pop-up меню в точке прикосновения к экрану
* Tactile Feedback Client API - позволяет приложениям и элементам UI регистрировать области их тактильной связи и получать сообщения о прикосновении к ним.
* Title Pane Touch Observer API - Регистрация прикосновений к title pane приложения.
* Toolbar API - Создание фиксированной или плавающей панели инструментов в окне приложения.
* Touch UI Utilities API - Регистрация долгого прикосновения.
* Web Service Messaging APIs - расширение протокола SOAP.
* WLAN SDK Info API - позволит получить MAC адрес WLAN устройства.
* XML Engine Document Object Model (DOM) APIs - манипуляции DOM.
* XML Fragment API
Более подробная информация находится в S60 5th Edition C Developer\'s Library
Библиотеки Open C/C предустановлены в S60 5th edition.
В 5-й редакции реализован Advanced Multimedia Supplements (JSR-234)
Мидлеты (в том числе уже написанные для 3rd edition) получат поддержку TouchScreen.
Подробнее в Java ME Developer\'s Library
Разработчики Web и WRT widget\'ов помимо TouchScreen посредством JavaScript расширений получат доступ к:
* Менеджеру приложений
* Записям календаря
* Телефонной книге
* Логам
* SMS и MMS
* Медиа галереи
* Местоположению устройства
* Гео-меток (landmarks)
* Системной информации
* Сенсорам
Подробнее в Web Developer\'s Library
К такому же перечню получат доступ Flash Lite разработчики, т.к. на S60 5th edition предустановлен Flash Lite 3.0 с расширениями ActionScript
Взято с devmobile.ru
https://devmobile.ru/index.php?option=com_content&task=view&id=295&Itemid=2
https://snipurl.com/41wvt DimonVideo
Nokia недавно представила свой новый смартфон Nokia 5800 XpressMusic под управлением Symbian 9.4 Эта ОС является первой в новой 5-й редакции платформы S60 и знаменита [...] читать полностью
9919
взято отсюда
Долгожданная новость для разработчиков приложений на языке m. Наконец вышла 3-я версия интерпретатора mShell. В новом mShell появились следующие возможности:
* 2.03-1: Added OOP extensions.
* 2.03-2: Added graph.size(text,bounds).
* 2.03-3: Added graph.screen.
* 2.03-4: Added video module.
* 2.03-5: Increased I/O buffer size.
* 2.03-6: Improved output of arrays, class instances, function references.
* 2.03-7: Streamlined VM instruction set.
* 2.03-8: Added ui.mode.
* 2.03-9: Added Exif JPEG support to cam module.
* 2.04-1: Added code externalization (Compile command) and ability to execute externalized code (.mex files).
* 3.00-1: Refactored internals of mShell app to clarify separation.
* 3.00-2: Changed semantics of proc.close, proc.runs and proc.stop if there is no such process.
* 3.00-3: Extended semantics of proc.run.
* 3.00-4: Separation into environment and IDE for standalone application support.
* 3.00-5: Added mex2sis for sis generation.
* 3.00-6: Added support for changeable document directory and subfolders.
* 3.00-7: Added async module for asynchronous operation multiplexing.
* 3.00-8: Added accel module for S60 3rd Edition.
* 3.00-9: Added alpha channel support to module graph.
* 3.00-10: Added graphclip.
* 3.00-11: Added ui.xxxkey2 for UIQ four way navigation.
* 3.00-12: Added support to load and display PNG files with alpha channel.
* 3.00-13: Removed dynamic iwlib.dll on 2nd edition devices, which was sometimes causing conflicts with other SW depending on it.
* 3.00-14: Removed net.adr without parameters (obsolete, use net.local).
* 3.00-15: Rewrote directory synchronization to keep scripts always ordered.
* 3.00-16: UI command cleanup.
* 3.00-17: Fixed bugs.
mShell 3.0 можно скачать здесь. Стоит особо отметить функцию mex2sys. Теперь сгенерированные mShell .mex файлы можно превратить в полноценное приложение и поместить его в .sis с помощью web-сервиса https://www.m-shell.net/Makemsis.aspx
Блог разработчиков mShell.
https://devmobile.ru/index.php?option=com_content&task=view&id=292&Itemid=2
https://snipurl.com/41wqy DimonVideo
Простите за отсутствие перевода, но, думаю, программистам он особо и не нужен. Почему решил опубликовать новость? Потому что теперь у питона [...] читать полностью
4260
Предназначение модуля TopWindow заключается в создании окон графического интерфейса(отображаемых поверх остальных приложений) и управление этими окнами. Вся графика,которая должна быть выведена при помощи модуля помещается на созданное окно,при этом она обязательно должна быть создана при помощи graphics.Image. Непосредственно из модуля идет управление отображаемыми окнами(размеры,видимость,углы...)
Ддя начала работы импортируем модуль
import TopWindow
Для работы с окном необходимо создать экземпляр основного класса данного модуля.
window=TopWindow.TopWindow()
Данный класс имеет следующие методы:
show() - отображает созданное окно,пока не вызван данный метод окно остается невидимым;
Пример:
window.show();
hide() - скрывает созданное окно;
Пример:
window.hide();
add_image(image, position) - помещает изображение image(оно должно быть создано при помощи graphics.Image) с координатами position,при этом position имеет следующие свойства:
если координаты передаются в виде кортежа из 2 элементов (х,у) то изображение выводится без изменений,а координата считается левым верхним углом;
если координаты передаются в виде кортежа из 4 элементов (х1,у1,х2,у2), которые описывают левый верхний и правый нижний углы прямоугольника,то изображение выводится с размером,подогнанным под размер описанного координатами прямоугольника;
Пример:
window.add_image(image,(10,20));
window.add_image(image,(10,20,20,30));
remove_image(image) - удаляет изображение image(оно должно быть создано при помощи graphics.Image),при этом у метода есть необязательный аргумент position,который обладает свойствами position как и в add_image(). При отсутствие position объект удаляется полностью;
Пример:
window.remove_image(image);
window.remove_image(image,(10,10));
window.remove_image(image,(10,10,20,20));
position - координаты верхнего левого угла окна,которые можно задать по умолчанию;
Пример:
window.position=(width,height);
size - размер окна;
Пример:
window.size=(width,height);
images - список кортежей задаваемый по умолчанию для отображения картинок. Имеет вид images=, причем image - объекты graphics.Image, position обладает свойствами,как и в других методах;
Пример:
window.images = ;
shadow() - Тень, отбрасываемая окном. По умолчанию shadow()=0, то есть тень отсутствует. Чем больше значение shadow(), тем дальше тень от окна;
corner_type - тип углов окна может принимать следующие значения:
•square;
•corner1;
•corner2;
•corner3;
•corner5;
window.corner_type=\'type corner\';
maximum_size() - возвращает кортеж вида (ширина,высота),который является максимальным размером создаваемого окна. Неизменяем;
Пример:
window.maximum_size();
background_color - задает фоновый цвет окна;
Пример:
window.background_color=0х000000 - устанавливат черный цвет окна;
visible - Может принимать значение 1,для показа окна и 0,для его сокрытия. По сути те же show() и hide();
Пример:
window.visible=1 or 0.
Статья не претендует стать чем-то незаменимым для программиста.Это лишь перевод стандартной документации под моей редакцией.К статье есть небольшой скрипт-пример. На этом все. Оригинальная статья находиться на сайте: https://lenpro.ru с уважением Inferno1392.Прикрепленный файл: 1965_ex_topwindow.zip (4.07 кб) DimonVideo
TopWindow Предназначение модуля TopWindow заключается в создании окон графического интерфейса(отображаемых поверх остальных приложений) и управление [...] читать полностью
4075
https://symbian-freak.com/news/008/08/NS_Basic_for_Symbian_S60_and_UIQ_Devices_Released.htm вот здесь узнал, что выпущена среда разработки программ на симбу на бэйсике. Правда платная [...] читать полностью
4677
В прикрепленном файле текст статьи в html и в txt, а также некоторые скрипты к примерам.
Делаем плагины на Python
Автор: https://jenyay.net/
Введение
Многие программы поддерживают так называемые плагины (дополнение, расширения и т.п.), с помощью которых можно расширять функциональность программы. На Python делать программы, поддерживающие плагины особенно легко и приятно, потому что в качестве плагина могут выступать полноценные классы. Давайте посмотрим что нужно сделать, чтобы ваша программа тоже поддерживала плагины. Заодно убедимся как это легко.
Первый пример. Основные функции
Вначале давайте договоримся о структуре тестовых примеров. Модуль основной программы будет называться main.py, а плагины будут лежать в папке plugins, располагающейся рядом с этим файлом (то есть, если main.py находится , к примеру, в папке С:resource, то и папка plugins должна находиться там же.). Чтобы Python принял plugins за пакет, в нем должен находиться файл с именем __init__.py (в нашем случае он будет пустым).
Сначала представим, что динамически во время выполнения программы нам не нужно узнавать имя плагина и мы его знаем на этапе программирования. Пусть плагин имеет имя my_plugin.py и располагается в папке plugins. И пусть внутри файла my_plugin.py находится класс pluginClass, который содержит всю функциональность плагина. Вот его код:
class pluginClass(object):
def __init__(self):
pass
def run(self):
print u\"Hello, Plug-in!\"
В конечном итоге нам необходимо во время выполнения программы добраться до этого класса, создать его экземпляр и выполнить метод run. Для простоты на первое время договоримся, что в этом модуле нет других классов кроме pluginClass. Как бы мы поступили, если бы все имена (и модуля, и класса) были бы доступны во время программирования? Скорее всего вот так:
import plugins.my_plugin
cls = plugins.my_plugin.pluginClass()
cls.run()
И в результате получили бы сообщение \"Hello, Plug-in!\". А теперь вернемся к нашей задаче. Нам нужно сделать то же самое, но при этом имя модуля my_plugin и имя класса pluginClass хранится в соответствующих строковых переменных.
Импорт модуля плагина.
Аналогом встроенной директивы import является функция __import__ , она позволяет импортировать модули, имена которых на этапе написания программы неизвестны. У функции __import__ пять параметров, но обязательным является только первый. Необязательные параметры в данной статье мы использовать не будем, поэтому про них умолчим. Итак, единственный обязательный параметр - это имя пакета или модуля, который мы хотим импортировать. Если импорт пройдет удачно, функция возвратит экземпляр класса, который хранит все импортированные элементы.
Начнем с импортирования модуля. Директива import нам не поможет. Зато мы можем воспользоваться функцией __import__ . Аналогом первой строки из записанного выше примера будет следующий код:
package_obj = __import__(\"plugins.my_plugin\")
После этого переменная package_obj станет экземпляром класса загруженного модуля (пакета) plugins. Чтобы убедиться в этом выполним команду:
print package_obj
( ! : в интерактивном режиме команда print необязательна, при вызове переменной интерпретатор \"по-умолчанию\" возвращает содержимое объекта, ссылка на который помещена в эту переменную путём операции присваивания \"=\")
При этом мы получим что-то вроде (путь, разумеется, может быть другой):
Это сообщение мало информативно, поэтому применим к переменной package_obj встроенную функцию dir, которая возвращает имеющиеся в package_obj атрибуты. Итак, выполним следующий код:
print dir(package_obj)
В результате на экран выведется такой список:
Обратите внимание на последний элемент списка - это и есть наш плагин. Итак, пакет мы загрузили, но как нам добраться до модуля нашего плагина? Для этого сначала воспользуемся встроенной функцией getattr, которая позволяет получить из модуля или пакета (в нашем случае package_obj) экземпляр класса атрибута (а нашем случае my_plugin). Эта функция принимает два параметра: соответственно экземпляр объекта, атрибут которого надо получить и строковую переменную, которая содержит имя атрибута. Применяя функцию getattr на пакет, в случае успеха мы получим экземпляр загруженного модуля. Выполним следующий код:
module_obj = getattr(package_obj, \"my_plugin\")
print module_obj
Если все прошло удачно, на экране мы увидим примерно такой результат:
Но скорее всего в программе придется загружать не один плагин, а несколько. Как в этом случае поведет себя функция __import__ ? Рассмотрим пример, в котором загружаются два плагина (все они должны находиться в папке plugins; проще всего сделать копию my_plugin.py и переименовать оба файла.).
modulename1 = \"my_plugin_1\"
modulename2 = \"my_plugin_2\"
classname = \"pluginClass1\"
package_obj = __import__(\"plugins.\" modulename1 )
package_obj = __import__(\"plugins.\" modulename2 )
print dir(package_obj)
В результате на экране вы увидите следующий результат:
В этом примере результат импорта мы каждый раз присваиваем одной и той же переменной. Но в результате после каждой операции импорта в нее добавляется новый импортированный модуль.
Получаем доступ к классу
Итак, модуль my_plugin мы загрузили ( т.е. теперь в папке plugins опять должен находиться только один файл - my_plugin.py ). Осталось добраться до класса, который содержится внутри. Для этого воспользуемся уже знакомой нам функцией dir и убедимся, что внутри действительно хранится наш класс:
print dir(module_obj)
В результате выполнения этого кода получим:
Как видим, класс pluginClass действительно содержится внутри module_obj. Снова воспользуемся функцией getattr:
obj = getattr(module_obj, \"pluginClass\")
В принципе, уже после этого мы можем сделать экземпляр класса pluginClass, но для начала сделаем небольшую проверку того, что мы получили. Убедимся, что полученный объект действительно является классом, причем классом, производным от object. Для этого воспользуемся встроенной функцией issubclass. Как ее использовать ясно из следующего кода:
if issubclass(obj, object):
a = obj()
a.run()
else:
print u\"Not class\"
Если все сделано правильно, то в результате мы увидим сообщение \"Hello, Plug-in!\"
И все вместе
Теперь для наглядности сведем вместе весь код, что мы раньше написали. В комментариях после операторов print приведено то, что они выведут на экран.
modulename = \"my_plugin\"
classname = \"pluginClass\"
package_obj = __import__(\"plugins.\" modulename )
print package_obj
#
print dir(package_obj)
#
module_obj = getattr(package_obj, modulename)
print module_obj
#
print dir(module_obj)
#
obj = getattr(module_obj, classname)
if issubclass(obj, object):
print obj
#
a = obj()
print a
#
a.run()
else:
print u\"Not class\"
Второй пример, приближенный к реальности
В этом примере мы заранее не будем знать ни имена модулей плагинов, ни имена классов, содержащихся внутри. А так же потребуем, чтобы все плагины были производными от базового класса baseplugin. В папке plugins кроме файла __init__.py (напоминаю, пустого) лежат еще три модуля. Один из них с именем base.py содержит в себе базовый класс:
class baseplugin (object):
def run(self):
pass
Во втором модуле my_plugin_1.py содержится один класс:
import base
class pluginClass1(base.baseplugin):
def __init__(self):
pass
def run(self):
print u\" Hello, first plug-in!\"
А в третьем my_plugin_2.py два класса:
import base
class pluginClass2(base.baseplugin):
def __init__(self):
pass
def run(self):
print u\" Hello, second plug-in!\"
class pluginClass3(base.baseplugin):
def __init__(self):
pass
def run(self):
print u\" Hello, third plug-in!\"
Ниже располагается код, который получает имена всех файлов в папке plugins. Затем импортирует найденные модули (кроме файлов base.py и __init__.py). После этого перебирает все атрибуты внутри каждого импортированного модуля, создает экземпляры найденных внутри классов, производных от base.baseplugin и выполняет метод run.
import os
plugin_dir = \"plugins\"
import plugins.base
# Сюда добавляем имена загруженных модулей
modules =
# Перебираем файлы в папке plugins
for fname in os.listdir(plugin_dir):
# Нас интересуют только файлы с расширением .py
if fname.endswith(\".py\"):
# Обрежем расширение .py у имени файла
module_name = fname
# Пропустим файлы base.py и __init__.py
if module_name != \"base\" and module_name != \"__init__\":
print u\"Load module \" module_name
# Загружаем модуль и добавляем его имя в список загруженных модулей
package_obj = __import__(plugin_dir \".\" module_name)
modules.append(module_name)
print u\"dir(package_obj) = \" str(dir(package_obj) )
else:
print u\"Skip \" fname
# Перебираем загруженные модули
for modulename in modules:
module_obj = getattr(package_obj, modulename)
print modulename
print dir(module_obj)
# Перебираем все, что есть внутри модуля
for elem in dir(module_obj):
obj = getattr(module_obj, elem)
# Создаем экземпляр и выполняем функцию run
a = obj()
a.run()
Во время выполнения скрипт выводит дополнительную информацию о ходе работы. В результате на экране будут выведены следующие сообщения:
Skip base.py
Load module my_plugin_1
dir(package_obj) =
Load module my_plugin_2
dir(package_obj) =
Skip __init__.py
my_plugin_1
Hello, first plug-in!
my_plugin_2
Hello, second plug-in!
Hello, third plug-in!
Плагины и py2sis (отредактировано)
Делаем sis
Сейчас мы научимся работать с плагинами и в том случае, если программа распространяется в виде приложения.
Для начала рассмотрим простой пример, состоящий из основного скрипта main.py и одного плагина plugin.py, расположенного в папке plugins; main.py и папка plugins ( не забудьте, кроме plugin.py в ней должен находиться также пустой файл __init__.py ) поместите в папку resource на диске C .
Основной скрипт (main.py):
import appuifw
modulename = \"plugin\"
classname = \"pluginClass\"
package_obj = __import__(\"plugins.\" modulename )
print dir(package_obj)
module_obj = getattr(package_obj, modulename)
print dir(module_obj)
obj = getattr(module_obj, classname)
def import_plugin():
if issubclass(obj, object):
a=obj()
a.run()
else:
appuifw.note (u\"Not class\", \"error\")
def exit():
if appuifw.query(u\"You want exit?\", \"query\")==1:
appuifw.app.set_exit()
appuifw.app.menu =
И исходник плагина (plugin.py):
class pluginClass(object):
def __init__(self):
pass
def run(self):
from appuifw import note
note (u\"Hello, Plugin!\", \"conf\")
Если запустить файл main.py, то в консоли увидим следующее:
Hello, Plugin!
Для того, чтобы сделать sis-пакет, воспользуемся замечательной программой SmartSIS v.2.2 by smart4n:
Сразу оговорюсь, что я сам начал осваивать её только недавно (во время редактирования этой статьи), поэтому вполне допускаю, что некоторые производимые мною манипуляции можно упростить. Также у меня нет сведений о том, как выглядят и работают предыдущие и последующие версии.
Итак, запускаем программу. Те, кто знаком с ней, могут смело пропускать этот абзац. Прежде всего нужно настроить программу под себя любимого(ую):
1.) Заходим в \"Функции\": если меню на английском, ищем пункт Settings -> \"Language\" -> \"Russian\" -> \"Функции\" -> \"сохранить\" -> \"Назад\" и перезапускаем SmartSIS, о необходимости чего нас любезно и уведомляет программа.
2.) Запускаем SmartSIS, -> \"Функции\" -> \"Настройки\" и начинаем настраивать:
Рабочее место - С: или Е: - здесь всё просто: где у вас больше свободного места, тот диск и указывайте.
Оповещение - выбор способа оповещения об успешном завершении операции - определяется исключительно вашими кулинарными, музыкальными или даже, прошу прощения, сексуальными предпочтениями, одним словом, на усмотрение пользователя.
\"Убить\" заставку - почему-то рекомендуется поставить \"Да\", иначе, мол, программа зависнет - я предпочёл принять этот совет к действию.
Режим упаковки - определяет поведение программы, подробнее смотри \"Помощь\" -> \"справка\" ( в ней, кстати, есть всё, что я сейчас объясняю ) - здесь я ориентируюсь на \"Пошаговый мастер\".
Язык - выбор языка интерфейса - с этим пунктом мы уже знакомы.
Автоподпись - да, SmartSIS умеет ещё и подписывать только что созданные sis-пакеты, конечно, если у вас есть свой сертификат и ключ - если вы выберете \"Да\", тогда в оставшихся двух пунктах укажите полные пути к сертификату и ключу: например, E:certmycert.cer и E:keymykey.key. Правда, у меня не получилось наладить devcert-подпись в SmartSIS, и я пользуюсь MobileSigner by Leftup.
Настроив SmartSIS, запускаем X-plore, помещаем main.py в корень диска С (для простоты).
Также нужно создать на диске Е папку project, в ней создать папку C, в которой, в свою очередь, создаем папку resource, и в неё наконец помещаем нашу папку plugins. Таким образом путь к ней будет выглядеть так:
E:projectCresourceplugins.py.
Теперь идём в папку smartSIS на том диске, который вы определили как рабочий.
В ней создаём текстовый файл py2sis.pkg, содержащий 13 строк:
C:main.py_плюс_E:project
main
1.0.0
0x7f7e8f69
C
Vendor
default
nocaps
noautostart
None
RU
noautorun
nohidden
Пояснения (по справке SmartSIS):
1.) полный путь к скрипту дополнительные файлы(никаких пробелов между именами файлов и знаком _плюс_);
2.) название программы, которое вы будете видеть при установке программы и в меню смартфона;
3.) версия программы: major.minor.build - обязательны 3 числа (можете поставить хоть 12345.85746353.04049.98858) и точки (можно использовать запятые) между ними;
4.) UID sis, записывается в шестнадцатиричном виде;
5.) имя диска, на который будут устанавливаться необходимые файлы для скрипта;
6.) имя поставщика, то бишь автора. Обязательно замените на своё :-);
7.) полный путь к иконке в SVG или MIF формате, default указывает на стандартную иконку Python;
8.) caps - для devcert приложения, nocaps - для selfcert приложения;
9.) наш sis-пакет не будет иметь функцию автозагрузки при запуске системы;
10.) если вы хотите, чтобы при установке отображался какой-нибудь текст (например, копирайт автора), то укажите полный путь к текстовому файлу (кодировки Win 1251, Unicode, utf-8) размером не более 1-го кбайта (Nоnе означает, что по-умолчанию текст отсутствует);
11.) код языка с которым будет упакован sis-пакет;
12.) программа НЕ будет запускаться автоматически после установки sis-пакета;
13.) программа НЕ будет скрытой в меню.
Для получения более подробной информации читайте справку в SmartSIS.
Создав py2sis.pkg, возвращаемся в SmartSIS.
Выбираем \"Функции\" -> \"Инструменты\"
-> \"py2sis\". Если вы не допустили ошибок, py2sis запустится и выдаст информацию, извлечённую из py2sis.pkg. Проверьте её, если всё правильно (обратите особое внимание на то, включена ли папка plugins и её содержимое в список), то \"Функции\" -> \"Упаковать\". После окончания упаковки вы увидите, полный путь к упакованному sis-пакету.
Возвращаемся в X-plore и в папке !:smartSISpacked находим наш sis-пакет, который можно сразу устанавливать, если вы доверили SmartSIS подпись, в противном случае подписываете сами. Далее идём в меню смартфона, запускаем нашу программу main -> \"Функции\" -> \"Import plugin\" и убеждаемся, что не напрасны были наши труды.
Естественно main.py и plugin.py можно изменять, причём если в случае изменения main придётся повторять упаковку, то plugin.py изменять очень просто: идём в папку !:resourceplugins, открываем plugin.py, редактируем (например, пишем вместо \"Hello, Plugin!\" - \"Hello, User!\") и, вуаля, мы имеем новый плагин с новой функциональностью (:-), в чём можно убедиться, повторив \"Import plugin\" !
Таким образом, мы с вами сделали, грубо говоря, своеобразную программу-оболочку, которая, не имея почти никакой функциональности, тем не менее за счёт возможности импорта плагина может свою функциональность расширять, причём делать это, согласитесь, довольно удобно.
Плагины и дополнительные модули
Давайте теперь сделаем полноценное приложение из примера, рассмотренного в разделе \"Второй пример, приближенный к реальности\", но с небольшим усложнением. Предположим, что один из плагинов импортирует другой модуль Python, который не импортирует основная программа. Пусть, для примера, одному из плагинов понадобится библиотека Xoltar toolkit (автор Bryn Keller)( я недавно выкладывал в раздел Документация/статьи 3 статьи о функциональном программировании на Python (автор David Mertz), кому интересно - можете поискать), а конкретно её модуль functional. В этом случае его код будет выглядеть вот так:
import base
import functional
from appuifw import note
class functionalpluginClass(base.baseplugin):
def __init__(self):
pass
def run(self):
note(u\" Hello, FP!\", \"conf\")
Заключение
Итак, мы научились делать так, чтобы наша программа умела динамически загружать модули (плагины), а также сделали полноценное приложение. Вот, собственно, и все, что хотелось рассказать :-)
Статья скачана с сайта https://www.realcoding.net/ , адаптирована (там, где нужно и можно было это сделать) для Python S60 мною.
К сожалению, последнюю часть материала пришлось изменять, так как в ней идёт речь о том, как сделать windows-приложение с помощью библиотеки py2exe (что несколько неактуально для смартфонов :-), пришлось обдумывать \"наш ответ капитализму\" :-)
Спасибо автору за написанную статью, обязательно посмотрите оригинал.
#------- Удачи! -------#Прикрепленный файл: 1936_make_plugins..zip (20.20 кб) Virtuos86
Представляю вашему вниманию интересную статью про Python. Статья не моя (хотя кое-где я над ней поработал, надеюсь не в ущерб содержанию). В прикрепленном [...] читать полностью
8186
Дальнейшее для людей опытных не будет ново и предназначено для тех кто даже не знает с чего начать.
Итак нам понадобится программа SmartSIS и текстовый редактор, лучше использовать DEdit так как если редактировать хплоре то растет размер файла да и кодировки не надо менять. Извлекаем automan из архива и распаковываем SmartSIS ом (предварительно желательно настроить чтоб распаковывало на карту памяти обычно в теле итак места мало)
далее идем по пути диск куда распаковалиSmartSIS
UNPACKEDSYMBIAN9private20202020 и видим там файл default.py в целях экономии времени и количества действий переносим его на диск СSmartSIS. Далее заходим в DEdit и открываем наш default.py ищем в нем строку file=open(main.path \'autorun.txt\',\'r\') (можно через поиск но это почти в самом конце файла) и меняем autorun.txt например на Avtozapysk.txt
или любое другое имя но помните что только английскими буквами, сохраняем наш файл.
Далее все темже DEdit-ом открываем лежащий на СSmartSISPKGs файл py2sis.pkg можете стереть все что там и вставить то что написано ниже
C:smartSISdefault.py
Avtozapysk
1.0.0
0x20202021
C
Ajt0
default
caps
noautostart
C:smartSIStext.txt
EN
noautorun
nohidden
теперь немного пояснений первая строка это путь к скрипту который будет использоваться для создания приложения.
Avtozapysk название вашей мини программы :) чтоб вы потом сами не запутались что у вас какой скрипт запускает
1.0.0 версия программы
0x20202021 юид можете написать любой или использовать за основу
текущий лиш слегка его изменяя как на примере важно чтобы он не совпадал с юидом установленной ранее программы иначе выдаст ошибку обновления
все остальное лучше
C диск куда ставится программа
Ajt0 здесь можете написать свое имя если только не собираетесь это давать на общее пользование в противном случае поставьте имя автора программы (чужой труд надо уважать)
caps это права доступа
остальное лучше оставить так как есть. Сохраняем файл и выходим из редактора.
Запускаем SmartSIS жмем функцииинструментыpy2sisфункциивыбрать PKG файл
и идем по пути СSmartSISPKGs и выбираем наш py2sis.pkg далее проверяем то ли мы открыли и все ли нас устраивает и жмем функцииупаковать.
Вот в принципе и все наш клон готов к установке и употреблению. Нам осталось теперь только создать текстовый файл с именем Avtozapysk, создать и отладить скрипт и прописать его в этот самый текстовый файл. Все теперь у нас полностью рабочий клон который можно всегда отредактировать и который не будет конфликтовать с automan
в прикрепленном файле оригинал статьи в txt
Прикрепленный файл: 1926_klon..zip (1.98 кб) Ajt0
Думаю многие уже оценили те возможности что дает нам эта программа и многих огорчает невозможность задать в автозапуск при включении automanа [...] читать полностью
4750
И тaк, нeмнoгo o фyнкции e32.start_exe.
Дaннaя фyнкция пoзвoляeт зaпycкaть пpoцeccы. Для иcпoлнeния этoй фyнкции нeoбxoдимo 2 пapaмeтpa: пepвый - этo имя exe пpoгpaммы (пpимep z:\\\\system\\\\programs\\\\apprun.exe; ecли пpoгpaммa лeжит в пaпкe :\\\\system\\\\programs\\\\ любoгo диcкa, тo мoжнo пpocтo apprun.exe), втopoй - этo кoмaнднaя cтpoкa. Этoт пapaмeтp пepeдaeтcя в пpoцecc. Пример для apprun.exe - z:\\\\system\\\\apps\\\\browser\\\\browser.app. Кстати возможны также сокращения browser.app и browser.
Теперь об открытии файлов, url.
Многие передают параметр так: путь_к_апп_файлу-пробел-двойная_ковычка-путь_к_файлу-двойная_ковычка. Хотя на самом деле вместо первой ковычки (вторая вовсе не нужна) нужно ставить символ: B, O, R или V. B - это открытие программы в фоне, что другие делают - не знаю, но предполагаю, что O - open (открытие файла), R - read (чтение), V - что-то вроде временного файла. Примеры
e32.start_exe(\'apprun.exe\', \'browser\')
e32.start_exe(\'apprun.exe\', \'z:\\\\system\\\\apps\\\\browser\\\\browser.app B\')
e32.start_exe(\'apprun.exe\', \'z:\\\\system\\\\apps\\\\browser\\\\browser.app Oc:\\\\test.html\')
Да и еще, для автозапуска питоновских процессов используют второй app файл (первый это настройки и т.д.). В этом нет необходимости, если с помощью программы autoexec к файлу python_launcher.exe передать путь к своему скрипту.
Еще, известно что модуль btswitch.pyd не на всех телефонах включает BlueTooth корректно. Для этого можно использовать программу TongleBT:
e32.start_exe(\'apprun.exe\', \'e:\\\\system\\\\apps\\\\tonglebt\\\\tonglebt.app B\'). Причем вы не увидите моргания дисплея как это происходит при запуске из меню.
Вроде все сказал, жду отзывов. DimonVideo
B этoй cтaтьe я xoчy paccкaзaть интepecнyю, coбpaннyю мнoй в пpoцecce иcпoльзoвaния смартфона инфopaцию. Многое вы знаете, но думаю не все. Oб oшибкax в статье пишeм [...] читать полностью
5346