Форум XBMC и Kodi. Помощь, поддержка, обсуждение, плагины.
   

Вернуться   Форум XBMC и Kodi. Помощь, поддержка, обсуждение, плагины. > Анонсы, Информация и Общие Темы > Подсказки, описания и FAQ по XBMC

Ответ
 
Опции темы Опции просмотра
Старый 26.01.2010, 12:12   #1
Dim_OS
Member
 
Регистрация: 14.01.2010
Адрес: Екатеринбург сити
Сообщений: 33
По умолчанию XBMC Python Scripting Tutorial (RUS)

Эта статья или копя HOW-TO руководства подготовлена Нельсоном Минаром. Это статья была отформатирована или изменена несколько раз.

XBMC Python Scripting Tutorial

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

Python не змей.
Некоторые основные правила - будьте внимательны со змеёй!


Некоторые функции добавляются со временем, и поэтому, мы очень советуем вам, иметь самую последнюю версию XBMC, иначе некоторые Python-скрипты могут не работать.

Чтобы запустить скрипт нужно зайти в установки параметров XBMC, так что идите туда, чтобы запустить скрипт. При запуске скрипта, рядом с именем скрипта, появляется пометка “running”. Если во время работы скрипта, кликнуть по ней – выполнение скрипта остановится (зависит от скина, в большинстве скинов не успеваешь увидеть этот “running”). После того как выполнение остановлено, вы можете посмотреть отладочную информацию, нажав белую кнопку X-Pad (X-Pad это джойстик Xbox. На компьютере отладочную информацию можно посмотреть, выделив правой кнопкой мыши скрипт и в выпадающем меню выбрать «Показать отладочные данные»). Вам может потребоваться доступ в Интернет, чтобы запустить некоторые скрипты, поэтому настройте XBMC правильно и не забудьте изменить название сервера (a.k.a. DNS) для разрешения (поддержки) доменных имен.


Всегда следите за поведением змеи.

Вы должны знать, Python-кодирование основано на отступах. Поэтому нет необходимости в скобках {}, чтобы объявить о начале и конце функции, класса, if ... Всё является объектом. Очень изящно, но мудрёно для начинающих! Переменная считается локальной, пока вы не объявите её глобальной. Но это будет понятнее в учебной литературе. Целью этого документа является не изучение Python, так что я просто рекомендую вам прочитать документацию на www.python.org.

Управление

Этот HOWTO (как делать) предполагает, что вы используете X-Pad (джойстик) Xbox. При другом способе управления (например: клавиатура, XBOX DVD Remote, и т.д.) информацию можно найти в Глобальном Управлении (General Navigation).

Начинается настоящая работа

В XBMC только две библиотеки: xbmc и xbmcgui. Обе они для интерфейса и для клавиатуры. Python –код выделен голубым цветом(в переводе подписано: код). Я объясню только скрипты для GUI - графического интерфейса, так как консольные скрипты работают без xbmc библиотеки.

Окно

Поэтому первое, что нужно сделать это импорт библиотек:
Код:
import  xbmc, xbmcgui
После этого мы создадим класс, включающий некоторые функции (определяемые DEF):
Код:
class MyClass(xbmcgui.Window):
  print 'hello world'
После того, как мы инициализировали объект класса и DoModal (), появилась возможность видеть графическое окно, пока мы не закроем его. del добавлен здесь, чтобы очистить код и удалить экземпляр класса после того как мы закроем окно (другими словами для очистки памяти после себя):
Код:
mydisplay = MyClass()
mydisplay .doModal()
del mydisplay
Если вы поместите все это в скрипт (назовем его display.py), вы увидите пустое окно, но так как нет кода для выхода из Myclass, вам придется перегрузить Xbox. Также обратите внимание, что информация из функции print отображается только в режиме отладки (белая кнопка X-Pad).

Кнопка X-Pad (pad button)

Итак, теперь мы должны организовать должным образом выход из класса. Поэтому мы будем использовать X-Pad для этого. Вот полный код:
Вставьте, не форматируя код, отсюда
Код:
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' ), мы выходим из класса. Если вы заметили, отступы помогают видеть где и что начинается или кончается. Def обозначает функцию но именно здесь он (def) связан с xbmc как onAction и обозначает все функции клавиш X-Pad. Self.close закроет окно и класс.

Добавим (или удалим) текстовую метку (Label)

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

Код:
self.strAction = xbmcgui.ControlLabel(300, 520, 200, 200, ' ', 'font14', '0xFFFFFF00')
self.addControl(self.strAction)
self.strAction.setLabel('BACK to quit')


#
Есть три причины написать 3 строчки кода для strActoion но мы рассмотрим это позже.
Здесь: 300 - координата по оси X а 520 по оси Y, 200 - должно быть размер элемента но кажется он не работает с font14 (шрифт). Font13 также можно обозначить как 0xFFFFFF00, означает цвет и прозрачность закодированные в шеснадцатиричной системе (от 00 до FF), так что читайте это как 0xTTRRGGBB где Т и обозначает прозрачность. R (red)- это красные, G (grin)- зеленый и как вы догадались B (blue) - это голубой. Сейчас мы добавим этот код к предыдущему и выведем на экран покажем это благодаря кнопке А на X-Pad. (используй Enter на клавиатуре).

Код:
import xbmc, xbmcgui

#get actioncodes from keymap.xml
ACTION_PREVIOUS_MENU = 10
ACTION_SELECT_ITEM = 7
 
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')
 
mydisplay = MyClass()
mydisplay .doModal()
del mydisplay
Не забывайте, вы должны нажать кнопку 'BACK', чтобы остановить скрипт! ("Esc" на клавиатуре)

Вы должны понять, надпись-метка является элементом окна, и поэтому мы смогли добавить её, но мы также можем удалить её с помощью removeControl. Мы будем использовать кнопку B на X-Pad (BackSpace на клавиатуре), чтобы удалить надпись :

Код:
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

#
Чтобы добавить текст есть и другая функция ControlFadeLabel которая включает в себя функцию сброса:
Код:
import xbmc, xbmcgui
 
#get actioncodes from keymap.xml
ACTION_PREVIOUS_MENU = 10
ACTION_SELECT_ITEM = 7
 
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 - A to reset text')
    self.strActionFade = xbmcgui.ControlFadeLabel(200, 300, 200, 200, 'font13', '0xFFFFFF00')
    self.addControl(self.strActionFade)
    self.strActionFade.addLabel('This is a fade label')
 
  def onAction(self, action):
    if action == ACTION_PREVIOUS_MENU:
      self.close()
    if action == ACTION_SELECT_ITEM:
      self.strActionFade.reset()
 
mydisplay = MyClass()
mydisplay .doModal()
del mydisplay
Параметры инициализации

Когда класс '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 __init__(self):
    self.strActionInfo = xbmcgui.ControlLabel(100, 120, 200, 200, '', 'font13', '0xFFFF00FF')
    self.addControl(self.strActionInfo)
    self.strActionInfo.setLabel('Push BACK to quit, A to display text and B to erase it')
 
  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
Мы можем также добавить фоновый рисунок, включив в функции инициализации ControlImage объект:

Код:
  def __init__(self):
    self.addControl(xbmcgui.ControlImage(0,0,800,600, 'background.png'))
    self.strActionInfo = xbmcgui.ControlLabel(100, 120, 200, 200, '', 'font13', '0xFFFF00FF')
    self.addControl(self.strActionInfo)
    self.strActionInfo.setLabel('Push BACK to quit, A to display text and B to erase it')


#
Конечно, мы выводим рисунок перед текстом . Когда указываем путь к директории, нужно всегда заменять '\' на '\ \', так как '\' зарезервирован под специальные символы.

Диалоговое окно

Что такое dialog box (диалоговое окно)? И так, создадим функцию для добавления dialog box:

Код:
def message(self):
    dialog = xbmcgui.Dialog()
    dialog.ok(" My message title", " This is a nice message ")



#
И мы будем вызывать его в другой функции, используя self.message ()

Код:
import xbmc, xbmcgui
 
#get actioncodes from keymap.xml
ACTION_PREVIOUS_MENU = 10
ACTION_SELECT_ITEM = 7
 
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')
 
  def onAction(self, action):
    if action == ACTION_PREVIOUS_MENU:
      self.close()
    if action == ACTION_SELECT_ITEM:
      self.message()
 
  def message(self):
    dialog = xbmcgui.Dialog()
    dialog.ok(" My message title", " This is a nice message ")
 
mydisplay = MyClass()
mydisplay .doModal()
del mydisplay
Итак, если теперь нажать (на X-Pad) кнопку ‘A’, то появится диалог.
Вы также можете использовать функцию message в более общем виде:

Код:
import xbmc, xbmcgui
 
#get actioncodes from keymap.xml
ACTION_PREVIOUS_MENU = 10
ACTION_SELECT_ITEM = 7
 
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')
 
  def onAction(self, action):
    if action == ACTION_PREVIOUS_MENU:
      self.message('goodbye')
      self.close()
    if action == ACTION_SELECT_ITEM:
      self.message('youpushed A ')
 
  def message(self, message):
    dialog = xbmcgui.Dialog()
    dialog.ok(" My message title", message)
 
mydisplay = MyClass()
mydisplay .doModal()
del mydisplay
Итак, теперь вы знаете, как вызвать функцию внутри другой функции Будьте осторожны, при передаче строковых переменных в функцию message , иногда числа и строки (integer и string) требуют предварительного преобразования!

Очень часто используют Yes/No диалог бокс:
Код:
import xbmc, xbmcgui
 
#get actioncodes from keymap.xml
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')
 
  def onAction(self, action):
    if action == ACTION_PREVIOUS_MENU:
      self.goodbye()
 
  def goodbye(self):
    dialog = xbmcgui.Dialog()
    if dialog.yesno("message", "do you want to leave?"):
      self.close()
 
mydisplay = MyClass()
mydisplay .doModal()
del mydisplay
Кнопки

Пришло время создать кнопку! Мы будем использовать функцию ControlButton. Она содержит в себе 5 аргументов. xbmcgui.ControlButton (350, 500, 80, 30, "Hello"). Где 350- координата Х, 500- координата Y, 80-ширина, 30- высота и последнее в кавычках -текст на кнопке. Сначала мы должны создать кнопку, и установить на неё фокус.

Код:
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'
Мы также можем удалить кнопку с экрана:
Код:
self.removeControl(self.button0)
Как обычно, ниже пример кода, чтобы увидеть Python в действии:

Код:
import xbmc, xbmcgui
 
#get actioncodes from keymap.xml
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.button0 = xbmcgui.ControlButton(350, 500, 80, 30, "HELLO")
    self.addControl(self.button0)
    self.setFocus(self.button0)
 
  def onAction(self, action):
    if action == ACTION_PREVIOUS_MENU:
      self.close()
 
  def onControl(self, control):
    if control == self.button0:
      self.message('you pushed the button')
 
  def message(self, message):
    dialog = xbmcgui.Dialog()
    dialog.ok(" My message title", message)
 
mydisplay = MyClass()
mydisplay .doModal()
del mydisplay
Мы также можем добавить больше кнопок, но нам надо определить в какой последовательности они должны реагировать. controlDown, controlUp, controlLeft and controlRight - будут нашими кнопками. Сначала мы создадим кнопки, а потом связь между ними.

Код:
import xbmc, xbmcgui
 
#get actioncodes from keymap.xml
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.button0 = xbmcgui.ControlButton(250, 100, 80, 30, "HELLO")
    self.addControl(self.button0)
    self.button1 = xbmcgui.ControlButton(250, 200, 80, 30, "HELLO2")
    self.addControl(self.button1)
    self.button2 = xbmcgui.ControlButton(450, 200, 80, 30, "HELLO3")
    self.addControl(self.button2)
    self.setFocus(self.button0)
    self.button0.controlDown(self.button1)
    self.button1.controlUp(self.button0)
    self.button1.controlRight(self.button2)
    self.button2.controlLeft(self.button1)
 
  def onAction(self, action):
    if action == ACTION_PREVIOUS_MENU:
      self.close()
 
  def onControl(self, control):
    if control == self.button0:
      self.message('you pushed the 1st button')
    if control == self.button1:
      self.message('you pushed the 2nd button')
    if control == self.button2:
      self.message('you pushed the 3rd button')
 
  def message(self, message):
    dialog = xbmcgui.Dialog()
    dialog.ok(" My message title", message)
 
mydisplay = MyClass()
mydisplay .doModal()
del mydisplay
Виртуальная клавиатура

Добавим возможность ввода текста с помощью виртуальной клавиатуры:

Код:
import xbmc, xbmcgui
 
#get actioncodes from keymap.xml
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
Списки

С начала апреля, появилась возможность создавать списки в XBMC Python. Нет необходимости говорить больше, ниже пример:

Код:
import xbmc, xbmcgui
 
#get actioncodes from keymap.xml
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
XBMC поддерживает различные размеры экрана, и мы можем получить его текущее значение. Будем использовать действие action getHeight() и getWidth()

Код:
import xbmc, xbmcgui
 
#get actioncodes from keymap.xml
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')
    screenx = self.getWidth()
    strscreenx = str(screenx)
    screeny = self.getHeight()
    strscreeny = str(screeny)
    self.strActionInfo = xbmcgui.ControlLabel(100, 200, 200, 200, '', 'font13', '0xFFFFFFFF')
    self.addControl(self.strActionInfo)
    self.strActionInfo.setLabel('screen width is ' + strscreenx)
    self.strActionInfo = xbmcgui.ControlLabel(100, 300, 200, 200, '', 'font13', '0xFFFFFFFF')
    self.addControl(self.strActionInfo)
    self.strActionInfo.setLabel('screen height is ' + strscreeny)
 
  def onAction(self, action):
    if action == ACTION_PREVIOUS_MENU:
      self.close()
 
mydisplay = MyClass()
mydisplay .doModal()
del mydisplay
Директория скина и локализация (Skin dir and localization)

Это информация может быть полезна для написания международного скрипта. GetLocalizedString была добавлена 6 апреля 2004. Она читает информацию из XML language файла. И в этом случае удобно использовать новый способ вызова функции: mydisplay.localinfos (). Функция localinfos () вызывается так, что вы можете думать только о том, как будет отображаться информация... За исключением класса MyClass, так как функция инициализации MyClass, обрабатываются и выводятся в первую очередь.

Код:
import xbmc, xbmcgui
 
#get actioncodes from keymap.xml
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')
 
  def onAction(self, action):
    if action == ACTION_PREVIOUS_MENU:
      self.close()
 
  def localinfos(self):
    localtxt1 = xbmc.getLocalizedString(10000)
    localtxt2 = xbmc.getLocalizedString(10004)
    self.strActionInfo = xbmcgui.ControlLabel(100, 200, 200, 200, '', 'font13', '0xFFFFFFFF')
    self.addControl(self.strActionInfo)
    self.strActionInfo.setLabel('Text using your xml language file : ' + localtxt1 + ' , ' + localtxt2 )    
    myskin = xbmc.getSkinDir()
    self.strActionInfo = xbmcgui.ControlLabel(100, 300, 200, 200, '', 'font13', '0xFFFFFFFF')
    self.addControl(self.strActionInfo)
    self.strActionInfo.setLabel('Your skin dir is : /skin/' + myskin)
 
mydisplay = MyClass()
mydisplay.localinfos()
mydisplay .doModal()
del mydisplay
Язык, IP адрес, DVD регион, доступная память и функции температуры процессора

Это моя первая попытка добавить функцию к библиотеке XBMC Python и я горжусь результатом.

Код:
import xbmc, xbmcgui
 
#get actioncodes from keymap.xml
ACTION_PREVIOUS_MENU = 10
 
class MyClass(xbmcgui.Window):
  def __init__(self):
    self.strActionInfo = xbmcgui.ControlLabel(250, 60, 200, 200, '', 'font14', '0xFFBBBBFF')
    self.addControl(self.strActionInfo)
    self.strActionInfo.setLabel('Push BACK to quit')
 
  def onAction(self, action):
    if action == ACTION_PREVIOUS_MENU:
      self.close()
 
  def localinfos(self):
    myinfos1 = xbmc.getLanguage()
    self.strActionInfo = xbmcgui.ControlLabel(100, 150, 200, 200, '', 'font13', '0xFFFFFFFF')
    self.addControl(self.strActionInfo)
    self.strActionInfo.setLabel('Your language is : ' + myinfos1)
    myinfos2 = xbmc.getIPAddress()
    self.strActionInfo = xbmcgui.ControlLabel(100, 200, 200, 200, '', 'font13', '0xFFFFFFFF')
    self.addControl(self.strActionInfo)
    self.strActionInfo.setLabel('Your IP adress is : ' + myinfos2)
    myinfos3 = xbmc.getDVDState()
    self.strActionInfo = xbmcgui.ControlLabel(100, 250, 200, 200, '', 'font13', '0xFFFFFFFF')
    self.addControl(self.strActionInfo)
    dvdstate = ''
    if (myinfos3 == 1):
      dvdstate = 'DRIVE_NOT_READY'
    if (myinfos3 == 16):
      dvdstate = 'TRAY_OPEN'
    if (myinfos3 == 64):
      dvdstate = 'TRAY_CLOSED_NO_MEDIA'
    if (myinfos3 == 96):
      dvdstate = 'TRAY_CLOSED_MEDIA_PRESENT'            
    self.strActionInfo.setLabel('dvd state : ' + dvdstate )
    myinfos4 = xbmc.getFreeMem()
    self.strActionInfo = xbmcgui.ControlLabel(100, 300, 200, 200, '', 'font13', '0xFFFFFFFF')
    self.addControl(self.strActionInfo)
    self.strActionInfo.setLabel('free mem : ' + str(myinfos4) + ' Mb')
    myinfos5 = xbmc.getCpuTemp()
    self.strActionInfo = xbmcgui.ControlLabel(100, 350, 200, 200, '', 'font13', '0xFFFFFFFF')
    self.addControl(self.strActionInfo)
    self.strActionInfo.setLabel('cpu temp : ' + str(myinfos5) )
 
mydisplay = MyClass()
mydisplay.localinfos()
mydisplay .doModal()
del mydisplay
Как добавить дочернее окно?

Это всегда удобно, добавить дочернее окно, когда нам не хватает места в главном окне. Таким образом, мы добавим еще один класс, который будет вызываться по нажатию кнопки A на X-PAD.

Код:
import xbmc, xbmcgui
 
#get actioncodes from keymap.xml
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
Не связанные с XBMC функции

Вот пример того, как легко загрузить файл через HTTP. Try и Except – методы, которые используются для обработки исключений при тестировании (для проверки - как работает кусочек кода в скрипте).
Для получения более подробной информации прочитайте документацию по Python.

Код:
import xbmc, xbmcgui, urllib
 
#get actioncodes from keymap.xml
ACTION_PREVIOUS_MENU = 10
ACTION_SELECT_ITEM = 7
 
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 - A to download')
 
  def onAction(self, action):
    if action == ACTION_PREVIOUS_MENU:
      self.close()
    if action == ACTION_SELECT_ITEM:
      webfile = 'http://www.google.com/images/logo.gif'
      localfile = 'Q:\\scripts\\logo.gif'
      self.downloadURL(webfile,localfile)
 
  def downloadURL(self,source, destination):        
    try:
      loc = urllib.URLopener()
      loc.retrieve(source, destination)
      self.message('download ok')
    except:
      self.message('download failed')
 
  def message(self, message):
    dialog = xbmcgui.Dialog()
    dialog.ok(" My message title", message)
 
mydisplay = MyClass()
mydisplay .doModal()
del mydisplay
Вот и все, мы надеемся, что это руководство поможет вам понять больше о том, как на Python писать скрипт для работы в XBMC. Спасибо вам за чтение, и, пожалуйста, рассмотрите вопрос о внесении своего вклада в это общее дело.

Оригинал статьи http://xbmc.org/wiki/?title=HOW-TO_w...ripts_for_XBMC
Dim_OS вне форума   Ответить с цитированием
   
Старый 26.01.2010, 13:44   #2
LordMerlin
Senior Member
 
Аватар для LordMerlin
 
Регистрация: 11.12.2009
Адрес: Russia
Сообщений: 2,184
По умолчанию

Молодец, спасибо за труды.
LordMerlin вне форума   Ответить с цитированием
Старый 13.02.2010, 23:18   #3
bigbax
Senior Member
 
Аватар для bigbax
 
Регистрация: 12.12.2009
Адрес: Моск.обл.
Сообщений: 4,513
Отправить сообщение для bigbax с помощью ICQ
По умолчанию

Побольше информативности надо на форуме выкладывать. Dim_OS - первопроходец в этом деле.
__________________
Ubuntu 20.0.х, Kodi next

Последний раз редактировалось bigbax; 11.02.2011 в 16:51.
bigbax вне форума   Ответить с цитированием
Старый 26.09.2011, 16:24   #4
RedDemon
Junior Member
 
Регистрация: 11.08.2010
Сообщений: 9
По умолчанию

Подскажите как (из какого меню/раздела) запустить скрипт в XBMC? Не могу найти
RedDemon вне форума   Ответить с цитированием
Старый 26.09.2011, 17:42   #5
bigbax
Senior Member
 
Аватар для bigbax
 
Регистрация: 12.12.2009
Адрес: Моск.обл.
Сообщений: 4,513
Отправить сообщение для bigbax с помощью ICQ
По умолчанию

В Дополнениях XBMC *( программные дополнения) установить Launcher или Executor . После установки в Главное меню -Программы-Launcher . Указываете на скрипт , который хотели запустить.
Или делать в Главное меню ( делается в Home.xml) кнопку с опцией :
<onclick>System.ExecWait(/путь к каталогу/script.sh)</onclick>

или проще указать на сам файл запуска нужной проги , к примеру Opera:
<onclick>System.ExecWait(/usr/bin/opera)</onclick>
__________________
Ubuntu 20.0.х, Kodi next

Последний раз редактировалось bigbax; 19.11.2011 в 16:17.
bigbax вне форума   Ответить с цитированием
Старый 21.10.2011, 09:11   #6
RedDemon
Junior Member
 
Регистрация: 11.08.2010
Сообщений: 9
По умолчанию

Спасибо!
RedDemon вне форума   Ответить с цитированием
Старый 19.07.2012, 05:14   #7
serzh82saratov
Senior Member
 
Аватар для serzh82saratov
 
Регистрация: 13.01.2011
Адрес: Саратов
Сообщений: 624
По умолчанию

Люди добрые подскажите как в питон скрипте правильно прописывать запуск функций из кейборда.хмл хвмс, типа
Код:
ActivateWindow(Videos,MovieTitles)
Sleep, 1000
Left
Sleep, 1000
Play
как делать паузы, и как запускать сторонние проги с Параметрами командной строки как просто запустить знаю
Код:
os.startfile(r'D:\AutoIt\other\Sound.ahk')
перечитал справку , ничего не дошло.
__________________
Windows 7-64 bit, NVidia GTX 570, ХВМС Kodi, Пульт IRLink + AutoHotkey.
serzh82saratov вне форума   Ответить с цитированием
Старый 19.07.2012, 10:09   #8
Roman_V_M
Senior Member
 
Аватар для Roman_V_M
 
Регистрация: 12.06.2011
Адрес: Киев
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от serzh82saratov Посмотреть сообщение
Люди добрые подскажите как в питон скрипте правильно прописывать запуск функций из кейборда.хмл хвмс, типа
Код:
ActivateWindow(Videos,MovieTitles)
Sleep, 1000
Left
Sleep, 1000
Play
Вы сначала скажите, что вы хотите сделать. Но, по-моему, это делается вообще без Питона.

Цитата:
как делать паузы, и как запускать сторонние проги с Параметрами командной строки как просто запустить знаю
Код:
os.startfile(r'D:\AutoIt\other\Sound.ahk')
перечитал справку , ничего не дошло.
А здесь курите маны и туториалы на сам Питон. В частности, сторонние программы запускаются через os.subprocess.call(args). Пауза - это что-то из time, кажется.

ЗЫ. Лично я вообще набирают в Гугле на английском "python + (сделать что-то)" и ответ находится в 99% случаев. Вот XBMC, как раз, не тот случай, поскольку документированность плохая.
__________________
Координатор русского перевода Kodi:
https://www.transifex.com/projects/p/kodi-main/
------------------------------
Raspberry PI 2 + LibreELEC 8 (Kodi 17)
Samsung Galaxy Tab A 10.1 + Kodi 17 for Android
------------------------------
Читаем и пополняем Википедию форума: http://xbmc.ru/wiki
------------------------------
На любые личные сообщения, не связанные с переводом Kodi, не отвечаю. Для обсуждений и советов есть форум.
Roman_V_M вне форума   Ответить с цитированием
Старый 19.07.2012, 16:17   #9
serzh82saratov
Senior Member
 
Аватар для serzh82saratov
 
Регистрация: 13.01.2011
Адрес: Саратов
Сообщений: 624
По умолчанию

Цитата:
Сообщение от Roman_V_M Посмотреть сообщение
Вы сначала скажите, что вы хотите сделать.
какой нибудь макрос
Цитата:
Но, по-моему, это делается вообще без Питона.
Вы имеете ввиду средствами хвмс?
Как без питона сделать какой нибудь макрос?
Цитата:
А здесь курите маны и туториалы на сам Питон.
Да я их обкурился честно говоря , но ничего не доходит синтаксис слишком сложный для меня, поэтому и спрашиваю у понимающих товарищей пример простейшего макроса.
Цитата:
В частности, сторонние программы запускаются через os.subprocess.call(args).
Если просто запуск, то работает
Код:
os.startfile(r'D:\AutoIt\other\Sound.ahk')
Но как с параметрами, не понятно os.subprocess.call(args) что с этим делать?
Цитата:
Пауза - это что-то из time, кажется.
import time
time.sleep(10)
Цитата:
ЗЫ. Лично я вообще набирают в Гугле на английском "python + (сделать что-то)" и ответ находится в 99% случаев. Вот XBMC, как раз, не тот случай, поскольку документированность плохая.
да вот и я про тоже, для XBMC не могу найти простых примеров , а если нахожу то понимание всё равно не приходит.

з.ы. сейчас запускаю файлы из кейборда с помощью
Код:
RunScript(D:\AutoIt\players\XBMC\Test.py)
и уже в питоне пишу путь к нужному файлу
Код:
os.startfile(r'D:\AutoIt\players\XBMC\Test.анк')
потому как
Код:
System.Exec(D:\AutoIt\players\XBMC\Test.анк)
сворачивает хвмс, и ждёт завершения, не знаете как сделать чтобы не сворачивал, что не было лишних костылей, в виде Test.py?
__________________
Windows 7-64 bit, NVidia GTX 570, ХВМС Kodi, Пульт IRLink + AutoHotkey.

Последний раз редактировалось serzh82saratov; 19.07.2012 в 16:23.
serzh82saratov вне форума   Ответить с цитированием
Старый 19.07.2012, 17:30   #10
Roman_V_M
Senior Member
 
Аватар для Roman_V_M
 
Регистрация: 12.06.2011
Адрес: Киев
Сообщений: 1,933
По умолчанию

2 serzh82saratov

Многабукаф, ниасилил. (с) Вы можете человеческим языком написать, чего вы хотите добиться?
__________________
Координатор русского перевода Kodi:
https://www.transifex.com/projects/p/kodi-main/
------------------------------
Raspberry PI 2 + LibreELEC 8 (Kodi 17)
Samsung Galaxy Tab A 10.1 + Kodi 17 for Android
------------------------------
Читаем и пополняем Википедию форума: http://xbmc.ru/wiki
------------------------------
На любые личные сообщения, не связанные с переводом Kodi, не отвечаю. Для обсуждений и советов есть форум.
Roman_V_M вне форума   Ответить с цитированием
Ответ
 


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Текущее время: 11:32. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2023, Jelsoft Enterprises Ltd.