
En esta cuarta lección vamos a explicar la creación de un plugin Basico enigma2, partiendo de la base del plugin leccion 3, en el cual vamos a añadir funciones condicionales usando if y except, asi como mostrar en pantalla informacion de un archivo.
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/
- Leccion 3: https://jungle-team.com/leccion-3-creacion-plugin-basico-python-enigma2-botones-ejecucion/
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 condicionales para la ejecucion de codigo
- Como ejecutar codigo shell en python (usando la variante IConsole)
- Mostrar informacion en pantalla del contenido de un archivo
1. Realizamos las importaciones necesarias para la funcionalidad del plugin que vamos a realizar:
import os 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 from Components.Console import Console as iConsole
- 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. - Iconsole: Para la ejecucion de comandos shell.
- 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 3, vamos a ver en primer lugar como se captura la informacion de un archivo:
def fecha_instalacion(): try: with open('/etc/enigma2/actualizacion', 'r') as f: fecha = f.read() except FileNotFoundError: fecha = "no existe informacion sobre lista canales" return fecha
Este código define una función llamada fecha_instalacion()
que intenta abrir y leer el archivo /etc/enigma2/actualizacion
. Si el archivo existe y se puede leer, se almacena su contenido en la variable fecha
. Si el archivo no existe (lo que provocaría una excepción de tipo FileNotFoundError
), la función asigna el valor «no existe informacion sobre lista canales» a la variable fecha
.
3. Ahora debes capturar esta variable para ser mostrada en pantalla, en este ejemplo:
def __init__(self, session): Screen.__init__(self, session) self.iConsole = iConsole() self['title'] = Label('Base ejecucion condicionales') self.indexpos = None self.list = [] self.list.append(getConfigListEntry(_('Selecciona la lista canales a instalar'), config.plugins.PluginBase4.tipolista)) self.list.append(getConfigListEntry(_('Selecciona ubicacion picon'), config.plugins.PluginBase4.fpicon)) self.list.append(getConfigListEntry(_('Selecciona si quiere instalar picon'), config.plugins.PluginBase4.picon)) self.list.append(getConfigListEntry(_('Selecciona tipo picon a instalar'), config.plugins.PluginBase4.tipopicon)) self.list.append(getConfigListEntry(_('Selecciona si quiere autoinstalacion'), config.plugins.PluginBase4.auto)) 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')) self["instalacion"] = StaticText(_("Fecha Lista instalada: %s") % fecha_instalacion())
En este caso, la línea de código define un widget StaticText y lo asigna al atributo instalacion del objeto actual.
El texto que se muestra en el widget se define mediante una cadena de formato (%s) que incluye la cadena «Fecha Lista instalada: » y el resultado de llamar a la función fecha_instalacion() (que debe devolver una fecha o una cadena de texto que indica que no se dispone de información sobre la fecha de instalación).
4. En cuanto al objeto skin (xml), su funcion para mostrar la fecha instalacion es:
class PluginBase4(ConfigListScreen, Screen): skin = """ <screen name="Plugin Base 4" title="Base4" 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/PluginBase4/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/PluginBase4/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" /> <widget source="instalacion" render="Label" position="20,400" size="350,50" zPosition="3" font="Regular; 17" transparent="1" backgroundColor="yellow" foregroundColor="#c4c4c4" noWrap="1" /> </screen> """
Para añadir esta nueva opcion de visualizacion de la lista canales, añadimos:
source="instalacion"
: establece la fuente de datos para el contenido del widget. En este caso, la fuente es el atributoinstalacion
del objeto actual.render="Label"
: establece el tipo de widget que se va a crear, en este caso, un widget de etiqueta (label) que muestra texto.position="20,400"
: establece la posición del widget en la pantalla en píxeles desde la esquina superior izquierda. En este caso, se posiciona en (20, 400).size="350,50"
: establece el tamaño del widget en píxeles. En este caso, el ancho es 350 y la altura es 50.zPosition="3"
: establece la posición en la que se superpone este widget con otros en la pantalla. En este caso, se establece en 3.font="Regular; 17"
: establece la fuente y el tamaño del texto que se muestra en el widget. En este caso, la fuente es «Regular» y el tamaño es 17.transparent="1"
: establece si el widget es transparente o no. En este caso, se establece en 1, lo que indica que el widget es transparente.backgroundColor="yellow"
: establece el color de fondo del widget. En este caso, el color de fondo es amarillo.foregroundColor="#c4c4c4"
: establece el color del texto del widget. En este caso, el color del texto es gris claro.noWrap="1"
: establece si el texto en el widget se envuelve en varias líneas o no. En este caso, se establece en 1, lo que indica que el texto no se envuelve en varias líneas.
5. Funcion condicionales usando if para la ejecucion de un objeto:
def instalacion(self): if os.path.exists('/etc/enigma2/actualizacion'): os.remove("/etc/enigma2/actualizacion") if config.plugins.PluginBase4.picon.value == True: if os.path.exists('%s/actualizacion' % (config.plugins.PluginBase4.fpicon.value)): os.remove('%s/actualizacion' % (config.plugins.PluginBase4.fpicon.value)) if os.path.exists('/usr/bin/enigma2_pre_start.sh'): self.iConsole.ePopen("/usr/bin/enigma2_pre_start.sh &") if os.path.exists('/usr/bin/.enigma2_pre_start.sh'): self.iConsole.ePopen("/usr/bin/.enigma2_pre_start.sh &")
La primera comprobación verifica si el archivo /etc/enigma2/actualizacion
existe y, si es así, lo elimina mediante la función os.remove()
.
La segunda comprobación verifica si la opción config.plugins.PluginBase4.picon.value
está establecida en True
. Si es así, verifica si el archivo %s/actualizacion
existe en el directorio especificado por la opción config.plugins.PluginBase4.fpicon.value
y, si es así, lo elimina.
Las dos últimas comprobaciones verifican si los archivos /usr/bin/enigma2_pre_start.sh
y /usr/bin/.enigma2_pre_start.sh
existen, respectivamente. Si es así, la función llama al método ePopen()
del objeto iConsole
para ejecutar los archivos en segundo plano.
6. Funcion de inicio del plugin y descripcion
def main(session, **kwargs): session.open(PluginBase4) def Plugins(**kwargs): return [PluginDescriptor( name="Plugin Base 4", description="Menu Configuracion con funcion", icon="base4.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 PluginBase4.
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, ademas de condicionales de instalacion, y mostrar informacion en pantalla de un archivo, 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: