22 декабря | 2024г. | 23:37:39


АвторТема: Класс config. Отображение на экране пользовательских настроек.  (Прочитано 4074 раз)

0 Пользователей и 1 Гость смотрят эту тему.

Оффлайн DobrodelАвтор темы

  • Друзья Джедаев
  • *****
  • Сообщений: 159
  • Поблагодарили: 259
  • Уважение: -1
Друзья, здравствуйте
Каждый из нас, как только у него родилась идея написания плагина для ресивера, сразу захотели сесть за ноутбук и написать первую программу. Однако, не зная основ написания плагинов и не зная базовых классов enigma2 это сделать трудно. По основам написания плагинов отправляю Вас к подробному изложению уважаемого ака Учкуна Пишем плагин сами или случайные уроки на python.
Что касается базовых классов, то предлагаю сейчас и поговорить о некоторых классах этой самой enigma2.
Давайте начнём с самого интересного класса который отображает нам на экране настройки выбора пользователя (именно он используется почти в 90% случаях при написании кода во всех видимых нами окнах, при работе с нашим ресивером): класс config, который находится в модуле Components :

Немого теории:
Цитировать
Класс config построен таким образом, что все наши настройки, которые отображаются на экране могут быть связаны и записаны в файл конфигурации enigma2 ( /etc/enigma2/settings). И если мы захотим, то они  будут атоматически записываться в этот файл и обновляться в случае их изменения.
Тут есть маленькая особенность: настройки будут записаны в файл только в том случае, если их значение будут изменено пользователем и эти изменения будут отличаться от установленных нами значений по умолчанию.
В противном случае мы не сможем их увидеть в этом файле. Что в принципе логично.
Второй особенностью является, то что в описании оболочки (свойство skin) нашего класса (который должен быть обязательно производным от класса Screen) должен быть обязательно объявлен элемент с зарезервированным названием (self['config']). Именно этот элемент и будет содержать все наши создаваемые далее настройки.

Давайте рассмотрим тестовый пример и затем его подробно разберём. В нем я отразил всё, часто используемые классы модуля config. На картинке изображён результат который объединяет всё классы обозначенного модуля.



Все это получается если мы напишем вот этот код:

Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.Давайте мы его подробно рассмотрим и разберём:

Здесь используется масса различных классов. Давайте начнём разбор нашего примера сверху вниз:
Импорт я не рассматриваю, это самое простое.

Класс ConfigSubsection() – класс, который формирует секцию наших настроек.
Цитировать
Где первым элементом в цепочке будет слово config. Вторым словом в этой цепочке используется слово plugins. А вот уже дальше Вы может сами формировать свою последовательность, для записи в файл настроек enigma2. Это хорошо видно в примере. Вы можете увеличить вложенность и сделать глубину переменной настроек ещё больше, так же применив этот класс. Например вот так:

Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Далее нам необходимо отобразить эти элементы на экране и если пользователь введёт какие либо значение наших параметров отличных от нуля мы сможем из записать в файл конфигурации enigma2. Об этом чуть ниже.


Далее разберём следующие по порядку классы:

ConfigSlider() – класс который изображает ползунок:
Цитировать


Устанавливаем:
default = 40 – значение по умолчанию (по умолчанию = 0)
increment = 10 – шаг изменения (по умолчанию = 1)
limits = ( 0, 100 ) – лимиты изменения слайдера (по умолчанию = (0,100))

Класс ConfigBoolean() - отображает выключатель
Цитировать


default=False, - переключатель в положение “выключено” (по умолчанию = False)
descriptions=boolean_descriptions - если параметр grafic = False, то здесь Вы можете установить текст, поясняющий суть переключения, например Yes и No и переключатель будет менять их значение. Например, вот так descriptions = {False: _( 'No' ), True: _( 'Yes' )}. (По умолчанию boolean_descriptions = {False: 'false', True: 'true'})
grafic=True – включает или отключает показ графического изображения выключателя. Если аргумент descriptions не установлен, то на экране отображатеся значения true и false. (по умолчанию = True)

Класс на основе которого существуют несколько других, отличающихся по названию, но одинаковыми по сути. Это такие как ConfigYesNo, ConfigAnableDisable, ConfigOnOff.
На экране отражаются в виде переключателя.
Видимо остальные классы были сделаны для удобства понимания кода, они отражают суть производимых действий. По умолчанию переключатель имеет положение «Выключен». Для его активации необходимо при инициализации передать параметр True, например так: ConfigAnableDisable(True)

Класс ConfigSelectionNumber() - позволяет выбрать цифры из заданного диапазона и с заданным шагом, при помощи кнопок «Вправо» и «Влево» (без необходимости ввода цифр)
Цитировать


Можем менять при иницилизации класса:
min =0 - минимальное значение (обязательно инициализировать)
max=100 - максимальное значение (обязательно инициализировать)
stepwidth=5  - шаг изменения (обязательно инициализировать)
default=40    - значение по умолчанию (по умолчанию = None)
wraparound=False - возможность начинать показ с начала диапазона, если дошли до крайнего значения. Так называемое вращение. (По умолчанию отключено = False.)

Класс ConfigPassword() - ввод пароля
Цитировать


default = '' – текст (по умолчанию = '')
fixed_size = False  - установка переключателя фиксированного размера (по умолчанию = False)
visible_width = 45   - видимая ширина пароля и она же является длинной пароля в случае установки флага fixed_size в состояние True. (по умолчанию = 45)
censor = '*'   - так, называемый цензор пароля, это знаки которые появятся после ввода пароля. (по умолчанию = символ звёздочки «*»)

Класс ConfigText() - ввод произвольного текста
Цитировать


default = 'Hello' - Текст по умолчанию (по умолчанию = '')
fixed_size = False -  фиксированный размер вводимого текста (по умолчанию = True)
visible_width = 10  - видимая ширина текста (по умолчанию = 45)

На этом классе основаны несколько других классов, которые отличаются от базового, только изменёнными по умолчанию аргументами передаваемыми в него и некоторыми дополнительными аргументами. Это такие, как:
ConfigNumber – ввод только цифр
ConfigDirectory – ввод директорий
ConfigPassword – ввод пароля (описан выше)
ConfigSearchText – ввод текста для поиска.

Класс ConfigSelection - позволяет выбрать из нескольких значений одно, при помощи кнопок «Вправо» и «Влево»
Цитировать


choices = Опции выбора в формате: {'sel_1': _( 'Selection 1' ), 'sel_2': _( 'Selection 2' )} (обязательно инициализировать)
default = "sel_1"  - опция которая будет выбрана при открытии. (По умолчанию = '')

Класс ConfigNothing - «пустышка»
Цитировать


Класс который представляет из себя описание обыкновенной «заглушки» или пустого пункта. Нужен в специфических целях.

Класс ConfigDateTime - ввод даты с заданным шагом (например год или месяц), при помощи кнопок «Вправо» и «Влево»  (без необходимости ввода цифр)
Цитировать


default – значение по умолчанию (обязательно инициализировать), обычно устанавливают равным текущему времени при помощи функции time() или localtime() из модуля time. Формат значения – формат времени.
Formatstring – строка форматирвоания результата вывода  (обязательно инициализировать). Формат задаётся одной переменной. В нашем примере мы меняем номер года. Поэтому формат = «%Y». Можно поставить так же месяц или день, обязательно задав соответствующий интервал изменения increment. (обязательно инициализировать).
increment= 31536000 – Интервал изменения переменной в секундах. В нашем примере мы изменяем номер года, потому и задаем число секунд в году, т.е. 31536000. (По умолчанию = 86400 или 24 часа).

Класс ConfigIP - ввод IP адреса
Цитировать


default – значение по умолчанию в формате [XXX, XXX, XXX, XXX] (обязательно инициализировать)
auto_jump=False – флаг автоматического перехода в следующее поле, при заполнении текущего поля. Другими словами, если Вы набрали все три цифры адреса в первом поле, то в случае если флаг будет = True, на экране, курсор перейдёт на следующее поле ввода адреса.
Этот класс является частным случаем базового класса ConfigSequence.
Он предназначен для ввода IP.

