Enigma2:Plugin-Erstellung: Unterschied zwischen den Versionen

Aus DreamboxWIKI
Wechseln zu: Navigation, Suche
(kein Unterschied)

Version vom 14. Juli 2006, 22:28 Uhr


Inhaltsverzeichnis

Allgemeines

Zu den Plugins: Grundsätzlich liegen die Plugins in /usr/lib/enigma2/python/Plugins. Dort dann halt entsprechend den vorhandenen Unterverzeichnissen ein Verzeichnis für das neue Plugin anlegen. In dem Verzeichnisse müssen sein: __init__.py (kann leer sein. wird aber benötigt, da Python das Verzeichnis sonst nicht als Modul erkennt) plugin.py (das Hauptskript für jedes Plugin)

plugin.py muss enthalten

from Plugins.Plugin import PluginDescriptor # importiert den PluginDescriptor (s.u.)
# diese Funktion wird aufgerufen und gibt einen einzelnen PluginDescriptor oder eine Liste von PluginDescriptoren zurück # das **kwargs einfach ignorieren! (näheres dazu in docs/PLUGINS im enigma-baum) *** def Plugins(**kwargs):
# Beispiel für ein einzelnes Plugin, welches im Plugin-Menü erscheint return PluginDescriptor(name="File-Manager", description="Let's you view/edit files in your Dreambox", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main)
# Beispiel für eine Liste von Plugins, das erste erscheint im Plugin-Menü, das zweite wird beim E2-Start aufgerufen (Autostart) return [PluginDescriptor(name="Plugin1", description="Example Plugin", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main), PluginDescriptor(where = PluginDescriptor.WHERE_AUTOSTART, fnc = autostart) ]


Der Filemanager ruft dann, wenn man auf den Menüpunkt "File-Manager" im Plugin-Menü geht, die Funktion "main" auf. Die muss so aussehen:

def main(session, **kwargs): # **kwargs einfach ignorieren, s.o. *** 


Der session-Parameter enthält dann die Session, welche man z.B. zum Erstellen von Screen braucht.

Will man dann in einen Screen aufrufen, macht man das so:

session.open(<screen>)

So ein Screen ist eigentlich immer recht einheitlich aufgebaut, Beispiel Filemanager:

class FileManager(Screen):
	skin = """
		<screen position="100,100" size="550,400" title="Test" >
			<widget name="list" position="10,0" size="190,250" scrollbarMode="showOnDemand" />
			<widget name="pixmap" position="200,0" size="190,250" alphatest="on" />
		</screen>"""
	def __init__(self, session, args = None):
		Screen.__init__(self, session)
self["list"] = FileList("/", matchingPattern = "^.*\.(png|avi|mp3|mpeg|ts)") self["pixmap"] = Pixmap()
self["actions"] = NumberActionMap(["WizardActions", "InputActions"], { "ok": self.ok, "back": self.close, # "left": self.keyLeft, # "right": self.keyRight, "1": self.keyNumberGlobal, "2": self.keyNumberGlobal, "3": self.keyNumberGlobal, "4": self.keyNumberGlobal, "5": self.keyNumberGlobal, "6": self.keyNumberGlobal, "7": self.keyNumberGlobal, "8": self.keyNumberGlobal, "9": self.keyNumberGlobal, "0": self.keyNumberGlobal }, -1)

skin = ... definiert einen lokalen Skin in diesem Plugin. Die Syntax entspricht der in skin.xml, bis auf den Screen-Namen, der wird hier nicht benötigt. Dann haben wir die Konstruktor-Methode __init__, welche dann den Screen-Konstruktor mit gleichen Parametern aufruft, da FileManager von Skin abgeleitet ist. Die Widgets, die wir im Skin definiert haben, sind noch leer. Diese werden dann in den nächsten Zeilen mit Funktion gefüllt:

self["pixmap"] = Pixmap() <-- das erstellt zum Beispiel ein Bild
self["list"] = FileList("/", matchingPattern = "^.*\.(png|avi|mp3|mpeg|ts)") <-- das eine in der gleichen Datei definierte
FileListe.

Als nächstes wird noch angegeben, was bei Tastendrücken passieren soll. Dafür sind die Actionmaps da.

self["actions"] = NumberActionMap(["WizardActions", "InputActions"] <-- wir benutzen aus der keymap.xml-Datei die Abschnitte
"WizardActions" und "InputAction"

Für die in der keymap.xml definierten Tastendrücke wird dann im folgenden angegeben, welche Methode der Klasse bei welchem Tastendruck aufgerufen werden soll. Also z.B. "ok": self.ok ruft die Methode 'ok' auf, wenn man auf die Taste, die in der Keymap.xml als Action "ok" hat, gedrückt wird.