Plugin Entwicklung: Screens machen mich irre!

    • Plugin Entwicklung: Screens machen mich irre!

      Hi Leute, so langsam verliere ich etwas die Gedult. Ich versuch jetzt schon seit geraumer Zeit mein Plugin welches mit dem Autostart der Box aufgerufen wird mit einem Screen zu versehen.

      Das Ziel ist, dass das Plugin beim aufwecken aus dem Standby gestartet wird eine Überprüfung durchführt und wenn diese erfolgreich ist dann soll eine MessageBox aufgehen die den Benutzer fragt ob er Updaten möchte.

      Nur leider bekomm ich bei allen möglichen Versuchen die verschiedensten Fehlermeldungen.

      Die neuste ist:


      Traceback (most recent call last):
      File "/usr/lib/enigma2/python/mytest.py", line 594, in <module>
      runScreenTest()
      File "/usr/lib/enigma2/python/mytest.py", line 453, in runScreenTest
      session = Session(desktop = getDesktop(0), summary_desktop = getDesktop(1), navigation = nav)
      File "/usr/lib/enigma2/python/mytest.py", line 192, in __init__
      p(reason=0, session=self)
      File "/usr/lib/enigma2/python/Plugins/Extensions/UpdateChecker/plugin.py", line 123, in autostart
      global_session.open(UpdateCheckerScreen)
      File "/usr/lib/enigma2/python/mytest.py", line 319, in open
      dlg = self.current_dialog = self.instantiateDialog(screen, *arguments, **kwargs)
      File "/usr/lib/enigma2/python/mytest.py", line 254, in instantiateDialog
      return self.doInstantiateDialog(screen, arguments, kwargs, self.desktop)
      File "/usr/lib/enigma2/python/mytest.py", line 279, in doInstantiateDialog
      readSkin(dlg, None, dlg.skinName, desktop)
      AttributeError: 'UpdateCheckerScreen' object has no attribute 'skinName'




      Der Code dazu sieht wie folgt aus:

      Python-Quellcode

      1. class UpdateCheckerScreen(Screen):
      2. skin = """
      3. <screen name="BouquetUpdateChecker" position="130,150" size="460,400" title="BouquetUpdateChecker" >
      4. <widget name="myLabel" position="10,60" size="400,120" font="Regular;20"/>
      5. <widget name="myMenu" position="10,10" size="420,380" scrollbarMode="showOnDemand" />
      6. </screen>"""
      7. #Wird beim Start des Plugins aufgerufen
      8. def __init__(self, session, args = 0):
      9. self.session = session
      10. #startet UpdateChecker
      11. ok = CheckUpdates.checkIfUpdatesAvailable(self)
      12. if ok == 1:
      13. self["myLabel"] =Label(_("Es steht eine neue Senderliste zum Download bereit."))
      14. Screen.__init__(self, session)
      15. self["myMenu"] = MenuList(list)
      16. self["myActionMap"] = ActionMap(["SetupActions"],
      17. {
      18. "cancel": self.cancel, # add the RC Command "cancel" to close your Screen
      19. "ok": self.callMyMsgUpdate,
      20. }, -1)
      21. ###########################################################################
      22. def cancel(self):
      23. self.close(False, self.session)
      24. ########################################################
      25. def myMsgErrorCode(self, entry):
      26. self.session.open(MessageBox,_("Fehlercode: %s") % (entry), MessageBox.TYPE_ERROR)
      27. ######################################################
      28. def callMyMsgUpdate (self, result):
      29. print("cccccccccccccccccccccccccccccccccccccccccccccccccccccccc")
      30. if result:
      31. print("ddddddddddddddddddddddddddddddddddddddddddddddddddd")
      32. self.cancel() #erinnerung an lassen
      33. else:
      34. print("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee")
      35. self.myMsgReminderYN()
      36. ######################################################
      37. def callMyMsgUpdateReminder(self, result):
      38. print("ffffffffffffffffffffffffffffffffffffffffffffffffffff")
      39. if result:
      40. print("gggggggggggggggggggggggggggggggggggggggggggggggggggg")
      41. self.cancel() #erinnerung an lassen
      42. else:
      43. print("hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh")
      44. CheckUpdates.takeNewInfo()
      45. #######################################################
      46. def myMsgUpdateYN(self):
      47. print("uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu")
      48. self.session.openWithCallback(self.callMyMsgUpdate, MessageBox, _("Es steht eine neue Senderliste zum Download bereit.\nJetzt aktualisieren?"), MessageBox.TYPE_YESNO)
      49. #######################################################
      50. def myMsgReminderYN(self):
      51. self.session.openWithCallback(self.callMyMsgUpdateReminder, MessageBox, _("Spaeter noch einmal erinnern?"), MessageBox.TYPE_YESNO)
      52. ###########################################################################
      53. #reason == 1 : wenn das Plugin/E2 beendet wird, falls man noch was aufraeumen moechte
      54. #reason == 0 : das Plugin wird gestartet/initialisiert
      55. def autostart(reason, **kwargs):
      56. #print(kwargs.keys())
      57. session
      58. if (reason == 0) and (kwargs.has_key("session")):
      59. session = kwargs["session"]
      60. session.open(UpdateCheckerScreen)
      61. #CheckUpdates.checkIfUpdatesAvailable(self)
      62. ###########################################################################
      63. def main(session, **kwargs):
      64. print("Start Main")
      65. session.open(callMyMsgUpdate)
      66. ###########################################################################
      67. def Plugins(**kwargs):
      68. list = [
      69. PluginDescriptor(name="UpdateChecker",
      70. description="UpdateChecker",
      71. where = [PluginDescriptor.WHERE_SESSIONSTART,
      72. PluginDescriptor.WHERE_AUTOSTART],
      73. fnc = autostart)]
      74. list.append(PluginDescriptor(name="UpdateChecker",
      75. description="UpdateChecker",
      76. where = PluginDescriptor.WHERE_PLUGINMENU,
      77. icon = "plugin.png",
      78. fnc = main))
      79. return list
      Alles anzeigen



      So langsam weiß ich nicht weiter, kann mir evtl. jmd sagen wie das Ganze mit den Screens und der GUI funktioniert?

      Ist es irgendwie möglich die MSGBox zu erzeugen nach dem autostart?

      Was mach ich falsch?

      In einem anderen Plugin das man normal aus dem Pluginmenü startet funktioniert das mit der Gui bestens. Wieso hier nicht?!

      PLZ HELP! :)
    • Entferne doch hier mal folgendes:

      <screen name="BouquetUpdateChecker" position="130,150" size="460,400" title="BouquetUpdateChecker" >

      Denn mit class UpdateCheckerScreen(Screen): hast du ja bereits einen Namen für den Screen vergeben.
    • Ok also wenn ich die "ok" Abfrage rausnehme scheint es zu gehen.


      Python-Quellcode

      1. class UpdateCheckerScreen(Screen):
      2. skin = """
      3. <screen name="UpdateCheckerScreen" position="130,150" size="460,400" title="BouquetUpdateChecker" >
      4. <widget name="myLabel" position="10,60" size="400,120" font="Regular;20"/>
      5. <widget name="myMenu" position="10,10" size="420,380" scrollbarMode="showOnDemand" />
      6. </screen>"""
      7. #Wird beim Start des Plugins aufgerufen
      8. def __init__(self, session, args = 0):
      9. self.session = session
      10. #startet UpdateChecker
      11. CheckUpdates.checkIfUpdatesAvailable(self)
      12. #if ok == 1:
      13. self["myLabel"] =Label(_("Es steht eine neue Senderliste zum Download bereit."))
      14. Screen.__init__(self, session)
      15. self["myMenu"] = MenuList(list)
      16. self["myActionMap"] = ActionMap(["SetupActions"],
      17. {
      18. "cancel": self.cancel, # add the RC Command "cancel" to close your Screen
      19. "ok": self.callMyMsgUpdate,
      20. }, -1)
      Alles anzeigen



      Dann wird in der Fkt. CheckUpdates.checkIfUpdatesAvailable(self) folgendes aufgerufen: self.myMsgUpdateYN() .

      Somit startet zumindest die MSGBox. Jetzt hab ich wieder das Problem, wenn ich eine Taste auf der FB drücke dann bekomme ich folgenden Fehler:

      action -> DirectionActions down
      action -> DirectionActions downUp
      unknown action DirectionActions/downUp! typo in keymap?
      action -> DirectionActions up
      action -> DirectionActions upUp
      unknown action DirectionActions/upUp! typo in keymap?
      action -> MsgBoxActions ok
      Traceback (most recent call last):
      File "/usr/lib/enigma2/python/mytest.py", line 200, in processDelay
      self.current_dialog.doClose()
      File "/usr/lib/enigma2/python/Screens/Screen.py", line 128, in doClose
      val.destroy()
      File "/usr/lib/enigma2/python/Components/Sources/Boolean.py", line 43, in destroy
      if self.poll_timer:
      AttributeError: 'Boolean' object has no attribute 'poll_timer'
      (PyObject_CallObject(<bound method Session.processDelay of <__main__.Session instance at 0x17143a0>>,()) failed)
    • Die Klasse CheckUpdates finde ich in den Code Schnipsel nirgens, von daher schwierig zu sagen wo es nun hängt.

      Aber ein paar andere Dinge sind mir aufgefallen.
      Zeile 13: Da ist evtl der Screen noch gar nicht fertig, wenn du da weitere Screen Komponenten aufrufst oder eine MsgBox dann ist das zu früh. Da solltest du onLayoutFinsh nutzen.
      Zeile 15: Wenn du schon den Screen anfängst zu definieren solltest du das auch unabhängig von ok machen. Also zu Ende führen
      Zeile 18: list ist nicht definiert.
      Evtl. wäre hier eine einfache MessageBox aber schon ausreichend.So nach dem Motto, wenn neue Senderliste dann rufst du die MessageBox auf. Wenn der User dann "ja" startet das Update ansonsten nicht.
    • Hi, ja genau so soll es eigentlich funktionieren.

      Wenn checkIfUpdatesAvailable durchgelaufen ist und alle Bedingungen erfüllt sind, dann soll die MSG Box aufgerufen werden und fragen on geupdatet werden soll.
      Jetzt hab ich es soweit, dass die MSGBox aufgerufen wird, aber wenn ich eine Taste auf der FB drücke, dann schmiert das Programm ab.
      Dateien
      • plugin.rar

        (2,43 kB, 234 mal heruntergeladen, zuletzt: )