Базовый класс ConfigSequence - предназначен для ввода какой либо последовательности цифр.
Цитировать
Он имеет следующие аргументы:
separator – отделитель вводимой последовательности, в нашем примере с IP этим отделителем является точка «.» (обязательно инициализировать).
limits – крайние значения вводимого числа. В нашем примере этот параметр установлен в значение по умолчанию равным [(0, 255), (0, 255), (0, 255), (0, 255)] (обязательно инициализировать).
default – значение по умолчанию именно этот параметр задаёт нам формат  вводимого значения и именно по нему необходимо соответствующим образом устанавливать лимиты (обязательно инициализировать). Т.е. если Вы установили значение по умолчанию в [1,5], то и значение limits должно быть в формате [(ХХ, ХХ), (ХХ, ХХ)].
censor_char – символ-цензор, после ввода значений в переменную всё символы заполняются им. Как пример ввод пароля, когда все символы заполняются звёздочками. Есть тут тонкость – символы цензора появляются только при потере фокуса ввода этого элемента.

Приведу список классов основанных на базом классе ConfigSequence:
ConfigClock() – ввод времени в формате XX:XX, здесь limits = [(0, 23), (0, 59)] и разделитель есть seperator=':'. Значение default вводиться в секундах с начала unix времени. Если оставить параметр  default, то установится текущее время.
     
ConfigFloat() – ввод числа с плавающей запятой, где обязателен ввод limits и default. Разделитель есть seperator='.'

ConfigInteger() – ввод целого числа, где limits = (0, 9999999999L) обязателен ввод default. Разделитель есть seperator=':'

ConfigPIN() – ввод PIN кода, где limits=[(0, 10 ** len - 1)], т.е. от 0 до 10 в степени длины PIN кода, минус один или 1000 (если len = 4). Разделитель есть seperator=':'. Если Вы по какой либо причине опустите ввод значения default, то оно установится в значение «aaaa».

ConfigMAC() – ввод MAC адреса устройства, где mac_limits = [(1, 255),(1, 255),(1, 255),(1, 255), (1, 255),(1, 255)] и разделитель есть seperator=':'

ConfigIP() – см. описание выше

ConfigPosition() – ввод позиций крайней верхней (Y,X) и крайней нижней (Y,X)  точки прямоугольника на экране , где position_limits = [(0, 1279),(0, 719),(0, 1280),(0, 720)] и разделитель есть seperator=','

Теперь следующим в коде у нас идёт класс ConfigListScreen()
Цитировать
Это класс отвечает у нас за вывод сформированного списка list в элементе окна под названием self['config']. Он занимается обработкой всех событий которые происходят с этим элементом.
list – список специально сформированных элементов (см. ниже класс getConfigListEntry) (обязательный аргумент)
session=None – текущая сессия или некий индефикатор нашего окна (по умолчанию None)
on_change=None – имя функции без скобок, которая должна быть описана нами и которая будет вызываться при любом изменении в нашем элементе self['config']

Теперь рассмотрим метод getConfigListEntry() класса config
который позволяет нам сформировать на экране наши строчки с текстом и самими значениями:
Цитировать
Где
Описание элемента - текст, который мы видим с левой стороны от элемента
Элемент - один из элементов класса config
Именно этот метод подготавливает нам вывод на экран содержимого наших настроек. Без него мы не сможем подготовить наш список настроек.
Как видно из кода первым его аргументом является текст, а вторым один из наших управляемых элементов (которые мы описали с Вами выше )
Так же хочу сказать несколько слов о других методах касса config:

Метод updateConfigElement()
Цитировать
позволяет обновить существующий элемент списка класса config. Это больше служебная функция редко используемая, так как это можно реализовать другими более элегантными способами.

