Как создать программу на python с интерфейсом для Андроид

Мобильная разработка приложений вскоре обгонит компьютерную. Такая тенденция обрела устойчивый характер. Поэтому каждый разработчик рано или поздно столкнется с необходимостью создавать приложение для iOS или Android. К сожалению, встроенных инструментов в стандартную поставку языка для создания мобильных приложений нет.

Тем не менее, есть пакеты, которые могут применяться для создания приложений для смартфонов. К таковым относится Kivy. Сегодня сделаем общий обзор базовых возможностей этой среды. Вообще, библиотеки – это главные элементы мира мобильных приложений, создаваемых с использованием Python.

Фреймворк Kivy Python – ключевые особенности

Kivy – это фреймворк, созданный в 2011 году. Его главным преимуществом является мультиплатформенность. Поддерживаются операционные системы Windows, Mac, Linux, Raspberry Pi.

Помимо привычного для разработчика ПО для компьютеров ввода с использованием мыши и клавиатуры, в Kivy поддерживается ввод через сенсорный экран (в том числе, выполненный по технологии Multitouch). Более того, есть поддержка GPU-ускорения графики благодаря интеграции с OpenGL ES2. У библиотеки есть лицензия MIT, что позволяет бесплатно использовать ее. Но платные компоненты этого программного средства также имеются.

Кратко про Python Tkinter | Как создавать GUI Приложения

В процессе создания программы Kivy генерируется интуитивно понятный пользовательский интерфейс. Главное, чтобы у пользователя не появилось необходимости дополнительно обучаться. Сразу после запуска приложения должно быть понятно, что делать дальше.

Нативных элементов управления (виджетов) нет, все настраивается. Это делает возможным создание универсального интерфейса для разных платформ. Но это же может быть недостатком. Ведь нативное ПО сразу становится интуитивно понятным.

Как установить Kivy?

Поскольку в Kivy есть большое количество зависимостей, рекомендуется его устанавливать в виртуальную среду Python. Также можно пользоваться встроенной библиотекой venv либо пакетом virtualenv .

Виртуальная среда Python создается так:

$ python3 -m venv my_kivy_project

По ходу выполнения этого действия файл Python скопируется в папку, которая будет называться my_kivy_project , где также будет несколько других папок.

Чтобы была возможность использовать виртуальную среду, ее необходимо активировать сначала. На операционных системах с ядром Unix можно это сделать, выполнив следующую команду.

$ source bin/activate

Учтите, что вы в этот момент должны находиться в каталоге my_kivy_project.

В случае с Windows, команда аналогичная, но активация скрипта должна осуществляться в другом месте – используя папку Scripts, а не bin.

После того как активируется среда Python, можно запустить pip, чтобы установить Kivy. На системах Unix для этого выполняется такая инструкция.

Shell $ python -m pip install kivy

На Windows установить немного труднее. В документации необходимо изучить соответствующий пункт .

Пользователи Mac также могут установить Kivy, используя файл dmg .

Изучение TKinter за 8 минут / Разработка GUI программы на Python

Во время инсталляции могут возникнуть проблемы. Чтобы их исправить, необходимо на странице загрузки ознакомиться с отдельными инструкциями по каждой из них.

Что такое виджеты в Kivy?

Понятие виджетов в Kivy несколько отличается от такого в ОС Android и iOS. Под ними подразумеваются элементы управления и интерфейса, которые могут отображаться пользователю или использоваться им.

Примеры виджетов: кнопки, выпадающие списки, вкладки. Фреймворк Kivy содержит большое количество виджетов.

Запуск приложения «Hello, Kivy!»

Чтобы понять, как происходит работа с этим фреймворком, обратите внимание на такую программу.

from kivy.app import App from kivy.uix.label import Label class MainApp(App): def build(self): label = Label(text=’Hello from Kivy’, size_hint=(.5, .5), pos_hint=) return label if __name__ == ‘__main__’: app = MainApp() app.run()

Каждая программа, написанная с помощью Kivy, должна содержать подкласс App. Также разработчик должен переопределить метод build() .

Здесь размещается код пользовательского интерфейса либо осуществляется вызов других функций, определяющих код UI. В этом примере создается виджет Label и передаются такие аргументы, как text, size_hint, pos_hint . Последние два являются опциональными.

size_hint используется для передачи Kivy размеров виджета. Используется два значения:

  • x . Ширина элемента.
  • y . Высота элемента.

Каждое из чисел должно иметь значение, которое находится в диапазоне от 0 до 1. Значение каждого из этих показателей по умолчанию равняется единице. Помимо этого, возможно использование pos_hint , который нужен, чтобы задать месторасположение виджета в интерфейсе.

В приведенном выше фрагменте кода передается информация, что виджет должен размещаться в центре осей x и y .

Kivy - Создание мобильных приложений на Python (Часть 1)

Чтобы запустить программу, необходимо выполнить инициализацию класса MainApp и осуществить вызов метода run() . После того как будут совершены эти действия, на экране отобразится такой текст.

Kivy - Создание мобильных приложений на Python (Часть 1)

Kivy также выводится большое количество текста в stdout , который может использоваться во время отладки программы.

Теперь давайте добавим виджет Image и проанализируем его отличия от Label .

Что делает виджет Image в Kivy?

Kivy содержит несколько разновидностей, связанных с изображениями виджетов. Чтобы открывать картинки, расположенные на жестком диске, используется Image, а если изображение загружается из интернета, AsyncImage . Мы для примера будем использовать стандартный элемент Image .

from kivy.app import App from kivy.uix.image import Image class MainApp(App): def build(self): img = Image(source=’/path/to/real_python.png’, size_hint=(1, .5), pos_hint=) return img if __name__ == ‘__main__’: app = MainApp() app.run()

Этот код импортирует изображение из подпакета kivy.uix.image . Вообще, у класса Image большое количество различных параметров. Тем не менее нас интересует только source , который указывает на конкретную картинку, которая будет загружаться. Здесь задается полный путь к выбранной картинке. Остальная часть кода не отличается от предыдущего примера.

Kivy - Создание мобильных приложений на Python (Часть 1)

После того как мы выполним этот код, результат будет следующим.

Читайте также:
Лучшая программа на Андроид для создания видео из фотографий

Таким образом, текст из прошлого примера был заменен на изображение.

Теперь посмотрим, что делать для добавления и правильного расположения нескольких виджетов в программе.

Понятие разметки в Kivy

Каждый фреймворк имеет собственный метод, по которому осуществляется размещение виджетов. Например, wxPython задействует классификаторы, а Tkinter использует менеджер геометрии. В Kivy есть такое понятие, как Лейаут. Оно означает способ размещения виджетов, который используется в Kivy.

Лейаутов бывает несколько видов:

  1. BoxLayout.
  2. FloatLayout.
  3. GridLayout.

Найти полный перечень лейаутов, которые доступны в этом фреймворке, можно в документации .

Приведем такой фрагмент кода в качестве примера для BloxLayout.

import kivy import random from kivy.app import App from kivy.uix.button import Button from kivy.uix.boxlayout import BoxLayout red = [1,0,0,1] green = [0,1,0,1] blue = [0,0,1,1] purple = [1,0,1,1] class HBoxLayoutExample(App): def build(self): layout = BoxLayout(padding=10) colors = [red, green, blue, purple] for i in range(5): btn = Button(text=»Button #%s» % (i+1), background_color=random.choice(colors) ) layout.add_widget(btn) return layout if __name__ == «__main__»: app = HBoxLayoutExample() app.run()

Здесь осуществляется импорт модуля BoxLayout , после чего он устанавливается. Затем создается перечень цветов RGB-палитры.

В результате образовывается цикл для range из 5, вследствие чего появляется по кнопке btn для каждой итерации. Давайте теперь сделаем интерфейс интереснее и изменим фон кнопки на случайный цвет.

А потом добавим кнопку в лейаут с использованием layout.add_widget ( btn) .

Kivy - Создание мобильных приложений на Python (Часть 1)

После того как код запустится, результат будет приблизительно следующим.

Поскольку кнопки здесь окрашиваются в случайные цвета, то у вас результат будет отличаться.

Нужно учитывать такие аргументы:

  1. Отступ между лейаутом и дочерними объектами. Он записывается в пикселях. Есть несколько способов, которыми можно его задать:
  • Список из четырех аргументов: [padding_left, padding_top, padding_right, padding_bottom].
  • Список из двух аргументов: [padding_horizontal, padding_vertical].
  • Один аргумент: padding=10 .

2. Spacing . Этот аргумент добавляет расстояние между виджетами, которые относятся к определенному лейауту.

3. Orientation . Изменяет значение orientation для BoxLayout по умолчанию – с горизонтального на вертикальное.

События в Kivy

События – один из центральных элементов Kivy. Они позволяют, например, выполнять определенные действия при нажатии клавиш, кнопок мыши либо тапа по дисплею. А если требуется вызвать функцию в будущем, используется концепт часов ( Clock) .

Также каждый элемент имеет свойства, которые работают вместе с EventDispatcher . С их помощью выполняется проверка достоверности. Также они запускают события, когда происходит изменение позиции виджета либо его размера.

Вот как работают события в Kivy.

from kivy.app import App from kivy.uix.button import Button class MainApp(App): def build(self): button = Button(text=’Hello from Kivy’, size_hint=(.5, .5), pos_hint=) button.bind(on_press=self.on_press_button) return button def on_press_button(self, instance): print(‘Вы нажали на кнопку!’) if __name__ == ‘__main__’: app = MainApp() app.run()

Источник: office-guru.ru

Создание и управление интерфейсом на Android с помощью Python

16:23 12-02-2013 HeaTTheatR

Создание и управление интерфейсом на Android с помощью Python

Создание и управление интерфейсом на Android с помощью Python

Добрый день.
Хотел бы предоставить на ваш суд свою первую статью о программировании на Python под Android. Сразу оговорюсь, что я не специалист в этой области, учусь вместе с вами. Как и многие из нас, начинал писать приложения на старой доброй OS Symbian. Однако прогресс не стоит на месте, и на смену старому всегда приходит новое. Вот с этим новым мне и пришлось столкнуться, когда я приобрел HTC Wildfire на платформе Android.
Разобравшись с новым устройством, я решил, что, наконец, пришло время установить полюбившийся многим интерпретатор языка программирования Python .
В Интернете наткнулся на SL4A (Scripting Layer For Android) — оболочку, которая, позволяет создавать и запускать скрипы,
написанные на различных языках
сценариев (Python, Perl, Ruby, Lua, BeanShell, javascript и Tcl) прямо на Android — устройствах. Описывать работу с этой оболочкой я не буду, поскольку ниже есть ссылка на соответствующую статью от «Питон на Android. Начало».
Наверное, ни для кого не секрет, что «родные» приложения для Android пишутся на Java (не путайте с платформой Java2ME). Так вот, сценарии, написанные с помощью SL4A, имеют доступ ко многим API, доступным для нормального Java приложения, но с упрощенным интерфейсом.
Установил, проверил, стало грустно. Потому что, если на Symbian Python был чуть ли не всемогущ, и зачастую приложение, написанное на нем, не уступало аналогам на Си, то на Android, сделать что-то большее, чем общение с пользователем посредством диалоговых окон или запуск скрипра в фоновом режиме, увы, не удастся.

С другой стороны мы имеем модуль android, который позволяет программисту создавать все те же диалоговые окна, selection list, вызывать прогресс бар, отправлять/читать сообщения и многое другое. То есть с его помощью мы имеем доступ практически ко всем необходимым для разработки приложения функциям смартфона. Но! Мы не имеем возможности создать более менее приличный интерфейс к нашим приложениям. К счастью, все это заблуждение!
На платформе Android Python-программист имеет возможность создавать интерфейс пользователя двумя способами. Первый — с помощью функции из модуля android webViewShow, которой в качестве аргумента передается строка, путь к html-документу, который и будет интерфейсом приложения.

Все события такого приложения будут передоваться в Python-сценарий с помощью кода на Java-script в html-странице интерфейса приложения. Подробнее о webViewShow можно прочитать в статье от пользователя Zaterehniy Питон на Android. Начало . Однако должен сказать, что у этого способа создания интерфейса есть огромный минус — html перестает отвечать на действия пользователя буквально после нескольких обработанных событий. Увы, но это так. К счастью у нас есть второй, на 100% действенный, способ
создания пользовательского
интерфейса — fullScreenUI.
Начиная с версии SL4A_r5, появился новый, как заявили разработчики, пока что
экспериментальный, способ создания пользовательского интерфейса — fullScreenUI. FullScreenUI позволяет создавать интерфейс, используя стандартные виджеты Android (кнопки,
текстовые поля, радиокнопки, и
проч.), а также обрабатывать события от них.
Весь интерфейс нашего приложения, как и в «родной» программе на Java, будет описан в xml-макете, код же самого сценария будет записан в отдельном файле. Android-разработчики используют два определения термина «макет». Первое — тип ресурса, определяющий то, что будет на экране. Макеты хранятся в виде xml-файлов в /res/layout директории приложения. Второе определение: макет — это просто шаблон для экрана пользовательского интерфейса, компановка тех или иных элементов, которые будет видеть пользователь.
В xml-контейнере мы лепим визуальную часть приложения: здесь будет текстовое поле, оно будет черного цвета, внизу будет кнопка с надписью «Сохранить», она будет зеленого цвета и так далее. На самом деле это очень удобно, поскольку мы отделяем интерфейс от кода нашей программы. В этой статье я не буду вдаваться в подробности xml разметки на Android, а всего лишь покажу как управлять этими елементами из сценария на языке Python.
Более подробно об xml разметке на Android вы можете прочитать здесь .
Все примеры, которые я приведу в этой статье, используют droidInterface.py — оболочку для работы с модулем android. Оболочку я пишу для себя, потому что мне так проще, это не конечный результат, и если вы не испытываете затруднений с использованием модуля android, она вам не нужна, перепишите примеры под оригинальный API.
Итак, начнем. Все сценарии у меня лежат в

Читайте также:
Как написать программу для Mac OS

/sdcard/sl4a/scripts/ExampleUI

У вас они могут находится где угодно. Создадим папку нашего первого примера. Назовем ее Example. В этой папке создайте папку ресурсов res, в которой будет подпапка layout.

Я всегда придерживаюсь данной структуры приложения, чего и вам советую. В итоге у вас должна получится директория

/sdcard/sl4a/scripts/Exampe/res/layout

encoding=»utf-8″?>
android:layout_width = «fill_parent»
android:layout_height= «fill_parent»
android:orientation =»vertical»
xmlns:android=»https://schemas.android.com/apk/res/android»>
android_layout_width= «wrap_content»
android:layout_height=»wrap_content»
android:text = «Button 1″/>
android_layout_width= «wrap_content»
android:layout_height=»wrap_content»
android:text = «Button 2″/>
android_layout_width= «wrap_content»
android:layout_height=»wrap_content»
android:text = «Button 3″/>

А вот сам Python сценарий:

# demo.py
import sys
import os

import droidInterface

droid = droidInterface.droid
fullway = os.path.dirname(__file__)

droidInterface.set_menu([(«Exit», «ic_menu_close_clear_cancel»)])

droid.fullShow(open(«%s/res/layout/main.xml»%(fullway)).read())

while True:
event = droid.eventWait().result
if event[«name»] == «Exit»:
sys.exit()
else:
droidInterface.note(str(event))

Вот, что у нас получилось:

Теперь немного о самом коде.

import droidInterface

— оболочка для работы с модулем android.

droid = droidInterface.droid

— переменной droid присваиваем экземпляр класса Android, который определен в модуле droidInterface; через droid мы будем работать со стандартным API.

fullway = os.path.dirname(__file__)

— получаем полный путь к папке с нашим сценарием.

droidInterface.set_menu([(«Exit», «ic_menu_close_clear_cancel»)])

— вешаем на кнопку «menu» наше меню ;первый аргумент — название пункта, второй — имя используемой иконки; если мы хотим меню из нескольких пунктов, тогда нам нужно передать в функцию set_menu список кортежей:

droidInterface.set_menu([(«Имя пункта», «имя иконки»), («Имя пункта2″, » Имя иконки2″)])
droid.fullShow(open(«%s/res/layout/main.xml»%(fullway)).read())

— думаю здесь понятно, метод fullShow принимает строку с нашим макетом интерфейса;

while True:
event = droid.eventWait().result

— функция droid.eventWait останавливает сценарий и ждет действий от со стороны пользователя; результатом выполнения (переменная event) будет ассоциативный массив с именем события и информацией о нем;

if event[«name»] == «Exit»:
sys.exit()

— для начала проверяем значение event[«name»], если оно равно «key», то была нажата кнопка, код
которой можно узнать из event [«data»][«key»] ; если же оно равно
«click», то было нажатия на один из виджетов, id которого можно узнать из event[«data»][«id»] ; посмотрите содержимое появляющегося окошка, проанализируйте.

Теперь давайте попробуем динамически изменить наш интерфейс.

# demo.py
import os
import sys

import droidInterface

droid = droidInterface.droid

droidInterface.set_menu([(«Exit», «ic_menu_close_clear_cancel»)])

droid.fullShow(open(«%s/res/layout/layout.xml» %(os.path.dirname(__file__))).read())

while True:
event = droid.eventWait().result
if event[«name»] == «Exit»:
sys.exit()
elif event[«name»] == «click»:
if event[«data»][«id»] == «button»:
# изменяем вид интерфейса
droid.fullSetProperty(«editText», «text», «properties edited!»)
droid.fullSetProperty(«background»,
«backgroundColor», «0xff7f0000»)

Вот, что у нас получилось:

Теперь если мы нажмем на кнопку «Ok», наш интерфейс динамически поменяет свой облик:

мы присвоили id —

android:id=

«.
Название свойства. Это может быть, например, текст в форме или имя кнопки. Заметьте, что изначально в форме

мы не указывали свойство «text» (

android:text=

«properties edited»)
Присваиваемое значение. Тут, думаю, все понятно. Это может быть новое имя пункта, список Listbox, цвет фона и т.д.
Так, если бы мы захотели динамически изменить и имя кнопки на, скажем, «New Name», то должны были добавить в условие строчку

droid.fullSetProperty(«button»,
«text», «NEW NAME»)

На этом все. Основные принципы, думаю, понятны. Если кому-то помогла это статья, пишите, выложу еще. И оставляйте комментарии, потому что мы учимся вместе

Источник: dimonvideo.ru

Полноценное python приложение на android

Полноценное python приложение на android

2012-08-20 в 12:41, admin , рубрики: android, python, Разработка под android, метки: android, python

Полноценное python приложение на android

В этой статье я хотел бы рассказать о том, как создать полноценное приложение на python для android. Нет, это не очередной мануал для создания скрипта для sl4a, это мануал по созданию полноценного приложения с UI, возможностью собрать apk и выложить на android market. Заодно я хотел бы похвалиться своим первым приложением на google.play, это не hello world, а полезное приложение для фотографов, хотя и узко специализированное.

Начну рассказ пожалуй с самого приложения и завершу рассказам о том как оно делалось.

isortViewer

Мне как фотографу приходится тратить много времени на сортировку и отбор фотографий. Не всегда хочется сидеть за рабочим компьютером, когда под рукой есть ноутбук, смартфон или планшет, но копировать туда десятки гигабайт raw или jpeg файлов, а потом синхронизировать с рабочим компьютером — сомнительное удовольствие. Именно поэтому я создал программы isortManager и isortViewer, которые значительно облегчили мне работу по сортировке и отбору фотографий. Теперь заниматься отбором и сортировкой фотографий я могу лежа на пляже диване или скучая в пробке 🙂

Читайте также:
Порядок утверждения краткосрочных программ

Копипаст описания и пара скриншотов:
isortViewer — программа для фотографов, которая позволяет легко и быстрой отбирать и сортировать тысячи фотографий (raw или jpg) с фотосессий на ваших android смартфонах и планшетах. При этом, нет необходимости копировать десятки гигабайт jpg или raw файлов на устройство. Просто воспользуйтесь бесплатной программой isortManager для компьютера, которая сохранит все в один небольшой файл проекта:
1. Скачайте и запустите isortManager с официального сайта
2. Создайте проект и добавьте папки с фотографиями. Поддерживаются форматы: jpg и raw (cr2, nef, orf и т.д.). В итоге у вас получится небольшой файл проекта (примерно 150 мб на несколько тысяч фотографий, будь то jpg или raw формат)
3. Скопируйте на ваше android устройство файл проекта, откройте в isortViewer. Вы можете помечать фотографии «на удаление», а так же, ставить рейтинги от 1 до 5 звезд
4. После этого, скопируйте файл проекта обратно и примените изменения в isortManager. Кроме удаления выбранных фотографий, вы можете копировать или перемещать отмеченные фотографии. Например, фотографии с «5 звезд» можно скопировать в папку «шедевры», а «1 звезда» переместить в папку «хлам» 🙂

Полноценное python приложение на android

Полноценное python приложение на android

Полноценное python приложение на android

Приложение абсолютно бесплатно и доступно на google.play, однако донейты приветствуются )

Исходники доступны на официальном сайте!

Как это делалось

Так как python лучший язык программирования в мире кроме python я ничего не знаю, решено было написать приложение на python.

isortManager

С isortManager для PC проблем не возникло, создание GUI сборки под windows уже давно обкатано и работает он очень просто: с помощью dcraw выдирает jpg превьюшки из raw файлов, ресайзит из с помощью PIL и складывает в один файл с достаточно простой структурой. Был изобретен свой весолипед с контейнером для хранения фотографий и метаданных (полный путь к фотографии, отметка «на удаление» и отметка рейтинга), так как, например, zip или tar формат, не могут изменять один файл в архиве (метаданные), требую перепаковки всех файлов. Файлы просто пишутся один за другим подряд и в блоке метаданных (обычный repr питоновского словаря) в конце сохраняется смещения начала файлов, плюс в конце файла пишется размер блока метаданных. GUI написано на Tkinter (люблю я его за быстроту написания и за малый размер итоговой сборки), вот собственно скриншот:

Полноценное python приложение на android

И да, все это работает и на linux, и даже быстрее чем на windows )

isortViewer для android

Всего я нашел два способа заставить python приложение работать как полноценное приложение на android, это pygame for android и проект kivy.
Pygame — более низкоуровневый, все UI пришлось бы рисовать вручную, что отняло бы много времени, поэтому был выбран фреймворк kivy. Итак:

