
En esta primera lección vamos a explicar la creación de un plugin Basico enigma2, en la que nos aparecera un menu con una lista de funciones que podemos ejecutar, antes de comenzar, debemos tener en cuenta que necesitaremos, algunas herramientas basicas para su desarrollo.
Requisitos previos:
1. Un editor de texto compatible con unix (por ejemplo notepad++): Pulsar para descarga
2. Acceder al receptor mediante ftp o sftp (por ejemplo wincsp): Pulsar para descarga
3. Acceder al receptor mediante telnet o ssh (por ejemplo Putty): Pulsar para descarga
1. Estructura Basica archivos y directorio
La estructura basica de un plugin enigma2 la podemos ver en el siguiente esquema:
NombrePlugin/ __init__.py plugin.py logo.png
Figura 1 extructura
- «NombrePlugin«: Directorio que contiene los archivos del plugin
- «__init__.py«: archivo vacío que indica que la carpeta es un paquete de Python.
- «plugin.py«: archivo principal del plugin, que contiene el código ejecutable.
- «logo.png«: archivo tipo imagen que se mostrara como logo identificativo del plugin.
Nota
En el archivo Plugin.py se define la funcionalidad del mismo, donde ademas deberemos insertar funcion de «skin» que como veremos mas adelante define la interfaz de usuario que se muestra en pantalla.
Por lo general, el directorio principal de los plugins en Enigma2 es /usr/lib/enigma2/python/Plugins/Extensions/, dentro del cual se encuentran las carpetas de cada uno de los plugins instalados.
- Por ejemplo, si el nombre del plugin es NombrePLugin, el directorio completo podría ser: /usr/lib/enigma2/python/Plugins/Extensions/NombrePlugin/
2. Estructura Basica codigo
La estructura basica del codigo de un plugin enigma2 consta de diferentes secciones, las mas importantes, en el caso basico que estamos tratando de un plugin con menu con ejecucion de varias funciones es:
1. Importaciones: Esta sección se ubica en la cabezera del codigo python del plugin, incluye todas las librerías que se necesitan para que el plugin funcione, por lo tanto depende de las funciones que deseemos que el plugin muestre o ejecute, deberemos añadir las importaciones necesarias, para este ejemplo, las mas basicas son:
from Plugins.Plugin import PluginDescriptor from Components.ActionMap import ActionMap from Screens.Screen import Screen from Screens.MessageBox import MessageBox from Components.Label import Label from Components.MenuList import MenuList
- PluginDescriptor: es una clase de la librería en Enigma2 que se utiliza para describir las propiedades de un plugin. Esta clase se utiliza para que el sistema de Enigma2 pueda identificar el plugin y mostrarlo en el menú de plugins.
- ActionMap: es una clase de la librería en Enigma2 que se utiliza para mapear eventos y acciones en la interfaz de usuario de Enigma2, los eventos pueden ser acciones realizadas por el usuario, como presionar un botón del mando a distancia, por ejemplo la funcion que se realiza al pulsar el boton OK del mando a distancia.
- Screen: es una clase de la librería en Enigma2 que se utiliza para crear y gestionar pantallas (ventanas) en la interfaz de usuario de Enigma2.
- MessageBox: es una clase de la librería en Enigma2 que se utiliza para mostrar mensajes y diálogos en la interfaz de usuario de Enigma2.
- Label: proporciona métodos para crear y personalizar etiquetas de texto, que pueden ser utilizadas para mostrar información al usuario, como el título de una pantalla.
- MenuList es una clase de la librería en Enigma2 que se utiliza para crear listas de elementos seleccionables en la interfaz de usuario de Enigma2.
2. Class: las clases se utilizan para definir los diferentes componentes de la interfaz de usuario, como pantallas, listas, botones, etiquetas, entre otros. Cada clase define una serie de atributos y métodos que definen el comportamiento y la apariencia de ese componente en la interfaz de usuario.
Por ejemplo, la clase Screen se utiliza para definir una pantalla en la interfaz de usuario de Enigma2, y proporciona atributos y métodos para personalizar la apariencia y el comportamiento de esa pantalla. De manera similar, la clase MenuList se utiliza para definir una lista de elementos seleccionables en la interfaz de usuario de Enigma2, y proporciona atributos y métodos para personalizar la apariencia y el comportamiento de esa lista.
class PluginBase1(Screen): skin = """ <screen name="Plugin Base 1" title="Base1" position="center,center" size="400,200"> <widget name="title" position="10,10" size="380,40" font="Regular;24" halign="center" /> <widget name="menu" position="10,60" size="380,120" itemHeight="30" /> </screen> """ def __init__(self, session): Screen.__init__(self, session) self.list = [] self.list.append(('Funcion 1', 'ejecutar1')) self.list.append(('Funcion 2', 'ejecutar2')) self.menu = MenuList(self.list) self['menu'] = self.menu self['title'] = Label('Base ejecucion funcion lista') self['actions'] = ActionMap(['OkCancelActions'], { 'ok': self.seleccionarfuncion, 'cancel': self.close, }, -2)
En este ejemplo se define una clase PluginBase1 que hereda de Screen, a continuacion:
- En el método init, se define una lista vacía llamada «list» y se agregan dos funciones a esa lista, cada una con un nombre de función y una cadena de texto que se mostrará en el menú.
- Se crea un objeto MenuList a partir de la lista «list».
- Se asigna el objeto MenuList a una clave ‘menu’ del diccionario self.
- Se crea un objeto Label con el texto «Base ejecución función lista» y se asigna a una clave ‘title’ del diccionario self.
- Se define un objeto ActionMap con las acciones ‘ok’ y ‘cancel’ para la pulsación de botones del mando.
- Cuando se presiona el botón ‘ok’, se ejecutará el método «seleccionarfuncion» y cuando se presiona el botón ‘cancel’, se cerrará la pantalla.
En cuanto al objeto skin (xml), su funcion es:
- <screen>: Es el elemento raíz que define la pantalla. Tiene un nombre, un título, una posición y un tamaño.
- <widget>: Define un elemento en la pantalla, como un título o un menú. Tiene un nombre, una posición, un tamaño, una fuente y otros atributos de estilo.
- name, position y size: Son atributos comunes en los elementos <screen> y <widget> que definen el nombre, la posición y el tamaño del elemento.
- title: Es un widget que muestra el título de la pantalla. Se define la fuente y el tamaño del texto con los atributos font y size.
- menu: Es un widget que muestra un menú en la pantalla. Se define el tamaño de cada elemento del menú con el atributo itemHeight.
3. Funcion principal del plugin, es la seccion donde definimos que deseamos que realize el plugin, en este caso simplemente que muestre unos mensajes en pantalla usando la importacion messagebox.
def seleccionarfuncion(self): ejecutarfuncion = self.menu.getCurrent()[1] if ejecutarfuncion == "ejecutar1": self.funcion1() elif ejecutarfuncion == "ejecutar2": self.funcion2() def funcion1(self): self.session.open(MessageBox, "Se ejecutaria funcion 1 ...", MessageBox.TYPE_INFO) def funcion2(self): self.session.open(MessageBox, "Se ejecutaria funcion 2 ...", MessageBox.TYPE_INFO)
El primer método, seleccionar funcion, se llama cuando se presiona el botón «ok» en la lista del menú. Obtiene el nombre de la función seleccionada en el menú y la ejecuta llamando a los métodos funcion1 o funcion2 según corresponda.
Los métodos funcion1 y funcion2 abren una ventana emergente de tipo MessageBox que muestra un mensaje informativo que indica que se ejecutaría la función 1 o la función 2.
4. Funcion de inicio del plugin y descripcion
def main(session, **kwargs): session.open(PluginBase1) def Plugins(**kwargs): return [PluginDescriptor( name="Plugin Base 1", description="Menu Lista con funcion", icon="base1.png", where=[PluginDescriptor.WHERE_PLUGINMENU], fnc=main, )]
La función main es la función que se ejecuta al seleccionar el plugin desde el menú principal de enigma2, en este caso se abre la pantalla PluginBase1.
La función Plugins es una función que devuelve una lista de objetos PluginDescriptor. Cada objeto PluginDescriptor describe un plugin y tiene varios atributos, como name (nombre del plugin), description (descripción del plugin), icon (ruta del archivo de icono), where (dónde aparece el plugin, en este caso en el menú de plugins), y fnc (la función que se ejecuta al seleccionar el plugin).
3. Ejecucion del Plugin
En este caso hemos realizado un codigo basico de un plugin enigma2, el cual lo podeis descargar para probar y editar del siguiente enlace:
Una vez descargado ya el plugin realizara las acciones que hemos explicado y desarrollado en esta leccion:
Nota
Cuando realicemos cambios en el codigo del plugin es necesario reiniciar Gui en enigma2, lo podemos realizar por terminal ejecutando init 4 y luego init 3, si cometemos algun error, podemos ver en el log el tipo de error ejecutando por terminal init 4 y luego enigma2
3 comentarios en «Leccion 1: Creacion Plugin Basico python enigma2»