Метод updateItemDescription()
Цитировать
позволяет обновить описание наших элементов  по индексу элемента класса config. Совсем не используемая в проектах фугкция.

Метод NoSave()
Цитировать
позволяет избежать отслеживание и дальнейшее сохранение значений каких либо элементов настройки. Её можно использовать например так:

Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.

Далее у нас идёт класс Label,
Цитировать
который не имеет отношения к формированию нашего списка и который формирует специальным образом текст для вывода статического элемента заголовка нашего окна.

Потом класс ActionMap() – это класс, который отвечает за реакцию на нажатия клавиш на пульте. 
Цитировать
В нем мы прописываем на какие карты нажатий будет реагировать наше окно и какие функции будут запущены в случае нажатия той или иной кнопки. Карты нажатий или contexts мы можем посмотреть в фале /usr/lib/share/enigma2/keymap.xml. Далее идут название клавиши из той карты нажатий, которую Вы выбрали и через двоеточие соответствующая ей исполнительная функция, которая запустится при нажатии обозначенной кнопки. Будьте внимательны, так как в разных картах нажатий, одни и те же клавиши имеют разное название – выбирайте то которое Вам необходимо. И далее идёт ещё один аргумент prio – который отвечает за приоритет обработки клавиш в окнах. Если у Вас например будет последовательно одно из другого вызываться 4 окна (в качестве например Wizard), то данный параметр следует установить в значение -4 и последующих окнах на -1 больше, т.е. в следующем окне -3 (здесь могу ошибаться – те кто проверял поправьте пожалуйста).

И дальше в коде мы видим обработку нажатий назначенных клавиш. У нас их всего одна. Если мы нажмём на клавишу Exit (Cancel), то у нас вызовется метод self.askMe нашего класса, который проверит – изменяли ли мы что либо в нашем элементе self['config'] и если такие изменения были внесены, то вызовет окно с вопросом сохранять ли настройки. И в случае, если мы ответим «да», вызовет две функции сохранения наших данных.
Первая config.plugins.mytest.save() – зафиксирует изменения наших параметров и
вторая configfile.save() сохранит эти настройки в системном файле установок enigma2 (/etc/enigma2/settings)
 
Вот пожалуй и всё на сегодня.
К сообщению прилагаю тестовый модуль для собственных тестов.
Надеюсь, если Вы узнаете больше, чем здесь написано, то Вы обязательно поделитесь с нами.
Если есть вопросы пишите.
Удачи всем!
  • Vu Duo+ (GI S9895 HD), LiveX (ruDream), 13E, 36E
С Уважением, Добродел

Оффлайн ака Учкун

  • Рыцарь Джедай
  • *****
  • Забанен!
  • Сообщений: 1098
  • Поблагодарили: 4787
  • Уважение: +49
Вот это отличный урок!
Как было бы хорошо, если бы такие же уроки выложил по другим модулям из энигмы. Их еще море.......
  • vu+ultimo 9995
Мои авторские работы  нельзя редактировать для выкладывания на паблик.
Но их можно выкладывать неизмененными на любых ресурсах с указанием авторства
Мои кошельки:
WMZ     Z356196865451 WMR     R105983132832

Теги:
 

Похожие темы

  Тема / Автор Ответов Последний ответ
2 Ответов
2336 Просмотров
Последний ответ 29 июня | 2011г. | 09:50:50
от Vlad_net
10 Ответов
7021 Просмотров
Последний ответ 20 октября | 2012г. | 14:20:26
от Krendel
150 Ответов
81017 Просмотров
Последний ответ 06 октября | 2016г. | 20:56:20
от Ser6
4 Ответов
4281 Просмотров
Последний ответ 02 марта | 2014г. | 20:39:27
от Dobrodel
1 Ответов
2334 Просмотров
Последний ответ 12 марта | 2014г. | 14:28:45
от animal41



X

Добро пожаловать!

Мы заметили, что у Вас установлено расширение AdBlock или ему подобное. Пожалуйста добавьте наш Клуб в белый список, внесите этим посильную лепту в его развитие. Спасибо!