Немного теории, необходимой для написания простого плагина


Предыдущая | Следующая

Рассмотрим некоторые базовые функции библиотек XBMC языка Python, необходимых нам для создания собственного плагина (см. разд. 5.13.3).

Сначала подключаем необходимые нам библиотеки.

import xbmc, xbmcgui

После этого создадим простой класс:

class MyClass(xbmcgui.Window): print 'hello world'

После инициализации объекта класса метод DoModal предоставляет возможность видеть графическое окно, пока мы его не закроем:

mydisplay = MyClass() mydisplay .doModal() del mydisplay

Если запустить этот скрипт, то мы увидим пустое окно (оператор print вместо кон­соли пишет в лог XBMC), из которого можно выйти только перезагрузкой XBMC. Поэтому надо предусмотреть выход из класса (листинг 6.1).

Листинг 6.1. Скрипт MyClass

import xbmc, xbmcgui

# actioncodes получить из keymap.xml ACTION_PREVIOUS_MENU = 10

class MyClass(xbmcgui.Window): def onAction(self, action):

if action == ACTION_PREVIOUS_MENU: self.close() mydisplay = MyClass() mydisplay .doModal() del mydisplay

Каждый раз когда мы нажимаем на кнопку BACK (или клавишу <Esc>), то выхо­дим из класса.

Теперь время показать в созданном нами окне текст. Добавим текстовую метку Label и воспользуемся функцией ControlLabel. Эта функция содержит в себе пара­метры: позиция, цвет, прозрачность и размер шрифта.

self.strAction = xbmcgui.ControlLabel(300, 520, 200, 200, ' ', 'font14', '0xFFFFFF00')

self.addControl(self.strAction) self.strAction.setLabel('BACK to quit')

Теперь удалим текстовую метку с помощью функции removeControl, пользуясь, чтобы удалить надпись, клавишей <Backspace> на клавиатуре (листинг 6.2).

Листинг 6.2. Скрипт MyClass с опцией удаления метки

import xbmc, xbmcgui

#get actioncodes from keymap.xml ACTION_PREVIOUS_MENU = 10 ACTION_SELECT_ITEM = 7 ACTION_PARENT_DIR = 9

class MyClass(xbmcgui.Window): def onAction(self, action):

if action == ACTION_PREVIOUS_MENU: self.close()

if action == ACTION_SELECT_ITEM:

self.strAction = xbmcgui.ControlLabel(300, 200, 200, 200, '', 'font14', '0xFF00FF00')

self.addControl(self.strAction) self.strAction.setLabel('Hello world') if action == ACTION_PARENT_DIR:

self.removeControl(self.strAction)

mydisplay = MyClass() mydisplay .doModal() del mydisplay

Для создания кнопки воспользуемся функцией ControlButton:

self.button0 = xbmcgui.ControlButton(350, 500, 80, 30, "HELLO")

self.addControl(self.button0)

self.setFocus(self.button0)

Определим действие при нажатии на кнопку:

def onControl(self, control): if control == self.button0: print 'button pushed'

Можно добавить возможность ввода текста с помощью виртуальной клавиатуры (листинг 6.3).

Листинг 6.3. Скрипт MyClass с добавленной кнопкой

import xbmc, xbmcgui

ACTION_PREVIOUS_MENU = 10

class MyClass(xbmcgui.Window): def __init__(self):

self.strActionInfo = xbmcgui.ControlLabel(100, 120, 200, 200, '', 'font13',

'0xFFFF00FF')

self.addControl(self.strActionInfo) self.strActionInfo.setLabel('Push BACK to quit')

self.strActionInfo = xbmcgui.ControlLabel(100, 300, 200, 200, '', 'font13',

'0xFFFFFFFF')

self.addControl(self.strActionInfo) keyboard = xbmc.Keyboard('mytext') keyboard.doModal() if (keyboard.isConfirmed()):

self.strActionInfo.setLabel(keyboard.getText()) else:

self.strActionInfo.setLabel('user canceled')

def onAction(self, action):

if action == ACTION_PREVIOUS_MENU: self.close()

mydisplay = MyClass() mydisplay .doModal() del mydisplay

Очень часто необходимо использовать списки. Код создания списка представлен в листинге 6.4.

Листинг 6.4. Код создания списка

import xbmc, xbmcgui

ACTION_PREVIOUS_MENU = 10

class MyClass(xbmcgui.Window):

def __init__(self):

self.strActionInfo = xbmcgui.ControlLabel(250, 80, 200, 200, '', 'font14', '0xFFBBBBFF')

self.addControl(self.strActionInfo) self.strActionInfo.setLabel('Push BACK to quit') self.list = xbmcgui.ControlList(200, 150, 300, 400) self.addControl(self.list) self.list.addItem('Item 1') self.list.addItem('Item 2') self.list.addItem('Item 3') self.setFocus(self.list)

def onAction(self, action):

if action == ACTION_PREVIOUS_MENU: self.close()

def onControl(self, control): if control == self.list:

item = self.list.getSelectedItem() self.message('You selected :                                    ' + item.getLabel())

def message(self, message): dialog = xbmcgui.Dialog() dialog.ok(" My message title", message)

mydisplay = MyClass() mydisplay.doModal() del mydisplay

Если не хватает места в главном окне, можно создать дочернее окно. При этом для него создается еще один класс (листинг 6.5).

Листинг 6.5. Класс для дочернего окна

import xbmc, xbmcgui

ACTION_PREVIOUS_MENU = 10 ACTION_SELECT_ITEM = 7

class MainClass(xbmcgui.Window): def __init__(self):

self.strActionInfo = xbmcgui.ControlLabel(180, 60, 200, 200, '', 'font14', '0xFFBBBBFF')

self.addControl(self.strActionInfo)

self.strActionInfo.setLabel('Push BACK to quit - A to open another window') self.strActionInfo = xbmcgui.ControlLabel(240, 250, 200, 200, '', 'font13', '0xFFFFFFFF')

self.addControl(self.strActionInfo)

self.strActionInfo.setLabel('This is the first window')

def onAction(self, action):

if action == ACTION_PREVIOUS_MENU: self.close() if action == ACTION_SELECT_ITEM: popup = ChildClass() popup .doModal() del popup

class ChildClass(xbmcgui.Window): def __init__(self):

self.addControl(xbmcgui.ControlImage(0,0,800,600, 'background.png')) self.strActionInfo = xbmcgui.ControlLabel(200, 60, 200, 200, '', 'font14', '0xFFBBFFBB')

self.addControl(self.strActionInfo)

self.strActionInfo.setLabel('Push BACK to return to the first window') self.strActionInfo = xbmcgui.ControlLabel(240, 200, 200, 200, '', 'font13', '0xFFFFFF99')

self.addControl(self.strActionInfo)

self.strActionInfo.setLabel('This is the child window')

def onAction(self, action):

if action == ACTION_PREVIOUS_MENU: self.close()

mydisplay = MainClass() mydisplay .doModal() del mydisplay