Darstellung von Listen

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

    • Darstellung von Listen

      Ich habe bezüglich eines screen eine Frage,
      Im MP Plugin ist z.b. bei mtv die Liste so angeordnet, dass es 2 Spalten sind und die fein säuberlich untereinander (siehe Bild) dargestellt sind.
      Das ganze ist auch als Liste gemacht.

      Wie kann man so etwas darstellen?
      Welche Methoden gibt es da?
      Habe mich schon in diversen Plugins umgeschaut aber nichts hilfreiches gefunden.

      Wenn man z.b. `Interpret: Titel` haben möchte und das als Liste, wie erreiche ich, dass es alles in einer "Tabelle" aufgelistet ist?
      Dateien
      • 1.jpg

        (211,09 kB, 47 mal heruntergeladen, zuletzt: )
    • Von Aufwand/Nutzen/Flexibilität her finde ich, dass das am einfachsten mit dem TemplatedMultiContent-Converter gemacht werden kann. Ich habe das Beispiel von gestern nur minimal aufgebohrt:


      Python-Quellcode

      1. # -*- coding: utf-8 -*-
      2. from Components.config import *
      3. from Components.ActionMap import ActionMap
      4. from Components.Label import Label
      5. from Components.Sources.List import List
      6. from Screens.Screen import Screen
      7. class Info(Screen):
      8. skin="""
      9. <screen name="Info" position="0,0" size="1920,1080" title="Test" flags="wfNoBorder">
      10. <widget render="Listbox" source="list_source" enableWrapAround="0"
      11. position="0,150" size="1800,800" transparent="1"
      12. font="Regular;25" zPosition="5" scrollbarMode="showOnDemand"
      13. scrollbarSliderBorderWidth="0" scrollbarWidth="5">
      14. <convert type="TemplatedMultiContent">{
      15. "template": [
      16. MultiContentEntryText(
      17. pos = (10, 10),
      18. size = (100, 50),
      19. font = 1,
      20. flags = RT_HALIGN_LEFT | RT_VALIGN_CENTER,
      21. text = 2),
      22. MultiContentEntryText(
      23. pos = (110, 10),
      24. size = (300, 50),
      25. font = 0,
      26. flags = RT_HALIGN_LEFT | RT_VALIGN_CENTER,
      27. text = 0),
      28. MultiContentEntryText(
      29. pos = (420, 10),
      30. size = (1000, 50),
      31. font = 1,
      32. flags = RT_HALIGN_LEFT | RT_VALIGN_CENTER,
      33. text = 5),
      34. ],
      35. "fonts": [gFont("Regular", 36), gFont("Regular", 30),],
      36. "itemHeight": 50 }
      37. </convert>
      38. </widget>
      39. <widget name="label" position="10,50" size="1800,50" font="Regular;36" />
      40. </screen>
      41. """
      42. def __init__(self, session):
      43. self.session = session
      44. Screen.__init__(self, session)
      45. self['actions'] = ActionMap(['WizardActions'], {
      46. 'back': self.close,
      47. }, -1)
      48. self['list_source'] = List()
      49. self['label'] = Label()
      50. self.onLayoutFinish.append(self.populate)
      51. def populate(self):
      52. f = open('/etc/passwd', 'r')
      53. mylist = []
      54. for line in f:
      55. if len(line):
      56. fields = line.split(':')
      57. mylist.append( tuple(fields) )
      58. self['list_source'].setList(mylist)
      59. self['list_source'].onSelectionChanged.append(self.selectionChanged)
      60. def selectionChanged(self):
      61. what = str(self['list_source'].getCurrent()[6])
      62. self['label'].setText(what)
      Alles anzeigen
      Hier wird der Inhalt der Datei /etc/passwd an den ":" gesplittet, die User-Id (3. Feld in der /etc/passwd) als erstes ausgegeben, danach der Username und dann das Home-Verzeichnis. Username hat einen anderen Font. Die Shell wird ausgegeben, wenn du dich in der Liste bewegst.

      Für jede Spalte musst du ein MultiContentEntryText-Element erzeugen; alternativ kannst du auch noch MultiContentEntryPixmap, MultiContentEntryPixmapAlphaTest, MultiContentEntryAlphaBlend und MultiContentEntryProgress benutzen.
      Diskutiere nie mit einem Idioten. Er zieht dich auf sein Niveau runter und schlägt dich mit seiner Erfahrung.
    • An den MultiContent habe ich auch schon gedacht und habe bei Github schon viel durchgewühlt.

      Es gibt noch das Modul MultiContent.py, dem kann man als Liste erweitern

      Python-Quellcode

      1. liste = []
      2. liste.append(MultiContentEntryText(pos=(0, 1), size=(32,
      3. 28), font=-1, flags=RT_HALIGN_LEFT, text=0))
      Oder ist das im Screen besser?
    • OK ich werde testen.
      Aber da ändert sich da bestimmt die Screen Einstellungen?

      Reicht dann, wenn ich die "liste" (wo ich per "MultiContentEntryText" zusammengestellt habe), dass in der "MenuList" wiedergeben oder muss die liste mit der ich ``liste.append(MultiContentEntryText(pos=....`` erstellt habe auch mit den converter anzeigen lassen?
    • Schau dir das in den Beispielen an. Da siehst du, dass du alles "zu Fuss" machen musst, was beim TemplatedMultiContent-Converter schon im Screen drin steckt.

      Wenn du TemplatedMultiContent benutzt, definierst du im Screen ein Widget mit source und dem Converter.

      Beim zu-Fuss-Vorgehen musst du im Screen lediglich ein Widget definieren. Dieses musst du dann in Python ausprogrammieren.
      Diskutiere nie mit einem Idioten. Er zieht dich auf sein Niveau runter und schlägt dich mit seiner Erfahrung.
    • Weiß jemand ein (kleineres) Plugin, wo das mit append(MultiContentEntryText(pos= inklusive screen gut erklärt ist?
      Leider finde ich nichts Zielführend.
      Wollte mir das ganze anhand von einen Beispiel anschauen.
      Mir reicht wirklich nur der Tipp zum Plugin.
    • Ich habe jetzt mal ein minimal code mit "MultiContentEntryText" erstellt, es funktioniert auch.

      Python-Quellcode

      1. from Screens.Screen import Screen
      2. from Components.ActionMap import ActionMap
      3. from Plugins.Plugin import PluginDescriptor
      4. from Components.MenuList import MenuList
      5. from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
      6. from enigma import eListboxPythonMultiContent, gFont
      7. class test(Screen):
      8. skin="""
      9. <screen name="test" position="0,0" size="1920,1080" backgroundColor="transparent" >
      10. <widget name="list" position="20,20" size="280,440" scrollbarMode="showOnDemand" itemHeight="110" transparent="0" zPosition="2" />
      11. </screen>"""
      12. def __init__(self, session):
      13. self.session = session
      14. Screen.__init__(self, session)
      15. self["list"] = MenuList([], True, eListboxPythonMultiContent)
      16. self["myActionMap"] = ActionMap(["SetupActions", "KeyboardInputActions",],{"cancel": self.close})
      17. self.multicontent()
      18. def multicontent(self):
      19. liste = ["1", "2", "3"]
      20. ausgabe = []
      21. self['list'].l.setItemHeight(110)
      22. self['list'].l.setFont(0, gFont('Regular', 25))
      23. for i in liste:
      24. present = []
      25. present.append(i)
      26. present.append(MultiContentEntryText(pos=(100, 30), size=(278, 90), font=0, text=str(i)))
      27. ausgabe.append(present)
      28. self['list'].l.setList(ausgabe)
      29. self['list'].show()
      Alles anzeigen
      Edit: Und so mit mehreren Strings in einer Zeile:


      Python-Quellcode

      1. from Screens.Screen import Screen
      2. from Components.ActionMap import ActionMap
      3. from Plugins.Plugin import PluginDescriptor
      4. from Components.MenuList import MenuList
      5. from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
      6. from enigma import eListboxPythonMultiContent, gFont,RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_HALIGN_CENTER, RT_VALIGN_CENTER, RT_WRAP
      7. class test(Screen):
      8. skin="""
      9. <screen name="test" position="0,0" size="1920,1080" backgroundColor="transparent" >
      10. <widget name="list" position="20,20" size="280,440" scrollbarMode="showOnDemand" itemHeight="110" transparent="0" zPosition="2" />
      11. </screen>"""
      12. def __init__(self, session):
      13. self.session = session
      14. Screen.__init__(self, session)
      15. self["list"] = MenuList([], True, eListboxPythonMultiContent)
      16. self["myActionMap"] = ActionMap(["SetupActions", "KeyboardInputActions",],{"cancel": self.close})
      17. self.multicontent()
      18. def multicontent(self):
      19. liste = [["1", "11"],["2", "22"], ["3", "33"]]
      20. ausgabe = []
      21. self['list'].l.setItemHeight(110)
      22. self['list'].l.setFont(0, gFont('Regular', 25))
      23. for i in liste:
      24. print(i)
      25. present = []
      26. present.append(i)
      27. present.append(MultiContentEntryText(pos=(0, 0), size=(278, 90), font=0, flags = RT_VALIGN_CENTER, text=str(i[0])))
      28. present.append(MultiContentEntryText(pos=(50, 0), size=(278, 90), font=0, flags = RT_VALIGN_CENTER, text=str(i[1])))
      29. ausgabe.append(present)
      30. self['list'].l.setList(ausgabe)
      31. self['list'].show()
      Alles anzeigen
      Und wenn ich es mit "List" mache, müsste ich einen converter.py in "/usr/lib/enigma2/python/Components/Converter/".
      Oder?

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Satfan444 ()