InfoBarGenerics.py

  • Arrrrgghhh, dieses Python macht mich wahnsinnig.
    Da bin ich von meinem geliebten C doch arg verwöhnt.


    Naja, wie dem ich auch sei - ich versuche mich trotzdem daran und scheitere meistens.


    Es geht um folgendes:


    Ich möchte gerne bei der Wiedergabe eines Videos eine Anzeige bekommen wenn ich die Skiptasten (3, 6, 9 bzw. 7, 4, 1) drücke. Es soll analog zum Spulen funktionieren, wo oben links die aktuelle Spulgeschwindigkeit angezeigt wird.


    Was ich schon rausgefunden habe ist, dass die Events der Tasten die "action" Methode in der InfoBarSeek Klasse aufrufen.
    Damit jetzt nicht jeder der mir ein paar Tips gegen möchte die Stelle aus dem Code suchen muss, poste ich hier mal den Originalcode:


    Code
    def action(self, contexts, action):
         if action[:5] == "seek:":
              time = int(action[5:])	
              self.screen.seekRelative(time * 90000)
              return 1
         else:
              return HelpableActionMap.action(self, contexts, action)


    Soweit kann ich auch noch folgen, außer, dass mir nicht klar ist, was die HelpableActionMap tut, aber für den Fall mit den Zifferntasten reicht ja der if Fall.


    Wie ich das jetzt weiter verstanden habe, ist die Klasse InfoBarPVRState für die Anzeige auf dem Bildschirm zuständig.


    Dort gibt es eine Art Callback der auf ein Ereignis reagiert (sorry wenn ich die falschen Begrifflichkeiten verwende) in diesem Fall "onPlayStateChanged".


    Dieser Event "onPlayStateChanged" wird in der Klasse InfoBarSeek in der Methode "setSeekState" ausgelöst und zwar so:


    Code
    for c in self.onPlayStateChanged:
         c(self.seekstate)


    Ich hoffe meine Gedanken sind bis hierhin richtig.


    Jetzt dachte ich mir, um einfach mal irgendetwas anzeigen zu lassen, wenn ich auf eine von den Skiptasten drücke, könnte ich einen der bereits vordefinieren Seekstates verwenden. Ich habe also die obige "action" Methode entsprechend geändert:


    Code
    def action(self, contexts, action):
         if action[:5] == "seek:":
              time = int(action[5:])
              for c in self.onPlayStateChanged:
                   c(SEEK_STATE_BACK_128X)
              self.screen.seekRelative(time * 90000)
              return 1
         else:
              return HelpableActionMap.action(self, contexts, action)


    Ich habe also die for-Schleife für den Event einfach in die Action Methode eingebaut - das Skript wird auch kompiliert - leider bekomme ich einen Bluescreen wenn ich auf einer der Skip-Tasten drücke.


    Vielleicht kann mir einer der Entwickler ein wenig unter die Arme greifen und mir vielleicht sagen, wo mein Fehler liegt. Mir ist auch noch nicht ganz klar, wieso die action Methode weiter eingerückt ist, als die anderen Methoden in der Klasse.


    Vielen Dank


    MacDisein

  • So, dann kann dieser Thread auch zum Monolog werden :winking_face:


    Inzwischen habe ich mir selber geholfen und einige Änderungen an obigem Skript vorgenommen.


    Vielleicht denken die Programmierer ja mal darüber nach diese Änderungen ins offizielle Image zu übernehmen:


    Durch diese Änderungen werden während der Video-Wiedergabe beim Drücken auf die Tasten (3, 6 und 9 bzw. 7, 4 und 1) die Zeiten eingeblendet wie weit vor- bzw. zurück gezappt wurde.


    Vielleicht ist meine Lösung nicht besonders schön, aber funktioniert.


    Hier das Diff gegenüber der aktuellen CVS Version:




    MacDisein

    • Offizieller Beitrag

    Hi!


    Hmm spontan hätte ich gesagt, das geht einfacher :winking_face:
    Vor allem wenn jetzt jemand die Sprungzeiten für sich ändert geht das nicht mehr :winking_face:


    Es ließe sich "einfacher" realisieren aber ich will dir jetzt nicht die Laune verderben schließlich scheint es deine erste Änderung an e2 gewesen zu sein und jeder fängt mal klein an :).

  • Ich würde gerne ein einfachere oder schönere Lösung sehen, nachdem ich E2 inzwischen wohl 20 mal neu gestartet habe bis es so lief wie es jetzt läuft - bin ich für jeden Vorschlag der mich weiterbildet dankbar.


    Wenn jemand die Sprungzeiten ändert dann funktioniert es tatsächlich nicht mehr - ich muss auch gestehen dass ich mit Python immer mehr auf Kriegsfuß stehe - ich blicke immer weniger durch, welche Klassen wo was vererben.


    Vielleicht baue ich das noch ein wenig um, dass es flexibler wird, eigentlich braucht man wohl nicht für jeden SEEK_STATE eine eigene Variable - aber ich weiß bis heute nicht was dieses Konstrukt mit den Klammern [ SEEK_STATE_SEEK_BACK_30 = (0, 0, 0, "- 0:30") ] zu bedeuten hat, ist das eine Array?


    Was mich auch noch an meiner Lösung stört, dass ich er den Infobalken anzeigt und nicht nur die Einblendung oben links in der Ecke - ich habe es zwar geschafft es auch ohne Infobalken hinzubekommen, aber leider habe ich es nicht geschafft einen eigenen Timer zu definieren der dann die onHide Methode in InfobarPVRState aufruft. Der Timer lief zwar und wurde aus meiner Sicht auch richtig gestoppt, allerdings kam es dann noch mehrmaligen Skippen zu Aussetzern in Bild und Ton, wahrscheinlich weil ständig irgendwelcher Timer Events ausgelöst wurden.



    btw. Kennt jemand eine gute Python Anleitung oder kann ein Python Buch empfehlen? Es sollte nicht gerade bei Adam und Eva anfangen, aber irgendwie unterscheidet sich Python doch recht stark von allen Programmiersprachen die ich in den letzten 15 Jahren gelernt habe.



    MacDisein

  • Zitat

    Original von MacDisein
    btw. Kennt jemand eine gute Python Anleitung oder kann ein Python Buch empfehlen? Es sollte nicht gerade bei Adam und Eva anfangen, aber irgendwie unterscheidet sich Python doch recht stark von allen Programmiersprachen die ich in den letzten 15 Jahren gelernt habe.


    Wenn Du ActivePython installierst, bekommst Du auch ein Tutorial in englisch.

    HeiRos