03 июля | 2024г. | 05:57:50


АвторТема: Пишем плагин сами или случайные уроки по python  (Прочитано 83295 раз)

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

Оффлайн ака УчкунАвтор темы

  • Рыцарь Джедай
  • *****
  • Забанен!
  • Сообщений: 1098
  • Поблагодарили: 4787
  • Уважение: +49
Если изучали питон, знаете, что графический интерфейс создается к примеру с помощью модуля 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.
Значит первой строкой нашего кода будет импорт этого модуля

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

Спойлер   :
Как импортировать модули, когда через from-import, а когда через import, а в каких случаях импортировать весь модуль через
звездочку вы уже надеюсь почитали. Также как и про переменную path, из-за которого собственно и не надо указывать
полный путь к папке Screens.... Это тоже еще только азы питона....

Здесь нужно разьяснение. Более продвинувшись в питоне и открыв в имидже этот файл Screen, сами разберетесь в его коде, а пока скажу вот что.
В этом файле разработано скажем "эфемерное" окно. Там нет ни размеров, и естественно ни виджетов-элементов....
Все это мы сами напишем.
Импортировав  Screen мы тутже его применяем.

То есть сперва-наперва создаем класс, придумав название, в нашем случае скажем NimSettings и передаем ему в качестве аргумента (вернее как суперкласс) этот самый Screen:
 
Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
Так как при вызове этого класса (читай - главного окна плагина), сразу же мы должны лицезреть не пустое окно-Screen,
то есть требуется гарантировать чтобы окно (то бишь класс) сразу содержал такие атрибуты как скажем меню, кнопки, название окна,
создаем инструкцию-функцию с помощью метода под названием __init__ (название встроенное, а тело метода создаем сами).
Не знаю, сумел ли я объяснить (я то сам тоже не сразу понял), но методом __init__ следует пользоваться если необходимо, чтобы интерпретатор
автоматически вызывал метод при вызове самого класса, без необходимости вызова по имени метода.....


Спойлер   :
Не отчаивайтесь, даже если не поняли. В процессе затем поймете.
Пока просто имейте ввиду, любые атрибуты внутри метода __init__ присваиваются классу автоматом при вызове самого класса.
А остальные атрибуты этого класса необходимо будет вызывать по имени, например так
имя_класса.имя_метода()
А нужно или не нужно применять метод __init__ будете решать сами, в данном случае нужно, так как это окно менюшки плагина.....

Вот и начнем конструировать первую обязательную в нашем случае функцию (__init__) для класса-окна (далее для правильного восприятия и понимания буду писать сразу весь код сначала):

Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.   
      
      
   
Почему в скобках у метода __init__ мы записали два аргумента self и session?
self - атрибут обязательный, означающий экземпляр объекта. То есть интерпретатор при вызове объекта создает его экземпляр, потому self обязателен.
Может немного сложно, но понимание роли self имеет ключевое значение.
А session, это атрибут ожидаемый от вызывающей функции....

Добавляем из суперкласса (то есть из импортируемого Screen) вызываем метод __init__ (обязательно):

Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
      
Спойлер   :
Почему здесь session, изучите сам файл Screen и увидите там
def getRelatedScreen(self, name):
      if name == "session":
         return self.session.screen

вот поэтому.....
         


Спойлер   :
Так скрупулезно прохожу каждый пункт, хотя честно пока это вещи в принципе элементарные, но хочу чтобы мы каждый шаг совершали только понимаюче,
каждую букву кода буквально осмыслывали, откуда же взялось это и так далее...
Тогда из нас толк выйдет....


Продолжаем оформлять наш метод __init__ и приступаем непосредственно к элементам самого окна.
Здесь опять нужно отступление.
Смотрите вот предыдущую строчку мы совершенно не зря вписали, не зря импортировали инициализацию модуля Screen из
одноименного файла в папке Screens. Потому что далее будем использовать атрибуты-методы из него, а также из модулей, который уже импортирует он.
Например из компонента GUISkin находящегося в папке Components уже.
Далее буду просто упоминать из какого модуля какой метод.....

Вот воспользуемся методом setTitle, который разработан уже в компоненте GUISkin (откройте его и поизучайте), чтобы сконструировать
название окна меню, передав этому методу в качестве аргумента непосредственно придуманное нами название окна в виде строки:

Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
И тут же изменим эту строчку, чтобы это самое название переводилось имиджем на русский.
Что нужно сделать для этого. Нужно импортировать gettext (сделаем потом) и указать ему, что строку нужно переводить, для
этого достаточно взять строку в скобки и перед скобками вставить нижнее подчеркивание, то есть вот так

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

Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.      
Правда если действительно изучите GUISkin, то увидите что также совершенно равноценно этому будет и простой виджет

Вам не разрешен просмотр кода. Войдите или Зарегистрируйтесь для просмотра.
И нужно будет создать виджет с сурчом "Title", и это действительно тоже самое.....
Кстати вот таким макаром self["Title"] - добавление к self строки в квадратных скобках, создаются виджеты в методе __init__


Спойлер   :
Правда в этом варианте нам нужно будет указать, собственно откуда взяли метод StaticText , который мы "одолжим" у одноименного модуля-компонента из папки /usr/lib/enigma2/python/Components/Sources/StaticText
То есть добавить этот модуль в импортируемые (в самое начало нашего кода)
from Components.Sources.StaticText import StaticText

Так, название самого окна меню создали. Теперь подумаем, что еще будет в нашем меню.
а) В нашем случае нужно не конфиг-меню (то есть с ответами да-нет, с выбором вариантов), а простое меню из двух пунктов.
Первый будет "Сохранение настроек тюнеров",
Второй будет "Восстановление настроек тюнеров".
б) И кроме меню, наверно нужен еще   простой текстовый виджет, где будет написано "Нажмите ОК для выбора действия", ведь всегда найдутся непонятливые,
что для выбора нужного пункта на нем просто нужно нажать ОК.   
в) Ну и одна наверно только кнопка - красная с надписью "Выход" или "Назад", кому как нравится.


Все это конечно внутри метода __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, заканчивая - как создавать акшинмап.....

Продолжение следует.......



  • vu+ultimo 9995
Мои авторские работы  нельзя редактировать для выкладывания на паблик.
Но их можно выкладывать неизмененными на любых ресурсах с указанием авторства
Мои кошельки:
WMZ     Z356196865451 WMR     R105983132832

Теги:
 

Похожие темы

  Тема / Автор Ответов Последний ответ
9 Ответов
16062 Просмотров
Последний ответ 14 февраля | 2019г. | 10:01:39
от drakon71
27 Ответов
25737 Просмотров
Последний ответ 04 апреля | 2022г. | 06:06:17
от тихон
1 Ответов
9246 Просмотров
Последний ответ 20 марта | 2014г. | 00:40:50
от Taapat
0 Ответов
3469 Просмотров
Последний ответ 07 апреля | 2014г. | 00:52:47
от 2boom
4 Ответов
4844 Просмотров
Последний ответ 03 апреля | 2016г. | 16:49:33
от Corwin



X

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

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