mehrere Bilder mittels ePicLoad anzeigern

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • mehrere Bilder mittels ePicLoad anzeigern

      Hallo,
      Ich habe aus dem IHAD Tutorial mir das Pixmap Pluguin angesehen und getestet, das funktioniert.

      Hier der Code Ausschnitt mit einen eventuellen 2. Bild:


      Python-Quellcode

      1. def __init__(self, session, picPath = None):
      2. self.picPath1 = "/pfad/zum/pic1"
      3. self.picPath2 = "/pfad/zum/pic2"
      4. self.Scale = AVSwitch().getFramebufferScale()
      5. self.PicLoad = ePicLoad()
      6. self["myPic1"] = Pixmap()
      7. self["myPic2"] = Pixmap()
      8. self.PicLoad.PictureData.get().append(self.DecodePicture)
      9. self.onLayoutFinish.append(self.ShowPicture)
      10. def ShowPicture(self):
      11. if self.path is not None:
      12. self.PicLoad.setPara([self["myPic"].instance.size().width(),self["myPic"].instance.size().height(),self.Scale[0],self.Scale[1],0,1,"#002C2C39"])
      13. self.PicLoad.startDecode(self.picPath)
      14. def DecodePicture(self, PicInfo = ""):
      15. if self.path is not None:
      16. ptr = self.PicLoad.getData()
      17. self["myPic"].instance.setPixmap(ptr)
      Alles anzeigen
      Kann man ein 2. Bild parallel mit ePicLoad darstellen?
      Wenn ja wo muss ich den Hebel ansetzen?

      Was hat eigentlich 'ePicLoad' gegenüber 'pixmap' bzw 'ePixmap' für Vorteile/Vorzüge?
    • Sicher kannst du zwei Bilder darstellen.

      Du wirfst hier aber meine ich etwas durcheinander: Pixmap ist soviel ich weiß der Container, der das Bild darstellt, als Pixmap halt, Pixel für Pixel. ePicload ist die Klasse, die ein Bild in verschiedenen Formaten aus einer Quelle, z.B. Filesystem oder auch Netzwerk, laden und in eine Pixmap konvertieren kann.

      Und damit du nicht warten musst, wird das Bild - wie in einem Browser - asynchron geladen und dir mit dem Callback Bescheid gegeben, wenn es fertig geladen ist.
      Diskutiere nie mit einem Idioten. Er zieht dich auf sein Niveau runter und schlägt dich mit seiner Erfahrung.
    • Du musst eine dekodierte Pixmap in das Pixmap-Objekt deiner Wahl stecken: self["myPic1"].instance.setPixmap(ptrPixmap)

      Im tmdb-Plugin funktioniert das so - in mehr oder weniger einem Rutsch (Variablen-Namen angepasst):

      Python-Quellcode

      1. if fileExists( pathToPic ):
      2. self.picload = ePicLoad()
      3. self["myPic"].instance.setPixmap( gPixmapPtr() )
      4. scale = AVSwitch().getFramebufferScale()
      5. size = self["myPic"].instance.size()
      6. self.picload.setPara( ( size.width(), size.height(), scale[0], scale[1], False, 1, "" ) )
      7. if self.picload.startDecode( pathToPic, 0, 0, False ) == 0:
      8. ptr = self.picload.getData()
      9. if ptr != None:
      10. self["myPic"].instance.setPixmap(ptr)
      11. self["myPic"].show()
      12. del self.picload
      Alles anzeigen

      Also: Picloader anschmeissen, dekodierte Pixmap vom Pixloader abholen, Pixmap-Objekt im Screen damit füttern. So rum ist es vielleicht einfacher zu verstehen als mit deinen Callbacks und dem Durcheinander von Klassen- und Methodenvariablen.
      Diskutiere nie mit einem Idioten. Er zieht dich auf sein Niveau runter und schlägt dich mit seiner Erfahrung.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von rdamas ()

    • Mach aus dem Code oben (hab noch einen Fehler korrigiert, sorry) eine Funktion displayPic mit zwei Parametern: pathToPic und widgetName. Die rufst du dann mit z.B. displayPic("/pfad/zum/pic1", "myPic1") auf. Und das " myPic" in dem Code ersetzt du durch die Variable widgetName.

      Wenn es damit noch nicht klar ist, weiss ich auch nicht mehr. Ich könnte dir dann nur noch den Code aufschreiben, aber wo bleibt dann der Lerneffekt und das Erfolgserlebnis?

      Probier es einfach aus.
      Diskutiere nie mit einem Idioten. Er zieht dich auf sein Niveau runter und schlägt dich mit seiner Erfahrung.
    • Danke ich werde es mal testen.
      Ich meinte damit, dass ich mit den ganzen Funktionen nicht viel anfangen kann...

      Edit:

      Egal wie ich es mache, es kommt immer ein Fehler:

      Quellcode

      1. self[mypic].instance.setPixmap( gPixmapPtr() )
      2. 21:25:54.8317 { E } /usr/lib/python2.7/site-packages/twisted/python/util.py:815 untilConcludes 2020-04-30 21:25:54+0200 [-] AttributeError: 'NoneType' object has no attribute 'setPixmap'
      Habe das von oben übernommen.
    • Ja habe ich, hier ist meine code, inklusive __init__ Funktion.

      Python-Quellcode

      1. class BildScreen(Screen):
      2. if getDesktop(0).size().width() >= 1920:
      3. skin="""
      4. <screen name="BildScreen" flags="wfNoBorder" position="0,0" size="1920,1080" title="Picture Screen" backgroundColor="background">
      5. <widget name="label" position="450,150" size="1920,1080" font="Regular;80" foregroundColor="red" />
      6. <widget name="mypic" position="50,50" size="225,225" zPosition="1" alphatest="on" />
      7. </screen>"""
      8. def __init__(self, session):
      9. Screen.__init__(self, session)
      10. self.pic1 = "/usr/lib/enigma2/python/Plugins/Extensions/test/icons/mein1.jpeg"
      11. self["label"] = Label("bild")
      12. self["mypic"] = Pixmap()
      13. self["myActionMap"] = ActionMap(["SetupActions"],{"cancel": self.close, "ok":self.display(self.pic1, "mypic")}, -1)
      14. def display(self,bild, widgetname):
      15. if fileExists(bild):
      16. self.picload = ePicLoad()
      17. self[widgetname].instance.setPixmap( gPixmapPtr() )
      18. scale = AVSwitch().getFramebufferScale()
      19. size = self[widgetname].instance.size()
      20. self.picload.setPara( ( size.width(), size.height(), scale[0], scale[1], False, 1, "" ) )
      21. if self.picload.startDecode( bild, 0, 0, False ) == 0:
      22. ptr = self.picload.getData()
      23. if ptr != None:
      24. self[widgetname].instance.setPixmap(ptr)
      25. self[widgetname].show()
      26. del self.picload
      Alles anzeigen
    • Ich habe es gelöscht, trotzdem bleibt der Fehler erhalten

      Edit:
      So sieht jetzt mein Plugin aus:

      Python-Quellcode

      1. class BildScreen(Screen):
      2. if getDesktop(0).size().width() >= 1920:
      3. skin="""
      4. <screen name="BildScreen" flags="wfNoBorder" position="0,0" size="1920,1080" title="Picture Screen" backgroundColor="background">
      5. <widget name="label" position="450,150" size="1920,1080" font="Regular;80" foregroundColor="red" />
      6. <widget name="mypic" position="50,50" size="225,225" zPosition="1" alphatest="on" />
      7. </screen>"""
      8. def __init__(self, session):
      9. Screen.__init__(self, session)
      10. self.pic1 = "/usr/lib/enigma2/python/Plugins/Extensions/test/icons/mein1.jpeg"
      11. self["label"] = Label("bild")
      12. self["mypic"] = Pixmap()
      13. self["myActionMap"] = ActionMap(["SetupActions"],{"cancel": self.close}, -1)
      14. self.display(self.pic1, "mypic")
      15. def display(self,bild, widgetname):
      16. if fileExists(bild):
      17. self.picload = ePicLoad()
      18. self[widgetname].instance.setPixmap( gPixmapPtr() )
      19. scale = AVSwitch().getFramebufferScale()
      20. size = self[widgetname].instance.size()
      21. self.picload.setPara( ( size.width(), size.height(), scale[0], scale[1], False, 1, "" ) )
      22. if self.picload.startDecode( bild, 0, 0, False ) == 0:
      23. ptr = self.picload.getData()
      24. if ptr != None:
      25. self[widgetname].instance.setPixmap(ptr)
      26. self[widgetname].show()
      27. del self.picload
      Alles anzeigen


      Edit2:
      Da kommt die Fehlermeldung:

      Quellcode

      1. File "/usr/lib/enigma2/python/Plugins/Extensions/test/mein.py", line 35, in display
      2. 08:22:53.3301 { } /usr/lib/python2.7/site-packages/twisted/python/util.py:815 untilConcludes 2020-05-01 08:22:53+0200 [-] self[widgetname].instance.setPixmap( gPixmapPtr() )
      3. 08:22:53.3306 { E } /usr/lib/python2.7/site-packages/twisted/python/util.py:815 untilConcludes 2020-05-01 08:22:53+0200 [-] AttributeError: 'NoneType' object has no attribute 'setPixmap'

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von NaseDC ()

    • jetzt rufst du "display" gleich beim initialisieren auf. Auch das kann nicht funktionieren.

      Entweder machst du das über die ok-Taste

      Python-Quellcode

      1. def __init__(self, session):
      2. Screen.__init__(self, session)
      3. self.pic1 = "/usr/lib/enigma2/python/Plugins/Extensions/test/icons/mein1.jpeg"
      4. self["label"] = Label("bild")
      5. self["mypic"] = Pixmap()
      6. self["myActionMap"] = ActionMap(["SetupActions"],{"cancel": self.close, "ok":self.ok}, -1)
      7. def ok(self):
      8. self.display(self.pic1, "mypic")
      9. def display(self,bild, widgetname):
      10. .....
      Alles anzeigen

      oder nach Abschluss der Initialisierung

      Python-Quellcode

      1. def __init__(self, session):
      2. Screen.__init__(self, session)
      3. self.pic1 = "/usr/lib/enigma2/python/Plugins/Extensions/test/icons/mein1.jpeg"
      4. self["label"] = Label("bild")
      5. self["mypic"] = Pixmap()
      6. self["myActionMap"] = ActionMap(["SetupActions"],{"cancel": self.close}, -1)
      7. self.onLayoutFinish.append(self.onLayout)
      8. def onLayout(self):
      9. self.display(self.pic1, "mypic")
      10. def display(self,bild, widgetname):
      11. ....
      Alles anzeigen
      Rechtschreibfehler sind beabsichtigt, sie fördern ein genaueres Lesen
      Debug Log aktivieren Putty Telnet Screenshots erstellen
    • Ja, onLayoutFinish ist ein Event-Handler, der von Enigma2 aufgerufen wird, wenn der Screen-Aufbau fertig ist und die Widgets auf dem Screen angesprochen werden können.

      Dein Fehler war aber eigentlich, dass du in die ActionMap keine Methoden- oder Funktionsaufrufe packen darfst. In der ActionMap werden die Methoden zugewiesen, die bei dem entsprechenden Event aufgerufen werden sollen. Genauso im onLayoutFinish-Event-Handler.
      Diskutiere nie mit einem Idioten. Er zieht dich auf sein Niveau runter und schlägt dich mit seiner Erfahrung.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von rdamas ()

    • Ich habe jetzt mal vieles durchgespielt, das ganze funktioniert auch ohne "self["mypic"].show()"

      Was mir noch leicht unklar ist, was die Parameter in z.b." startDecode(bild, 0,0 False)" für einen sinn ergeben. genau so wie bei "setPara".



      Zwecks der ActionMap habe ich immer eine Funktion geschrieben, die etwas ausführen soll (z.b. neuen screen anzeigen), warum macht man das so nicht?
    • Weil's ein Event-Handler ist - der soll aufgerufen werden und muss deshalb eine Funktion sein und kein Funktionsaufruf. Das muss so.

      Wegen der Parameter: ich such mal, ob ich was finde:

      ePicLoad::startDecode(const char *file, int x, int y, bool async)
      file: File welches "dekodiert" werden soll (png, jpeg, bmp, gif)
      x, y: wie gross das Bild maximal werden soll
      async: ob gewartet werden oder per Callback benachrichtigt werden soll, wenn das Bild fertig dekodiert ist.

      ePicLoad::setPara(PyObject *val)
      val: Python-Tupel mit 7 Parametern:
      (max-x, max-y, aspect-ratio-x, aspect-ratio-y, use-cache, resize, background-color)
      Diskutiere nie mit einem Idioten. Er zieht dich auf sein Niveau runter und schlägt dich mit seiner Erfahrung.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von rdamas ()