Player – это библиотека с открытым исходным кодом для доступа к функциям, обычно встречающимся на различных платформах через python. Он находится в стадии интенсивной разработки с текущей версией 1.3.0
и обеспечивает поддержку Windows, Macosx, Linux, Android и iOS.
Содержание
- История игрока
- Как им пользоваться?
- Пример с киви
- Как работает плеер?
- Внутренняя работа
- Способствующий.
- Вывод.
История игрока.
Kivy organization запустила проект player как необходимость получить доступ к различным функциям платформы, поскольку kivy organization предоставляет фреймворк для создания кросс-платформенных приложений и программного обеспечения с использованием python.
Например, для запуска интерфейса телефонного вызова в мобильных устройствах необходимо получить доступ к библиотекам, предоставляемым соответствующей платформой на самом родном языке.
Для android нужно получить android.content.Намерение
и android.net.Uri
и начните новое действие с intent action Intent.ACTION_CALL
и Intent.setData
в качестве телефонного номера для вызова вызова.
Для iOS нужно получить UIApplication
и NSURL
с tel
(номер телефона) в качестве object_str
для запуска вызова.
Но как сделать то же самое с помощью python? Для решения этой проблемы kivy запустила 3 проекта: PyJnius , PyObjus и Player .
Pyjnius : Модуль Python для доступа к классам Java как к классам Python с помощью JNI.
Pyobjus : Модуль Python для доступа к классам Objective-C как к классам Python с использованием отражения среды выполнения Objective-C.
Player : Независимый от платформы api для использования функций, обычно встречающихся на различных платформах Python, таких как Акселерометр, Вызов, Преобразование текста в речь, Wi-Fi, Барометр и многое другое .
Как использовать плеер?
Использовать плеер очень просто.
Получить показания акселерометра::
>>> from plyer import accelerometer >>> accelerometer.enable() >>> accelerometer.acceleration (-10.048464775085449, 6.825869083404541, 7.7260890007019043)
Получить состояние батареи::
>>> from plyer import battery >>> battery.status {'percentage': 82.0, 'isCharging': False}
Включите вспышку::
>>> from plyer import flash >>> flash.on()
Я настоятельно рекомендую вам попробовать Kivy Remote Shell , чтобы увидеть, как эти примеры работают на реальном Android-устройстве. Один важный момент, который следует подчеркнуть, заключается в том, что Игрок является независимым от Kivy и может работать как отдельная сущность.
Пример с киви.
Преобразование текста в речь конвертер. Просто скопируйте и вставьте следующий код и убедитесь, что у вас установлен kivy с версией больше 1.8.0.
Создать main.py
файл.
import kivy kivy.require('1.8.0') from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.popup import Popup from plyer import tts class Text2SpeechDemo(BoxLayout): def do_read(self): try: tts.speak(self.ids.notification_text.text) except NotImplementedError: popup = ErrorPopup() popup.open() class Text2SpeechDemoApp(App): def build(self): return Text2SpeechDemo() def on_pause(self): return True class ErrorPopup(Popup): pass if __name__ == '__main__': Text2SpeechDemoApp().run()
Создайте файл text2speechdemo.kv
. [имя файла .kv должно быть одинаковым]
: BoxLayout: orientation: 'vertical' padding: 20 TextInput: id: notification_text text: 'Put message here' Button: text: 'Read' size_hint_y: 0.2 on_press: root.do_read() : size_hint: .7, .4 title: "Error" BoxLayout: orientation: 'vertical' padding: 10 spacing: 20 Label: size_hint_y: 0.4 text: "This feature has not yet been implemented in Plyer." Button: text: 'Dismiss' size_hint_y: 0.4 on_press: root.dismiss()
Запустите приложение с помощью python main.py
на любой из поддерживаемых платформ, перечисленных во введении, и используйте эту потрясающую функцию.
Как работает плеер?
Игрок старается не изобретать велосипед, а призывает внешние библиотеки реализовать api самым простым способом, в зависимости от текущей платформы.
- На Android ( python-for-android ) используется pyjnius.
- На iOS ( kivy-ios ) используется pyobjus
- В Windows/mac/linux используются часто встречающиеся библиотеки и программы.
Давайте рассмотрим реализацию функции вызова для платформы Android. Следует обратить внимание на следующую строку кода из jnius import autoclass
, где jnius-это PyJnius, а autoclass-это метод, возвращающий класс Python см.
from jnius import autoclass from plyer.facades import Call from plyer.platforms.android import activity Intent = autoclass('android.content.Intent') uri = autoclass('android.net.Uri') class AndroidCall(Call): def _makecall(self, **kwargs): intent = Intent(Intent.ACTION_CALL) tel = kwargs.get('tel') intent.setData(uri.parse("tel:{}".format(tel))) activity.startActivity(intent) def _dialcall(self, **kwargs): intent_ = Intent(Intent.ACTION_DIAL) activity.startActivity(intent_) def instance(): return AndroidCall()
Использование приведенного выше кода для запуска вызовов.
>>> from plyer import call >>> call.makecall('9997654321')
Внутренняя работа.
Это звучит круто, как плеер распознает платформу и использует только те файлы, которые нужны?
Чтобы понять это, вам нужно погрузиться в кодовую базу плеера, сначала давайте посмотрим на файловую структуру плеера.
- plyer - facades - __init__.py - ... abstract classes of each feature (https://www.python.org/dev/peps/pep-3119/) way to abstract classes. - platforms # Implementations. - android/ - ios/ - linux/ - macosx/ - win/ - __init__.py - __init__.py - compat.py - utils.py - other files.
Давайте рассмотрим один пример акселерометра и посмотрим, как он работает.
Когда мы делаем из plyer импорт акселерометра
, так как это модуль, он идет в __init__.py
( ссылка ) файл, в котором происходит настоящее волшебство.
# __init__.py file. from plyer import facades from plyer.utils import Proxy #: Accelerometer proxy to :class:`plyer.facades.Accelerometer` accelerometer = Proxy('accelerometer', facades.Accelerometer) #other features...
Этот файл создает прокси-сервер для каждой функции, доступной в facades/__init__.py
# utils.py file. class Proxy(object): ... def __init__(self, name, facade): ... def _ensure_obj(self): ... name = object.__getattribute__(self, '_name') module = 'plyer.platforms.{}.{}'.format( platform, name) mod = __import__(module, fromlist='.') obj = mod.instance()
где platform
– объект класса Platform
, который отвечает за определение имени платформы [Класс платформы внутренне использует из sys import platform
для получения имени платформы.] и name
– имя функции(акселерометр). mod
– это модуль, а экземпляр-метод, возвращающий класс, определенный в accelerometer.py файл под реализацию каждой платформы.
Путь: Идет к __init__.py
->(‘акселерометр’, фасады.Акселерометр) -> Переходит в прокси-класс – > _ensure_obj
вызывается – > объект obj
становится объектом класса из plyer.platforms.android.accelerometer
-> готов к импорту.
Способствующий
Игрок проекта открыт для посещения вклада https://github.com/kivy/plyer#contributing для получения дополнительной информации.
Вывод
Спасибо, что прочитали этот пост — надеюсь, вы нашли его полезным. Вы можете найти меня на GitHub , LinkedIn и CodeMentor . Если у вас есть какие-либо вопросы, не стесняйтесь обращаться ко мне! Больше сообщений:
- Настройка навигационного ящика в Kivy & Kivy MD
- Игрок: Независимый от платформы уровень совместимости
- Управление текстурами в Киви с помощью atlas
- Учебник для начинающих Kivy: Базовый ускоренный курс для приложений в Kivy
- Redux, Store, Actions, Reducers и logger: Начало работы и немного дальше (1)
- Redux, Reactotron, Actions, Reducers и Sagas (2)