Plugin wird geblockt. Line 29 Fehler

  • Hi,
    kenne mich mit Fehlerbehebung nicht wirklich aus.


    Wenn ich Mein Plugin öffnen will, kommt Fehlermeldung das Plugin geblockt ist/wird, weil im Plugin line 29 irgend was nicht stimmt (expected an indented (plugin.py, line 29))


    Hat einer ein Tip was ich machen kann?


    Hier die Fehlerquelle: (Anm.: 1: skin = """ ist die Zeile29 usw.

  • So kann dir niemand hier helfen!


    Für eine genaue Analyse ist der log beim enigma2 Start erforderlich.
    Um welches Plugin handelt es sich und welches Image wird verwendet?

  • Hi,
    stimmt es stimmt mit der Einrückung etwas nicht. Wichtig ist hier auch der Teil vor dem Fehler weil Python davon ausgeht das die Einrückung gleich sein muss wenn nicht sowas wie if davor steht.


    ciao

  • Hallo,
    habe mal vesucht es zu verrücken. Hat aber auch nicht geklappt.


    Hier mal alles und wenn ich noch wüsste wie man an die e2 Logs kommt, gebe ich auch die Infos. Und image ist openatv. Und es ist kein fertiges plugin. Habe aus zicht plugins und aus dem Internet alles selber zusammengesetzt.

  • da fehlt aber irgend was.... der skin-Part kommt doch gleich nach einer "class"
    die einzige class hat 2x __init__ und die Methode downloadDone hat keinen Code.

  • Hi, habe was ergänzt bei downloadDone. Aber immer noch gleiche fehler.



    EDIT:
    Der Code wie es jetzt ist. Wenn ich plugin Starte kommt Meldung:
    ´modul´ object has no attribute ´Plugins´


    Was kann ich jetzt noch machen!

  • main und plugins kommt ganz sicher auf die ganz linke Einrück-Position, so wie auch class
    und nach wie vor machen 2x __init__ überhaupt keinen Sinn. Da wird sicher eine andere Klasse fehlen, z.B. startscreen ist nicht definiert, wird aber im main gerufen. Zudem steht der "skin"-Part eigentlich gleich nach der "class" Definition.
    </screen>""" würde ich noch einen Tab weiter einrücken.
    Du solltest mal generell den Code überschauen, was eigentlich wann aufgerufen werden soll und ob das auch existiert.
    Für die ganzen Farbtasten-Actions gibt es überhaupt keine Methoden. Mir scheint das alles nicht Sinnvoll zusammen zu passen.... irgendwo rauskopiert ... o.ä.....

  • Habe mal einiges verändert. Jetzt startet das image nicht meh. Irgend ein Problem mit dem Mediaportal usw.
    Wenn ich mein Plugin wieder lösche, startet image ganz normal.


    Ich weis echt nicht weiter-


    Hier neuer Code

  • Der Einrückungsfehler war ursprünglichdie zweite skin-Definition, welche direkt nach eine Funktionsdefinition kam und dort wird halt eine Einrückung erwartet (das hast du ja mittlerweile mit dem print korrigiert). Dann hast du zwei __init__-Funktionen. Da geht nicht. Eine Class hat immer genau eine __init__. Wenn ich das anschaue: self.skin = LiveStreamingLinks.skin, dann fehlt dir class LiveStreamingLinks(Screen): oberhalb der zweiten skin-Definition.


    Also du hast hier wohl aus zwei class eine gemacht und das kann so nicht gehen.

  • nun wissen wir auch woher der Code ist :grinning_squinting_face:
    https://github.com/E2OpenPlugi…b/master/plugin/plugin.py
    Vergleiche noch mal und du wirst sehen, das eine weitere Klasse (class) fehlt.


    Und "irgendwelche Fehler" helfen hier überhaupt nicht. Wenn du diese Fehler nicht interpretieren kannst, dann bitte die KOMPLETTEN Fehlerausgaben zeigen, sonst ist das alles nur Raten.

  • deshalb wurde wohl auch zuerst nicht der komplette code gepostet

  • Ok, bin dabei alles zu verändern.
    Und ja. Habe zicht plugins verglichen und Codes kopiert.
    Also. Ich wollte den ganzen Code nicht einfügen, weil es für mich nach zu viel aussah und daher direkt auf die Fehlerquelle zeigen wollte..
    Als ein VIP es vorschlag habe ich es sofort ausgenutzt :) und den ganzen Code gepostet.
    Und ich will kein Plugin 100% nachkopieren und Name nur verändern.
    Bei den ganzen plugins die ich vergleiche, will ich verstehen, wie man class und keys richtig zuordent.


    Was ich heute, hier gelernt habe und auch anwenden werde ist:
    Ich dachte immer wenn man das Plugin öffnet, kommt ja eine Seite. Und will man auf die nächste Seite, braucht man ein neues "class" (für die Optik und benutzung).
    Ich kann es jetzt schwer beschreiben, wie meine neue Lösung aussieht. Ich mache mich jetzt dran und schauen wir mal ob ich wirklich was verstanden habe oder nicht. Und danach kann ich auch alles besser erklären. Momentan sind einfach mehrere Lösungen im Kopf :)


    joergm6:
    Yo das ist er :winking_face:
    Aber einer von vielen.
    Dieses Plugin hatte ich als letztes gefunden um zu vergleichen.


    Dre:
    Also mein Plugin und Code, der ist wirklich so kurz.
    Weil das ganze Boquet erstellen und so das interessiert mein Plugin nicht. Soll auch sowas kompliziertes nicht rein. Es ging mir nur immer um eine Schablone. Eine class Schablone für Cancel, Exit, Ok, KeyGreen usw.
    Daher auch dieser neur Code, was mit Cancel, Exit usw miteinander verknüpft seien sollen.


    Werde versuchen etwas logischeres zu kombinieren als die Codes die ich bis jetzt gepostes habe :kaffee:

  • ich denke, du solltest dich erstmal grundsätzlich mit einem HowTo beschäftigen. Irgendwas kopieren bringt nicht viel, wenn man nicht versteht, was das tut. Alles was du nicht benötigst sollte aus dem Code heraus, alle Methoden und auch alle ins Leere führende Farbtastendefinitionen. Und wenn erstmal ein Screen "aufgeht", dann erst weiter mit Funktionenalitäten erweitern.
    Lese einfach mal hier, du brauchst auch erstmal nur das PDF lesen, das erklärt das Grundsätzliche.... plugins/main/eine class für ein GUI-Fenster.
    [+all Plugins] Ihad enigma2 Plugin Tutorial

  • So,
    habe was fertig gestellt.
    Also es gibt kein supmenu im plugin. Alles passiert auf der ersten Seite. Es gibt keine zweite Seite.
    Habe versucht sovieles wie möglich, überflüssiges weg zu lassen.
    Ich denke ich konnte sehr sehr viele fehler beheben.
    Nun komme ich nicht mehr weiter.


    Hier der Log:


    Und hier der neue Code:


    Dre danke:
    Werde pdf anschauen.

  • es gibt keine Methode/Eigenschaft "list" in der Klasse also "self.list" . Somit ist
    self["list"] = self.list
    zuviel / fehlerhaft / falsch / was auch immer :)


    self.list muss vor der ersten Verwendung definiert werden, also eigentlich schon im __init__ und nicht erst in createTopMenu
    self.list= []

  • :hurra: :hurra: :hurra: :hurra:


    :kaffee: :einschenken: oder um diese Uhrzeit lieber nicht


    Soweit hat alles geklappt.


    Jetzt muss ich nur noch dafür sorgen, das die Keys richtig funktionieren.
    Wenn ich auf Plugin klicke, öffnet sich jetzt alles so, wie ich es wollte.
    Aber klick ich auf die rote Taste, sollte es zurück zur Menü. Macht es aber nicht.


    Es sagt mir - objekt has no attribite "level".


    Ich würde auch gerne für heute schluss machen.
    Kann mir jemand die Lösung geben?!
    Irgend was stimmt mit if self.level == self.LEVEL_FILES: nicht. Meine suche nach einer Lösung war erfolgslos.

    Code
    def keyCancel(self):
    		if self.level == self.LEVEL_FILES:
    			self.session.openWithCallback(self.cancelConfirm, MessageBox, _("Really close without saving settings?"))
    		else:
    			self.close()


    hier mal der Log:

    Code
    KEY: 398 RED
    action ->  SetupActions cancel
    Traceback (most recent call last):
      File "/usr/lib/enigma2/python/Components/ActionMap.py", line 48, in action
      File "/usr/lib/enigma2/python/Plugins/Extensions/JacupTestPlugin/plugin.py", line 76, in keyCancel
        if self.level == self.LEVEL_FILES:
    AttributeError: 'LiveStreamingLinks' object has no attribute 'level'
    (PyObject_CallObject(<bound method ActionMap.action of <Components.ActionMap.ActionMap instance at 0x7072efa8>>,('SetupActions', 'cancel')) failed)
    ]]>
  • Die Variable level ist nie deklariert und es wird auch nie ein Wert zugewiesen. Das muss ja crashen. Aber eigentlich das gleiche Problem wie oben. Du solltest dan Rat von weiter oben wirklich befolgen und dich mal mit den Grundlagen befassen.


    Und damit du nicht gleich den nächsten Crash rapportierst: toggleSelection gibt es auch nirgends.

  • Ja. Es ist nicht deklariert.


    Das Problem ist, ich weis nicht wie der Code lauten soll.
    Ich weis mittlerweile was wie wo gemeint ist, aber ich weis nicht wie der Code Name ist.
    Um auf anhieb das richtige zu finden, dafür brauche ich einfach mehr Erfahrung. Das kommt bestimmt mit der Zeit. Aber nicht die Tage.



    Beispiel: if self.level == self.LEVEL_FILES:
    Ich weis das es nicht dahin gehört. Weil, ich habe ja keine Files oder das Plugin automatisch Files erzeugt hat, wo es die Daten holen kann. Oder wie auch immer.
    Daher habe ich auch bewusst als Beispiel keyCancel genommen und nicht keyGo, keyOK.
    Hinter keyGO und keyOK müssen Prozesse dahinter stecken, die bis jetzt auch nicht definiert sind.
    Daher keyCancel. Es braucht kein Prozess nichts.
    Das Plugin lässt sich installieren und öffnen.
    Auf dem Bildschirm sehe ich dann die Überschrift Von hier aus gehts los. In der Mitte ist nichts. Ist ja logisch. Ist auch nichts deklariert. Später soll dort erscheinen "Hier klicken um Prozess zu starten". Das ist aber alles erst mal nicht wichtig.
    Und unten auf dem Bildschirm hat man die Wahl zwischen Rot (für Abbruch) und Grün (für Starten).
    So,
    da im Bildschirm in der Mitte nichts zum auswählen gibt, kann die Taste grün auch nichts in gang setzen. Außer das es ein Absturz gibt. Auch logisch.
    Die Gründe sind mir bekannt.
    Aber die Taste Rot. Dahinter muss ja nichts kompliziertes sein.
    Es muss doch ein Universal Code geben, wenn ich auf Rot (Abbruch) klicke, das es einfach das Plugin schließt und zurück zur Menü = Pluginübersicht, sich weiterleitet.
    Dann brauch ich auch nicht diesen ganzen misst hier (if self.level == self.LEVEL_FILES:

    Code
    [B]def keyCancel(self):[/B]
    		if self.level == self.LEVEL_FILES:
    			self.session.openWithCallback(self.cancelConfirm, MessageBox, _("Really close without saving settings?"))
    		else:
    			self.close()


    Ein einfaches Code was das Plugin schliesst und zurück zur Menü kehrt, z.B. zurück zur Menüseite. Wo man dann alle Plugins sehen kann und ein anderes eventuell öffnen will.
    Dafür muss es doch ein einfaches Universal Code geben!
    Sieht es vielleicht so aus?

    Code
    if self.session.openWithCallback(self.cancelConfirm, MessageBox,)
    		else:
    			self.close()
  • du hast auch immer noch nicht das PDF der Grundlagen gelesen, dann hättest du diese Fragen nicht.
    Und ja, der "ganze Mist" ist überflüssig, denn nur Code, den du wirklich möchtest und auch weist was er tut, gehört in dein Programm. Alles was du als self.blabla nicht definiert hast, gehört auch nicht hinein (das Meiste jedenfalls :) ).
    ... und ja, self.close() reicht für die "Rot-Action" aber das steht als Beispiel alles im PDF. :frowning_face: :face_with_rolling_eyes: