Как получить информацию об изменениях пользовательского интерфейса из дополнения Kodi?Python

Программы на Python
Ответить Пред. темаСлед. тема
Гость
 Как получить информацию об изменениях пользовательского интерфейса из дополнения Kodi?

Сообщение Гость »


Я разрабатываю надстройку для чтения с экрана для Kodi. main.py — единственный непустой файл .py в проекте (у меня также есть файл addon.xml):

импортировать xbmc импортировать xbmcgui подпроцесс импорта класс ScreenReader(xbmc.Monitor): защита __init__(сам): xbmc.Monitor.__init__(сам) self.last_focused_control_id = Нет self.last_selected_list_item = -1 self.window_id = xbmcgui.getCurrentWindowId() xbmc.log("Отладка программы чтения с экрана: монитор инициализирован.", level=xbmc.LOGINFO) def onScreensaverActivated(self) -> Нет: self.read_aloud("Экранная заставка активна") def onScreensaverDeactivated(self) -> Нет: self.read_aloud("Хранитель экрана отключен") def onNotification(self, отправитель: str, метод: str, данные: str) -> Нет: xbmc.log( f"Уведомление сработало: отправитель: {sender}, метод: {method}, данные: {data}", уровень = xbmc.LOGINFO, ) защита checkFocusChange(self): new_window_id = xbmcgui.getCurrentWindowId() если self.window_id != new_window_id: self.window_id = new_window_id self.last_focused_control_id = Нет self.last_selected_list_item = Нет окно = xbmcgui.Window(self.window_id) # Получите текущий контроль над ситуацией пытаться: контроль = окно.getFocus() кроме RuntimeError: self.read_alloud("Нет фокуса или ошибка времени выполнения") возвращаться # Проверяем, совпадает ли оно с предыдущим если self.last_focused_control_id == control.getId(): если не isinstance(control, xbmcgui.ControlList): возвращаться еще: new_item_label = self.try_get_label(контроль) если new_item_label == self.last_selected_list_item: возвращаться еще: self.last_selected_list_item = new_item_label # Если элемент управления изменился, сохраните этот новый элемент управления и получите его метку self.last_focused_control_id = control.getId() element_label = self.try_get_label(контроль) # Зарегистрируйте метку (это только для отладки) xbmc.log( «Отладка программы чтения с экрана: метка управления: « + ул (метка_элемента) + "Тип управления" + str(тип(управление)), уровень = xbmc.LOGINFO, ) # Прочтите этикетку если метка_элемента: self.read_aloud(element_label) def try_get_label(self, control: xbmcgui.Control) -> str: если isinstance(control, xbmcgui.ControlButton): вернуть f"{control.getLabel()}, кнопка" elif isinstance(control, xbmcgui.ControlEdit): return f"{control.getLabel()}, поле редактирования, {control.getText()}" elif isinstance(control, xbmcgui.ControlFadeLabel): вернуть «Метка исчезновения не реализована» elif isinstance(control, xbmcgui.ControlGroup): вернуть «Контрольную группу» elif isinstance(control, xbmcgui.ControlImage): вернуть «Изображение» elif isinstance(control, xbmcgui.ControlLabel): возврат f"{control.getLabel()}, метка" elif isinstance(control, xbmcgui.ControlList): метка = "Список", элемент = control.getSelectedItem() если элемент Нет: метка += "Нет выбора" еще: label += item.getLabel() + ", " + item.getLabel2() возвратная этикетка elif isinstance(control, xbmcgui.ControlProgress): return f"{control.getPercent():.2f} процент, индикатор прогресса" elif isinstance(control, xbmcgui.ControlRadioButton): return f"{'Checked' if control.isSelected() else 'Unchecked'}, переключатель" elif isinstance(control, xbmcgui.ControlSlider): вернуть f"{control.getPercent():.2f} процент, ползунок" elif isinstance(control, xbmcgui.ControlSpin): вернуть «контроль вращения» elif isinstance(control, xbmcgui.ControlTextBox): вернуть f"{control.getText()}, текстовое поле" еще: return f"Не реализован тип управления, {str(type(control))}" защита read_aloud(сам, текст): if not text: # Если текст отсутствует или пуст возвращаться cmd = [ «powershell.exe», "-команда", 'Add-Type -AssemblyName System.speech; $speak = Новый объект System.Speech.Synthesis.SpeechSynthesizer; $speak.Speak("' + текст + '")', ] подпроцесс.Popen( cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, Creationflags=subprocess.CREATE_NO_WINDOW, ) если __name__ == "__main__": xbmc.log("Отладка программы чтения с экрана: сценарий запущен.", level=xbmc.LOGINFO) screen_reader = Чтение экрана() screen_reader.read_aloud("Добро пожаловать в программу чтения с экрана") пока не screen_reader.waitForAbort(0.1): screen_reader.checkFocusChange() если screen_reader.abortRequested(): xbmc.log("Отладка программы чтения с экрана: запрос на прерывание.", level=xbmc.LOGINFO) перерыв onNotification никогда не вызывается, и об этом нет записей в журнале. На что мне нужно подписаться, чтобы уведомления работали правильно?

Поэтому я создал функцию, которая проверяет, изменился ли фокус, и TTS объявляет о новом фокусе на кнопке, изображении или переключателе. Но если элемент управления представляет собой список, TTS просто читает «список, без выбора» и не реагирует на изменения фокуса внутри этого списка. И getSelectedItem, и getSelectedPosition всегда возвращают None и -1 (даже если список не пуст), поэтому мой дополнение никогда не знает, какой элемент списка выбран. Как это решить?

Конечно, способ уведомления предпочтительнее.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Не можете заставить Kodi принимать ключи, отправленные из python-uinput?
    Anonymous » » в форуме Python
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Как получать уведомления KODI с помощью скрипта Python?
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Как получать уведомления KODI с помощью скрипта Python?
    Anonymous » » в форуме Python
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Как получить информацию об ожидающих изменениях с помощью tfvc REST API
    Anonymous » » в форуме C#
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Как получить информацию об ожидающих изменениях с помощью tfvc REST API
    Anonymous » » в форуме C#
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»