Nachtrag:
Das Beispiel läuft wenn man es wie folgt anpasst:
PLEX_SPINNER_DIRECTORY = "/usr/share/enigma2/skin_default/spinner"
class MyInfoBarSpinner(Screen):
def __init__(self, session):
from enigma import getDesktop
DESKTOPSIZE = getDesktop(0).size()
if DESKTOPSIZE.width() > 1920:
self.skin = """<screen backgroundColor="#70000000" flags="wfNoBorder" name="MyInfoBarSpinner" position="center,center" size="2560,1440" title="PlexDream">
<widget name="BackgroundPlexSpinner" position="0,0" size="2560,1440" gradient="#20000000,#70000000,horizontal" zPosition="98" />
<widget name="PlexSpinner" position="1233,673" size="93,93" zPosition="99" />
</screen>"""
elif DESKTOPSIZE.width() == 1920:
self.skin = """<screen backgroundColor="#70000000" flags="wfNoBorder" name="MyInfoBarSpinner" position="center,center" size="1920,1080" title="PlexDream">
<widget name="BackgroundPlexSpinner" position="0,0" size="1920,1080" gradient="#20000000,#70000000,horizontal" zPosition="98" />
<widget name="PlexSpinner" position="925,505" size="70,70" zPosition="99" />
</screen>
"""
else:
self.skin = """<screen backgroundColor="#70000000" flags="wfNoBorder" name="MyInfoBarSpinner" position="center,center" size="1280,720" title="PlexDream">
<widget name="BackgroundPlexSpinner" position="0,0" size="1280,720" gradient="#20000000,#70000000,horizontal" zPosition="10" />
<widget name="PlexSpinner" position="616,336" size="46,46" zPosition="100" />
</screen>
"""
Screen.__init__(self, session)
# Spinner Timer
self['BackgroundPlexSpinner'] = Pixmap()
self['PlexSpinner'] = Pixmap()
self['BackgroundPlexSpinner'].hide()
self['PlexSpinner'].hide()
self.PlexSpinner = eTimer()
self.PlexSpinnerStatus = False
self.PlexSpinnerTimer = 1
self.PlexSpinner_conn = self.PlexSpinner.timeout.connect(self.loadPlexSpinner)
def stopPlexSpinner(self):
self.hide()
self.PlexSpinnerStatus = False
def startPlexSpinner(self):
self.show()
self.PlexSpinnerStatus = True
self.loadPlexSpinner()
def loadPlexSpinner(self):
if self.PlexSpinnerStatus:
png = "%s/wait%s.png" % (PLEX_SPINNER_DIRECTORY, str(self.PlexSpinnerTimer))
self.showPlexSpinner(png)
else:
self['PlexSpinner'].hide()
self['BackgroundPlexSpinner'].hide()
def showPlexSpinner(self, png):
self['BackgroundPlexSpinner'].show()
self['PlexSpinner'].instance.setPixmapFromFile(png)
self['PlexSpinner'].show()
if self.PlexSpinnerTimer is not 9:
self.PlexSpinnerTimer += 1
else:
self.PlexSpinnerTimer = 1
self.PlexSpinner.start(50, True)
Alles anzeigen
Allerdings zusammen mit der Aufgabenstellung nicht. Denn was ich nicht erwartet habe ist:
Führt man eine Callback Routine aus (z.B. per FB Kommando) die länger läuft, dann werden alle
weiteren Events geblockt. Dazu gehören Screenupdates, FB und Timer Events. Dies solange,
bis der länger laufende Programmteil beendet ist. Nach 4 Sekunden gibt Enigma2 im log aus:
main thread is non-idle! display spinner!
Heißt: Baut man den Aktivierungscode für den Spinner im Start der länger laufenden Sortierroutine
ein, so wird der Spinner erst angezeigt nachdem die Sortierroutine beendet ist. Dann wird er allerdings
nicht mehr benötigt.
Startet man den Spinner bereits vorher, stoppt die Drehung, solange die Sortieroutine läuft.
Leider ein unerwünschtes Ergebnis.
Hat jemand noch einen Tipp?
/Willi/