Если изучали питон, знаете, что графический интерфейс создается к примеру с помощью модуля Tkinter.
Так как мы перед собой ставим задачу научится писАть или хотя бы править плагины на имидже enigma2, сразу скажу, забудьте про Tkinter.
Нам врядь ли понадобится напрямую работать с этим модулем.
Дело в том, что разработчики enigma2 уже позаботились о графическом интерфейсе для плагинов в том числе.
В имидже уже имеются готовые модули окон (Screen), которые достаточно в плагине только импортировать.
Эти окна-Screen находятся в имидже по пути
/usr/lib/enigma2/python/Screen/.
К примеру, если вы разработаете плагин-плеер для какого-нибудь видеоформата, можете использовать любой из этих окон-screen
Infobar
DVDТакже известно, что вообще питон очень богат на готовые библиотечные модули, которыми просто нужно пользоваться, а кроме того еще и изучая enigma2,
мы узнаем что в имидже по пути
/usr/lib/enigma2/python/Components/ находятся также немало модулей, которыми тоже нужно пользоваться.
Ну вот и попытаемся написать интерфейс плагина с использованием всего этого.
Снова подготовим програмку
Geany для написания кода.
Тот код, который мы уже написали относится к двум событиям в плагине, то есть две части написанного нами кода это есть два события.
Первое событие назовем - Сохранение текущих настроек тюнера (тюнеров).
Второе событие - Применение ранее сохраненных настроек тюнера (тюнеров).Нам остается написать весь остальной код для окончательного оформления плагина.
Порядок действий нашей дальнейшей работы:
1. Определить какое окно-Screen нам нужно импортировать и написать инструкцию __init__ со всем необходимыми виджетами,
с нужным акшинмапом и так далее.
2. Затем сразу определится с разработкой главного окна в xml.
3. Разработать меню и обработать события элементов меню и кнопок.
4. При необходимости написать (воспользовавшись готовым шаблоном) языковую часть плагина с файлами .po и .mo
5. Последний штрих - выбрать в каком меню имиджа нужно отобразить плагин и написать код запуска.......По порядку.
1. Определить какое окно-Screen нам нужно импортировать и написать инструкцию __init__ со всем необходимыми виджетами.Откроем новый файл снова по шаблону main.py и не забываем про униксовые окончания строк.
Очищаем окно Geany от шаблонного кода и приступаем.
Как уже сказал, окно будем просто импортировать из готового
/usr/lib/enigma2/python/Screen/.Нам в данном случае подходит окно-screen собственно под названием
Screen.
Значит первой строкой нашего кода будет импорт этого модуля
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Здесь нужно разьяснение. Более продвинувшись в питоне и открыв в имидже этот файл Screen, сами разберетесь в его коде, а пока скажу вот что.
В этом файле разработано скажем "эфемерное" окно. Там нет ни размеров, и естественно ни виджетов-элементов....
Все это мы сами напишем.
Импортировав Screen мы тутже его применяем.
То есть сперва-наперва создаем класс, придумав название, в нашем случае скажем NimSettings и передаем ему в качестве аргумента (вернее как суперкласс) этот самый Screen:
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Так как при вызове этого класса (читай - главного окна плагина), сразу же мы должны лицезреть не пустое окно-Screen,
то есть требуется гарантировать чтобы окно (то бишь класс) сразу содержал такие атрибуты как скажем меню, кнопки, название окна,
создаем инструкцию-функцию с помощью метода под названием __init__ (название встроенное, а тело метода создаем сами).
Не знаю, сумел ли я объяснить (я то сам тоже не сразу понял), но методом __init__ следует пользоваться если необходимо, чтобы интерпретатор
автоматически вызывал метод при вызове самого класса, без необходимости вызова по имени метода.....
Вот и начнем конструировать первую обязательную в нашем случае функцию (__init__) для класса-окна (далее для правильного восприятия и понимания буду писать сразу весь код сначала):
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Почему в скобках у метода
__init__ мы записали два аргумента
self и
session?
self - атрибут обязательный, означающий экземпляр объекта. То есть интерпретатор при вызове объекта создает его экземпляр, потому
self обязателен.
Может немного сложно, но понимание роли
self имеет ключевое значение.
А
session, это атрибут ожидаемый от вызывающей функции....
Добавляем из суперкласса (то есть из импортируемого Screen) вызываем метод
__init__ (обязательно):
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Продолжаем оформлять наш метод
__init__ и приступаем непосредственно к элементам самого окна.
Здесь опять нужно отступление.
Смотрите вот предыдущую строчку мы совершенно не зря вписали, не зря импортировали инициализацию модуля
Screen из
одноименного файла в папке
Screens. Потому что далее будем использовать атрибуты-методы из него, а также из модулей, который уже импортирует он.
Например из компонента
GUISkin находящегося в папке
Components уже.
Далее буду просто упоминать из какого модуля какой метод.....
Вот воспользуемся методом
setTitle, который разработан уже в компоненте
GUISkin (откройте его и поизучайте), чтобы сконструировать
название окна меню, передав этому методу в качестве аргумента непосредственно придуманное нами название окна в виде строки:
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
И тут же изменим эту строчку, чтобы это самое название переводилось имиджем на русский.
Что нужно сделать для этого. Нужно импортировать gettext (сделаем потом) и указать ему, что строку нужно переводить, для
этого достаточно взять строку в скобки и перед скобками вставить нижнее подчеркивание, то есть вот так
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Весь код сначала класса
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Правда если действительно изучите
GUISkin, то увидите что также совершенно равноценно этому будет и простой виджет
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
И нужно будет создать виджет с сурчом "Title", и это действительно тоже самое.....
Кстати вот таким макаром
self["Title"] - добавление к self строки в квадратных скобках, создаются виджеты в методе
__init__Так, название самого окна меню создали. Теперь подумаем, что еще будет в нашем меню.
а) В нашем случае нужно не конфиг-меню (то есть с ответами да-нет, с выбором вариантов), а простое меню из двух пунктов.
Первый будет "Сохранение настроек тюнеров",
Второй будет "Восстановление настроек тюнеров".
б) И кроме меню, наверно нужен еще простой текстовый виджет, где будет написано "Нажмите ОК для выбора действия", ведь всегда найдутся непонятливые,
что для выбора нужного пункта на нем просто нужно нажать ОК.
в) Ну и одна наверно только кнопка - красная с надписью "Выход" или "Назад", кому как нравится.Все это конечно внутри метода
__init__Меню создадим тоже в виде виджета. И мы знаем что наше меню это список.
Поэтому снова воспользуемся готовым модулем
List из папки
Sources имиджа, импортируем этот модуль (в самом начале кода)
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
В методе
__init__ создаем для начала пустой список (назвав его как хотим):
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
И далее создаем виджет меню, передав модулю
List этот список (который затем заполним) в качестве аргумента:
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
И весь код сначала класса
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Следующий б) текстовый виджет
Для вывода простого текста воспользуемся модулем
Label из компонентов (для интереса изучайте в папке
/usr/lib/enigma2/python/Components/Label)
Как обычно импортируем его в начале кода
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Кстати на этот момент весь наш импорт
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
И пишем код виджета с возможностью перевода
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
И создаем красную кнопку, также виджетом
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
И весь код сначала класса
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Нужно также создать акшинмап, то есть функцию для кеймапа, то бишь действия при нажатии кнопок.
Для этого перво-наперво импортируем модуль
ActionMap из компонентов
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
А сам код сначала напишу, потом поясню.
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Итак здесь
self["shortcuts"] понятно название, но
shortcuts произвольно, можете назвать как хотите, главное уже то, что справа от знака присваивания =
В качестве аргументов импортируемому модулю
ActionMap передаются, сначала названия контекстов кеймапа имиджа.
Ну то есть в данном случае это два контекста
"ShortcutActions", "WizardActions". Их мы берем из файла
кеймап.хмл имиджа. Они там прописаны как
map context= Надеюсь обьяснять где находится
кеймап.хмл не нужно.
А вот второй аргумент, это словарный, справа названия кнопок из тех самых двух контекстов, но нужные только нам, а справа названия функций (сами придумаем), а тело самых этих функций,
то есть обработчики событий напишем впоследствии дальше......
И последнее в методе
__init__ собственно должны написать название инструкции по созданию списка меню, который у нас пока пуст как помните....
Название также произольное....
Тело функции допишем впоследствии...
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Итого пока весь импорт и весь класс
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Вообще-то в самом начале класса должен быть хмловский код окна-Screen, и затем уже метод
__init__, но так как этот хмловский код без этого метода не создашь,
порядок действий выбран таков.
Далее, с помощью уже не питона, а хмл создадим само окно.
А затем закончим код класса, разработкой функций
cancel,
action,
createList...
И в самом конце оформим вызов плагина.......
На сегодня все пока.
Думаю, поняли из вышенаписанного каждую строчку кода, начиная - почему классу в качестве аргумента передали модуль Screen, заканчивая - как создавать акшинмап.....
Продолжение следует.......