Kivy

Это замечательный фрейморк для написания приложение для windows, linux, MacOS, android и iOS. Поддерживается мультитач, UI рисутется через OpenGL, значит должно работать аппаратное ускорение. Увидеть работу виджетов можно установив демонстрационное приложение Kivy Showcase. Есть возможность использования некоторых платформо специфичных функций, например, вибро или акселерометр, с помощью модуля android.

Для разработки я бы рекомендовал использовать linux, тем более, apk собираются именно в этой OS.

Hello World выглядит так:

import kivy kivy.require(‘1.0.6′) # replace with your current kivy version ! from kivy.app import App from kivy.uix.button import Button class MyApp(App): def build(self): return Button(text=’Hello World’) if __name__ == ‘__main__’: MyApp().run()

Причем этот код будет работать на всех заявленных платформах. Пропадает необходимость в тестировании приложения в эмуляторе. Достаточно запустить скрипт на исполнение в своей любимой IDE и увидеть результат на экране компьютера, без задержек на компиляцию, запуск эмулятора и пр. Если вы все же хотите увидеть как это будет выглядеть непосредственно на устройстве, просто установите Kivy Launcher, скопируйте файлы проекта на карту памяти и запустите. Дебажить при этом можно при помощи adb logcat.
Если вы используете библиотеку android, которой нет на PC, но хочется запускать приложение не только на android, воспользуйте такой конструкцией:

try: import android except ImportError: android=None . if android: android.vibrate(0.05)

Сборка apk достаточно проста и описана на этой странице. После сборки релиза, достаточно подписать свое приложение (я использовал этот мануал) и выложить в google play.

  • Быстрая разработка под различные платформы, практически без доработки кода.
  • Доступен широкий выбор виджетов
  • Высокая скорость работы. Весь ресурсоемкий вынесен в С модули. Сам интерпретатор python на android работает нативно.
  • Фремворк включает в себя множество инструментов, например анимация, кеширование и пр.

Минусы kivy:

  • Большой размер apk файла. Проект с 300 кб ресурсов (скрипты, графика) собирается в 7 мб apk. Хотя, думаю, есть возможность это как то оптимизировать.
  • Невозможность (пока), восстанавливать работу после сворачивания — приложение закрывается

В следующей своей статье, я расскажу более подробно о процессе написания приложения «с нуля», расжевывая каждую строчку кода.

Хотелось бы сразу пресечь холивары на тему «для android только java, python не нужен». Я считаю, не важно, какие технологии «под капотом», главное чтоб приложение было качественным.
Сфера применения kivy может быть огромной. Сейчас на моем счету несколько приложений, написанных под заказ, где python с фремворком kivy показал себя с хорошей стороны. Например, ровно за один час, было написано приложение, для сети сервисных центров. Приложение работает в режиме киоска и установлено на дешевые китайские планшеты, которые висят в холле. Клиент набирает номер заказа, далее по WiFi планшет соединяется с сервером и сообщает статус заказа.

Источник: www.pvsm.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru