mehrere Bilder mittels ePicLoad anzeigern

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • 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 Source Code

      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)
      Display All
      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.
    • 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 Source Code

      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
      Display All

      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.

      The post was edited 1 time, last by 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.
    • 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:

      Source Code

      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 Source Code

      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
      Display All
    • Ich habe es gelöscht, trotzdem bleibt der Fehler erhalten

      Edit:
      So sieht jetzt mein Plugin aus:

      Python Source Code

      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
      Display All


      Edit2:
      Da kommt die Fehlermeldung:

      Source Code

      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'

      The post was edited 1 time, last by NaseDC ().

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

      Entweder machst du das über die ok-Taste

      Python Source Code

      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. .....
      Display All

      oder nach Abschluss der Initialisierung

      Python Source Code

      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. ....
      Display All
      Rechtschreibfehler sind beabsichtigt, sie fördern ein genaueres Lesen
      Debug Log aktivieren Putty Telnet Screenshots erstellen
    • Super :thumbsup: :thumbsup: :thumbsup:
      Das funktioniert.

      Das man das nicht gleich bei der Initialisierung aufrufen kann wusste ich nicht.

      Das 'onLayoutFinish' stellt dann die Funktion dar nach der Initialisierung?
    • 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.

      The post was edited 1 time, last by 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)

      The post was edited 1 time, last by rdamas ().