widget source="session.CurrentService" per Code aus- und einblenden ???

  • Hi zusammen,

    ich brauch eure Hilfe - steh komplett auf dem Schlauch. Alles Lesen und Ausprobieren hat mich bis jetzt nicht weitergebracht... :fearful_face::fearful_face:

    Ich möchte ein widget wie oben bei Bedarf per Code ausblenden. Da das widget keinen Namen hat, kann ich sowas wie ".hide()" und ".show()" (was bei anderen widgets ja geht) nicht anwenden. Dasselbe gilt für <convert type="ConditionalShowHide" />

    Oder blick ichs mal wieder nur nicht?

    Danke und Grüsse, und bleibt gesund!

    Alfred

    PS: OE 2.0, falls das eine Rolle spielt

  • Not sure what you are trying but this example shows how to use ConditionalShowHide to switch between an icon on or off

    You can do this with labels also


    <widget pixmap = "Q-FHD / icons / ico_dolby_on.png" position = "740,983" size = "45,30" render = "Pixmap" source = "session.CurrentService" zPosition = "4">

    <convert type = "ServiceInfo"> IsMultichannel </convert>

    <convert type = "ConditionalShowHide" />

    </widget>

    <widget pixmap = "Q-FHD / icons / ico_dolby_off.png" position = "740,983" size = "45,30" render = "Pixmap" source = "session.CurrentService" zPosition = "3">

    <convert type = "ServiceInfo"> IsMultichannel </convert>

    <convert type = "ConditionalShowHide"> Invert </convert>

    </widget>

    Everything in life that's any fun is either immoral, illegal or fattening

  • Then you have to explain a bit more what you are trying to do.

    Because the tilte is a bit confusing.


    Maybe you can describe a bit more what you are trying to do since a widget needs to have it's own python code

    Either a built in function or your custom made one.


    I think that zombi is the guy to help out here

    Everything in life that's any fun is either immoral, illegal or fattening

  • Ein widget muss immer innerhalb eines Screens sein. Die erste Frage ist also: wo genau willst du das widget anzeigen?

    Gruss
    Dre


    Boxen (im Einsatz): DM920, DM900, DMOne
    Developer Project Merlin - we are OpenSource

  • Das widget ist innerhalb eines Screens und soll eben (versuchsweise mal nur per Drücken einer Farbtaste) ausgeblendet und auch wieder eingeblendet werden. Wie schon gesagt, mit allen anderen widgets (Label usw.) geht das problemlos über .show() und .hide(), aber beim source="session.CurrentService" scheitert das ja schon daran, dass das Ding keinen Namen hat (wenn ich name= "myname" hinzufüge, geht gar nichts mehr, bzw. dann muss ich es ja im Code definieren und ich weiss dann nicht, wie ich das widget im Code definieren soll. Mit self["myname"] =Label gehts auf jeden Fall nicht.... :frowning_face:

    Mir ist schon klar, dass das menschliches Versagen ist, aber genau deswegen bitte ich ja um Tips...

  • You just answer your own question :winking_face:


    You are trying to show and hide the source and that's not a widget like (label, pixmap, etc)


    So until you really describe what you are trying to achieve with this example like i did in my

    It's very hard to understand what you are doing


    What screen are you working on?? is the Infobars??

    Everything in life that's any fun is either immoral, illegal or fattening

  • Also ich hätte gesagt, dass du .show()/.hide() auf der instance machen musst.


    Ich kanns grad nicht selber testen, da ich unterwegs bin, aber ich hätte einfach mal dem widget das name Attribut gesetzt und dann self["bla"].instance.hide().


    Aber eben: keine Garantie

    Gruss
    Dre


    Boxen (im Einsatz): DM920, DM900, DMOne
    Developer Project Merlin - we are OpenSource

  • Danke dir nochmal, war aber leider (noch) nichts, aber immerhin mal ein Ansatz, mit dem ich nochmal testen konnte. :thumbs_up::smiling_face_with_halo:

    Wenn ich den Namen vergebe, muss ich ja das widget auch im Init-Teil des Screens definieren. Wenn ichs als Label definiere, nämlich so, gibts einen Absturz "unsupportet attribute"

    Wenn ich stattdessen mit self["bla"] = Source() als Definition versuche, gibts den Absturz in dem Moment, wo ich .show() aufrufe:

    Der Vollständigkeit halber (falls du überhaupt noch Lust hast) nochmal die komplette Definition des widget im Screen:

    Und nochmal zur Klarstellung: Wenn ich name="bla" und dann natürlich auch die Definition im Code weglasse, funzt das widget problemlos, aber ich kann es halt nicht aus- und einblenden.

  • vielleicht mal mit zPosition probieren

    z_position=7


    skin = """

    <screen ........................>

    <widget.....zPosition="%d"

    </widget>

    </screen>""" % z_position


    dann mit z_position=0 oder irgendeine minus Zahl probieren, halt verdecken, zPosition auch im screen probieren wenn es nicht im widget klappt, alles nicht getestet, alles aus dem Kopf

  • Bei widgets geht nur "name" oder "source" (beides gleichzeitig geht nicht).

    Die GUI-Widgets der SessionGlobals (wie CurrentService, CurrentTime ...) kann man glaub ich (wie andere Sources auch) nicht direkt über den Screen-Code ansteuern, da man ja nicht weiß, wie sie im Skin dann umgesetzt werden (Renderer+Converter).


    An das SessionGlobal von CurrentService kommst du im Screen-Code mit dieser Zeile:

    self.session.screen["CurrentService"]


    Da ist es dann aber schwierig, das passendene GUI-Element zu finden, weil man ja nicht wissen kann, wie es der Skinner eingebunden hat.

    Wenn man es dann gefunden hat, könnte man es mit .hide()/.show() eben aus-/einblenden.

    Man müsste dazu alle downstream_elements von self.session.screen["CurrentService"] durchgehen und das betreffende GUI-Element dann ansprechen.

    Da man ja aber nicht weiß, wie der Skinner die source einbettet, gäbe es da wohl keinen pauschalen Code.


    Keine Ahnung, ob es dafür evtl. ne einfache Lösung gibt. :thinking_face:

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • So if i get you correct you want to hide the label in the movieplayer infobar controlled by this widget ??


    If so then in skin.xml you can hash out the code with <! -- before and after -->


    <! -- <widget source = "session.CurrentService" render = "Label" position = "935,432" zPosition = "7" size = "120,40" backgroundColor = "# 00101214" foregroundColor = "# 00e5b243" font = " Regular; 26 "valign =" center "halign =" right "transparent =" 1 ">

    <convert type = "ServicePosition"> Length </convert>

    </widget> -->

    Everything in life that's any fun is either immoral, illegal or fattening

  • Also an einfachsten ist, wenn du dein widget in einen eigenen Screen packst. Diesen instantiatest du und danach kannst du den gesamten Screen ein- und ausblenden. So mach ich das auch mit meinen Zusatzwidgets. Dann musst du nur noch sicherstellen, dass dein Screen mit dem anderen Screen angezeigt wird.

    Gruss
    Dre


    Boxen (im Einsatz): DM920, DM900, DMOne
    Developer Project Merlin - we are OpenSource

  • dre : auch dir danke! Fast so mach ich das im Moment. Hatte lediglich gehofft, dass es einen einfacheren (direkten) Weg gibt, für den ich nur zu blöd bin. Aber wenn auch ihr Spezialisten sagt, das ist der einfachste Weg, bleib ich halt dabei.


    Fast so heisst, Ich öffne und schliesse den Screen mit dem Zusatzwidget bei Bedarf. Kannst du mir noch einen Tip geben, was du mit "diesen instantiierst du nd danach kannst du den gesamten Screen ein- und ausblenden" meinst? Ein- und Ausblenden wär natürlich schöner als Öffnen und Schliessen.

    Grüsse

    Alfred

  • dre meint bestimmt das hier:

    self.myWidgetScreen = self.session.instantiateDialog(myWidgetScreen)


    Dann musst du nur noch einen leeren Screen anlegen (class myWidgetScreen(Screen): ...), der im Skin eben nur dieses besagte Widget enthält.


    Dann kannst du diesen WidgetScreen mit self.myWidgetScreen.hide() ausblenden und mit self.myWidgetScreen.show() wieder einblenden.

    Da hat man dann sozusagen einen Container (Screen) für das widget geschaffen, den man ein-/ausblenden kann, was eben mit sources nicht geht.


    Löschen kannst du den Dialog dann mit:

    self.session.deleteDialog(self.myWidgetScreen)

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

    Einmal editiert, zuletzt von Sven H ()

  • Falles die Lösung jemand konkret interessiert, hab ich mal wieder ein Test-Plugin zur Veranschaulichung gemacht :winking_face:


    Da habe ich 3 verschiedene Source-Widgets im Skin, welche man mit den Tasten grün, gelb und blau jeweils ein-/ausblenden kann.

    Zum Test habe ich nur Event_Now anstelle von CurrentPosition genommen, damit man da keinen Film laufen haben muss.

    Durch den Code sieht man nun im Detail, wie man nach einem GUI-Element eines Source-Widgets suchen kann.

    Möglicherweise gibt es da noch bessere Varianten, die mir da nicht eingefallen sind :winking_face:


    Bei grün ist ein eigenes Source-Widget im Screen, wo die Suche nach dem GUI-Element etwas einfacher ist.

    Bei gelb ist die Variante mit dem myWidgeScreen (instantiateDialog).

    bei blau ist das normale Source-Widget aus den SessionGlobals, was ich im Skin mit text="myWidget" markiert habe, um es später einfacher zu finden


    Hinweis zur Zip:

    Den Ordner "TestPluginWidgetOnOff" aus der Zip mit Inhalt auf die Box kopieren in folgenden Ordner:

    /usr/lib/enigma2/python/Plugins/Extensions/


    Nach einem GUI-Neustart sollte das Plugin dann im PluginBrowser zu finden zu sein.


    Info zum Plugin:

    Das Test-Plugin ist so erstellt (mittels reload), dass es sich nach einem erneuten Öffnen selbst aktualisiert, so dass man zum Testen von Änderungen am Code in der TestPlugin.py (auch beim Skin im Code) nicht jedes mal einen GUI-Neustart machen muss.

    (nur Plugin schließen und neu Öffnen und die Änderung ist sofort wirksam und sichtbar)

  • Super, und nochmal danke. Nur schade, dass ich nicht vorher nochmal hier nachgeschaut habe - nach 2 Stunden rumprobieren hab ichs tatsächlich geschaft. Diese 2 Stunden hätte ich mit deinem Beispiel wahrscheinlich erheblich verkürzen können. Trotzdem super und prima und entschieden eleganter, als meine bisherige "Lösung" mit dem Öffnen und Schliessen des Zusatzscreens.

    Wieder einmal bestätigt sich die alte Weisheit: Wissen ist eines der wenigen Güter, das sich beim Teilen vermehrt! :thumbs_up::thumbs_up::thumbs_up: