Как получить информацию об изменениях пользовательского интерфейса из дополнения Kodi? ⇐ 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 (даже если список не пуст), поэтому мой дополнение никогда не знает, какой элемент списка выбран. Как это решить?
Конечно, способ уведомления предпочтительнее.
Я разрабатываю надстройку для чтения с экрана для 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 (даже если список не пуст), поэтому мой дополнение никогда не знает, какой элемент списка выбран. Как это решить?
Конечно, способ уведомления предпочтительнее.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Не можете заставить Kodi принимать ключи, отправленные из python-uinput?
Anonymous » » в форуме Python - 0 Ответы
- 15 Просмотры
-
Последнее сообщение Anonymous
-