$put_perv_real = "/home/www/dvakompa-ru/dopol/"; ?>
Рассмотрим некоторые базовые функции библиотек 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