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

Рассказывает Энтони Шоу


Вряд ли кто-то вспоминает о Python, когда речь заходит о мобильной разработке. И очень зря, у нас даже есть статья, посвященная этому вопросу: для Python тоже существуют инструменты, способные преобразовать ваш код для работы под iOS, Android или Windows Phone.

В этом руководстве я покажу вам, как создать простой пульт (роль пульта будет выполнять iPhone)  для телевизоров Panasonic Viera.

Нам понадобятся:

  • Xcode, так как мы пишем для iPhone, но пульт также можно сделать и для Android, об этом мы поговорим в конце;
  • Желательно Python 3.5;
  • Телевизор Panasonic Viera с возможностью подключения к сети.

Создаем проект

Загружаем себе Briefcase — инструмент для конвертирования проект на Python в нативные приложения. Сделать это можно следующим образом: pip install briefcase. Далее создаем новую папку для нашего проекта mkdir tv_remote, внутри нее создаем папку Remote с файлами __init__.py и app.py. __init__.py может быть пустым, а вот в app.py нужно написать следующее:

import toga


def button_handler(widget):
    print("hello")


def build(app):
    box = toga.Box()

    button = toga.Button('Hello world', on_press=button_handler)
    button.style.set(margin=50)
    box.add(button)

    return box


if __name__ == '__main__':
    app = toga.App('First App', 'org.pybee.helloworld', startup=build)
    app.main_loop()

Теперь создадим файл setup.py. В нем мы будем описывать для какой платформы создается приложение. Обозначим pip пакеты, которые мы будем использовать. Нам понадобятся библиотека toga UI и библиотека для управления телевизором — PyViera.

from setuptools import setup, find_packages

setup(name='Remote',
    version = '0.1',
    packages = find_packages(),
    options = {
        'app': {
            'formal_name': 'TV Remote',
            'bundle': 'org.tv.remote'
        },
        'ios': {
            'app_requires': [
               'toga-ios',
               'git+https://github.com/tonybaloney/pyviera-1.git@master#egg-info=pyviera'
            ]
        }
    }
)

После этого ваша директория должна выглядеть следующим образом:

python android briefcase

Теперь внутри папки tv_remote запускаем команду python setup.py ios, которая загрузит необходимые компоненты и создаст xcode проект.

python android briefcase

Запустим проект. Создастся симулятор iPhone и наше приложение.

python android briefcase

Создаем пульт

Давайте добавим кнопку (цифра 5) для переключения канала.

import toga
from pyviera import Viera

tvs = Viera.discover()

def channel_5(widget):
    global tvs
    if len(tvs) == 0:
        tvs = Viera.discover()
    tvs[0].num(5)


def build(app):
    box = toga.Box()

    button = toga.Button('5', on_press=channel_5)
    button.style.set(margin=50)
    box.add(button)

    return box


if __name__ == '__main__':
    app = toga.App('TV Remote', 'org.tv.remote', startup=build)    
    app.main_loop()

Перезапустим приложение. Если все работает, вы должны увидеть следующее сообщение:

python android briefcase

Теперь включаем телевизор и пробуем нажать цифру 5!

Создаем остальные кнопки

Так как Toga позволяет применять CSS стили для выравнивания, мы создадим 5 рядов кнопок и расположим их как на реальном пульте от телевизора.

import toga
from colosseum import CSS
from pyviera import Viera

tvs = Viera.discover()

def set_channel(widget):
    global tvs
    channel = int(widget.label)
    print("Changing to channel {0}".format(channel))
    tvs[0].num(channel)

def mute(widget):
    global tvs
    tvs[0].mute()

def build(app):
    row_c = toga.Box()
    
    row_c.add(toga.Button('mute', on_press=mute))
    row_c.style.set(flex_direction='row', margin=5, padding_left=60)


    row_0 = toga.Box()
    
    row_0.add(toga.Button('1', on_press=set_channel))
    row_0.add(toga.Button('2', on_press=set_channel))
    row_0.add(toga.Button('3', on_press=set_channel))
    row_0.style.set(flex_direction='row', margin=5)
    
    row_1 = toga.Box()
    
    row_1.add(toga.Button('4', on_press=set_channel))
    row_1.add(toga.Button('5', on_press=set_channel))
    row_1.add(toga.Button('6', on_press=set_channel))
    row_1.style.set(flex_direction='row', margin=5)
    
    row_2 = toga.Box()
    
    row_2.add(toga.Button('7', on_press=set_channel))
    row_2.add(toga.Button('8', on_press=set_channel))
    row_2.add(toga.Button('9', on_press=set_channel))
    row_2.style.set(flex_direction='row', margin=5)
    
    row_3 = toga.Box()
    
    row_3.add(toga.Button('0', on_press=set_channel))
    row_3.style.set(flex_direction='row', margin=5, padding_left=60)
    
    box = toga.Box()
    box.style.set(flex_direction='column', padding_top=60, padding_left=100)
    box.add(row_c)
    box.add(row_0)
    box.add(row_1)
    box.add(row_2)
    box.add(row_3)
    return box


if __name__ == '__main__':
    app = toga.App('TV Remote', 'org.tv.remote', startup=build)
    app.main_loop()

Перезапустим приложение и — вуаля — работающий пульт для телевизора!

python android briefcase

Что делать, если у вас Android?

Вернемся к моменту, когда мы работали с setup.py, и теперь вместо python setup.py ios запустим python setup.py android. После этого briefcase создаст для вас Android проект.

Перевод статьи «Making a TV remote in Python»