Fangen wir mal klein an:
Wie bekomme ich ein Script-Plugin zustande.
Es soll bei aufruf ohne weitere Abfrage ein Script/Befehl ausführen und die Ausgabe am Bildschirm ausgeben.
Fangen wir mal klein an:
Wie bekomme ich ein Script-Plugin zustande.
Es soll bei aufruf ohne weitere Abfrage ein Script/Befehl ausführen und die Ausgabe am Bildschirm ausgeben.
Hi!
Am besten du schaust dir mal das ipkg-plugin von TheDoc an.
Da wird nämlich auch einfach nur "ipkg update" und "ipkg upgrade" ausgeführt und die Konsolenausgaben werden sozusagen in das Fenster umgeleitet.
Ich hab mir da auch schon ein paar sachen rausgeholt aber es will noch nicht.
Aber kommt Zeit und ne lange Nacht dann wird es schon gehn. Binn jetzt erst mal auf einen Geburtstag eingeladen. Danach geht´s weiter.
Ich will das so haben das alle Scripts in einem Verzeichnis zur Auswahl angeboten werden.
Aber das kommt später.
Das Zauberwort heisst eAppContainer ... wie das mit der Rückgabe funktioniert, kannst du im ipkg Plugin sehen, wie Reichi schon geschrieben hat. Wie du das Verzeichnis einliest, kannst du dir aus dem tuxboxplugins Plugin klauen.
Hehe, klauen ist wohl richtig
So hab ich mir PHP beigebracht. Ist neben Basic (aus C64 Zeiten) und HTML die einzigste Programmiersprache die ich kann.
Mal sehen wie schnell und vor allem ob ich mit Python klar komme.
Ansonsten gebe ich ein für alle mal auf eine neue Programmiersprache zu lernen. Bei c++ habe ich kurz nach Hello World aufgegeben
Ich versteh den ganzen Scheiss mit den Klassen einfach nicht. Bei PHP hab ich hauptsächlich Funktionen und kann damit so ziemlich ales anstellen.
Irgendwann fällt da bei mir auch mal der Groschen (oder heute das 10cent Stück)
nen guten einstieg in python:
http://diveintopython.org/index.html
und dann später:
http://www.python.org
ist wirklich seeeehr einfach und cool!
gruss
vale
Python ist supereinfach. Es gibt glaub ich mindestens genausoviele Funktionen wie in PHP. Man muss sie nur finden.
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 endhalten:
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) ]
Alles anzeigen
Der Filemanager ruft dann, wenn man auf den Menüpunkt "File-Manager" im Plugin-Menü geht, die Funktion "main" auf. Die muss so aussehen:
Der session-Parameter enthält dann die Session, welche man z.B. zum Erstellen von Screen braucht.
Will man dann in <code> einen Screen aufrufen, macht man das so:
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)
Alles anzeigen
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.
Das nur als kurze Einführung. Wenn was nicht läuft, poste einfach mal die Sourcen und die Fehlermeldungen, dann kann ich sicher helfen.
Edit by tmbinc: ***-änderungen hinzugefügt
Coole Anleitung TheDoc, thx!
Kann es sein das ich enigma2 nach jeder Änderung neu starten muss damit die übernommen wird?
Ja
Es gibt jetzt mein shell Plugin für Dein Problem
PS: Habe den Kit jetzt aktualisiert, Version 3.0 hat eine Menge voreingestellte Komandos, eine Keymap verwaltrung und die Möglichkeit Usercommandos zu definieren.
Gruss
thowi