
En esta tercera lección vamos a explicar la creación de un plugin Basico enigma2, partiendo de la base del plugin leccion 2, en el cual vamos a añadir funciones a los botones de colores del mando a distancia para que realicen una ejecucion.
Lecciones anteriores:
- Leccion 1: https://jungle-team.com/leccion-1-creacion-plugin-basico-python-enigma2/
- Leccion 2: https://jungle-team.com/leccion-2-creacion-plugin-basico-python-enigma2-elementos-configuracion/
1. Estructura Basica codigo
Como vimos en anteriores lecciones la estructura basica del codigo de un plugin enigma2 consta de diferentes secciones, dependiendo de la funcionalidad que le vamos a dar al plugin, deberemos realizar primero la importacion de las librerias necesarias para que el plugin funcione correctamente, estas importanciones se insertan en la cabezera del codigo.
Para esta segunda leccion vamos a realizar:
- Añadir botones de colores
- Que cada boton de color realice la ejecucion de una funcion
- Como ejecutar codigo shell en python (para la ejecucion de un script)
- Para ver una posible usabilidad, lo vamos a enfocar a la ejecucion del script de junglescript
1. Realizamos las importaciones necesarias para la funcionalidad del plugin que vamos a realizar:
import os from enigma import eDVBDB 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.Sources.StaticText import StaticText from Components.Sources.List import List from Components.config import config, getConfigListEntry, ConfigText, ConfigInteger, ConfigSelection, ConfigSubsection, ConfigYesNo, configfile, NoSave from Components.ConfigList import ConfigListScreen from Tools.LoadPixmap import LoadPixmap
- 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.
- List: La clase «List» nos proporiona una lista de opciones de configuración adicionales para el plugin, como la selección de una configuracion concreta. En general, la clase «List» es una herramienta útil para manejar una lista de objetos en un plugin de Enigma2.
- Config: Cada una de las clases y objetos que se pueden importar de esta libreria nos proporcionan un tipo de opción de configuración diferente que puede ser utilizado para solicitar información del usuario o establecer valores predeterminados en el plugin, por ejemplo la clase «ConfigYesNo» puede utilizarse para solicitar al usuario que seleccione entre dos opciones, sí o no.
- ConfigListScreen: La importación de la clase «ConfigListScreen» desde el módulo «Components.ConfigList» en un plugin de Enigma2 permite la creación de una pantalla de configuración que muestra una lista de opciones de configuración en forma de tabla.
- os: La biblioteca
os
en Python proporciona una manera de interactuar con el sistema operativo subyacente, permitiendo al programador realizar tareas como la creación de directorios, la eliminación de archivos, la ejecución de comandos del sistema y la manipulación de rutas de archivo. - eDVBDB: la biblioteca
eDVBDB
puede ser utilizada para acceder y manipular información de la base de datos de enigma2. Esto puede incluir la recuperación de información sobre los canales de televisión y radio, en este caso la vamos a usar para refrescar la lista canales y favoritos despues de instalar la lista canales con junglescript. - StaticText: La biblioteca
StaticText
en un plugin de enigma2 es una biblioteca de Python que proporciona una manera de mostrar texto estático en la pantalla. Esta biblioteca es útil para crear elementos de la interfaz de usuario en un plugin de enigma2, como etiquetas de texto o títulos de sección.. la cual usaremos para el asignar texto en la interfaz del skin para los botones. - LoadPixmap: La biblioteca
LoadPixmap
en un plugin de enigma2 es una biblioteca de Python que proporciona una manera de cargar imágenes en la pantalla del usuario. Esta biblioteca es útil para crear elementos visuales en un plugin de enigma2, en este caso la usaremos para mostrar icono png del color del boton.
2. Ahora respecto a la leccion 2, vamos a ver como se han añadido los botones de colores:
def __init__(self, session): Screen.__init__(self, session) self['title'] = Label('Base ejecucion funcion botones colores') self.indexpos = None self.list = [] self.list.append(getConfigListEntry(_('Selecciona la lista canales a instalar'), config.plugins.PluginBase3.tipolista)) self.list.append(getConfigListEntry(_('Selecciona si quiere instalar picon'), config.plugins.PluginBase3.picon)) self.list.append(getConfigListEntry(_('Selecciona tipo picon a instalar'), config.plugins.PluginBase3.tipopicon)) ConfigListScreen.__init__(self, self.list, session=session) self['actions'] = ActionMap(['OkCancelActions', 'ColorActions'], { 'ok': self.save, 'cancel': self.close, 'green': self.save, 'blue': self.instalacion, }) self['key_blue'] = StaticText(_('Instalar')) self['key_green'] = StaticText(_('Guardar'))
Se define el mapeo de acciones para los botones del control remoto en el objeto self['actions']
. El mapeo de acciones se define para los botones ‘ok’, ‘cancel’, ‘green’ y ‘blue’. Cuando se presiona el botón ‘ok’ o ‘green’, se llama al método save
, y cuando se presiona el botón ‘cancel’, se llama al método close
. Cuando se presiona el botón ‘blue’, se llama al método instalacion
.
Finalmente, se definen dos objetos StaticText
con el texto «Instalar» y «Guardar» y se agregan a los objetos self['key_blue']
y self['key_green']
, respectivamente. Estos objetos representan las etiquetas de texto para los botones azul y verde en la pantalla de configuración.
3. En cuanto al objeto skin (xml), su funcion es:
skin = """ <screen name="Plugin Base 3" title="Base3" position="center,center" size="800,500"> <widget name="title" position="10,10" size="600,40" font="Regular;24" halign="center" /> <widget name="config" position="10,60" size="700,400" itemHeight="30" /> <ePixmap pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PluginBase3/blue.png" position="20,440" size="30,40" alphatest="blend" /> <widget source="key_blue" render="Label" position="70,440" size="300,75" zPosition="3" font="Regular; 24" transparent="1" backgroundColor="#c4c4c4" foregroundColor="white" noWrap="1" /> <ePixmap pixmap="/usr/lib/enigma2/python/Plugins/Extensions/PluginBase3/green.png" position="250,440" size="30,40" alphatest="blend" /> <widget source="key_green" render="Label" position="300,440" size="300,75" zPosition="3" font="Regular; 24" transparent="1" backgroundColor="#c4c4c4" foregroundColor="white" noWrap="1" /> </screen> """
Se define una sola pantalla (screen) llamada «Plugin Base 3». La pantalla tiene un título «Base3» y se posiciona en el centro de la pantalla con una anchura de 800 píxeles y una altura de 500 píxeles.
En la pantalla hay varios widgets que se utilizan para mostrar y modificar la configuración del plugin. Hay un widget Label llamado «title» que se posiciona en la parte superior de la pantalla y muestra un título con el texto «title».
El widget ConfigListScreen muestra una lista de opciones de configuración para el usuario.
Hay dos widgets ePixmap que representan los botones azul y verde (cuyos archivos png deberan estar en la ruta del plugin. Estos botones se posicionan en la parte inferior de la pantalla y tienen un tamaño de 30×40 píxeles. También hay dos widgets Label que muestran el texto «Instalar» y «Guardar» para los botones azul y verde, respectivamente.
4. Ahora vemos las funciones de ejecucion que se le han añadido a los dos botones, en cuanto al boton green le hemos añadido la misma funcion que el boton ok que ya se explica en la leccion 2, o sea funcion de save, y al boton azul se le ha añadido la funcion de instalar la lista de canales ejecutando el script de junglescript:
def instalacion(self): os.system("/usr/bin/enigma2_pre_start.sh") eDVBDB.getInstance().reloadServicelist() eDVBDB.getInstance().reloadBouquets() self.session.open(MessageBox, (_('Se ha realizado la ejecucion')), MessageBox.TYPE_INFO, timeout=4)
Se llama a la función os.system
con el argumento "/usr/bin/enigma2_pre_start.sh"
. Esto ejecuta un script de shell llamado enigma2_pre_start.sh
, que generalmente se utiliza para realizar tareas de inicialización antes de que el proceso de enigma2 comience.
A continuación, se llama al método reloadServicelist
del objeto eDVBDB.getInstance()
. Este método actualiza la lista de servicios de televisión y radio disponibles en el receptor Enigma2.
Luego, se llama al método reloadBouquets
del mismo objeto. Este método actualiza la lista de listas de canales disponibles en el receptor Enigma2.
Finalmente, se abre una ventana de diálogo MessageBox utilizando el método self.session.open
con el texto 'Se ha realizado la ejecucion'
, el tipo de mensaje MessageBox.TYPE_INFO
y un tiempo de espera de 4 segundos. Esto muestra una notificación en la pantalla del usuario que indica que se ha realizado la ejecución de la instalación.
5. Funcion de inicio del plugin y descripcion
def main(session, **kwargs): session.open(PluginBase3) def Plugins(**kwargs): return [PluginDescriptor( name="Plugin Base 3", description="Menu Configuracion con funcion", icon="base3.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 PluginBase3.
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 con seleccion de configuracion y ejecucion de botones de colores, 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:
Tras pulsar boton verde se guarda la configuracion
Tras pulsar boton azul se ejecuta el script junglescript