Bild.png anstatt des Textes anzeigen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Highlander062
User
Beiträge: 10
Registriert: Mittwoch 7. Juli 2021, 11:55

Hallo Python-Forum Team, erstmal ein gutes Neues Jahr allen Miteinander.

Bevor ich meine Frage stelle, also der Python-Quellcode (CountdownToAdvend.py) funktioniert als Converter und wird für eine VU+ Tv-Box benutzt.
Sollten doch noch irgendwelche Fragen auftauchen, bitte einfach fragen ich weis leider auch nicht alles.
Wie man so schön sagt es ist noch kein Meister vom Himmel gefallen!

Nun zu meiner Frage:
Ich würde gerne wissen ob es möglich ist anstatt des Textes z. B. (Heute ist der 1. Advent) ein Bild.png auf dem Skin anzuzeigen.
Das ganze natürlich am 1., 2., 3. und 4. Advent.

Ich hoffe das mir hier jemand weiterhelfen kann.
Schon jetzt vielen Dank, Highlander55



Code: Alles auswählen

Python-Quellcode: CountdownToAdvent.py
# -*- coding: utf-8 -*-
from Converter import Converter
from Components.Element import cached
from datetime import time, date, timedelta
class CountdownToAdvent(Converter, object):
	def __init__(self, type):
		Converter.__init__(self, type)
		self.heute = date.today()
		#self.heute = date(2021, 1, 1) # Datum verändern zum Testen
		self.aktJahr = self.heute.year
		self.Auswahl = type
	@cached
	def getText(self):
		time = self.source.time
		if time is None:
			return ""
		self.EreignisseFestlegen(self.heute)
		if len(self.EreignisseJahr) == 0:
			return "Ereignis " + self.Auswahl + " fehlt oder falsche Eingabe im Skin"
		else:
			return self.calculate()
	text = property(getText)
	def calculate(self):
		idx = 0
		Ereignisbeschreibung = self.aktEreignis[idx][7]
		jahr = self.aktEreignis[idx][0]
		monat = self.aktEreignis[idx][1]
		tag = self.aktEreignis[idx][2]
		dauer = self.aktEreignis[idx][4]
		if jahr > self.heute.year:
			textZusatz = " im nächsten Jahr"
		else:
			textZusatz = ""
		if dauer < 1:
			return "Ereignisbeschreibung " + self.Auswahl + " unvollständig"
		anz = len(Ereignisbeschreibung[0])
		E1 = Ereignisbeschreibung[0][0]
		if anz > 1:
			E2 = Ereignisbeschreibung[0][1]
		else:
			E2 = E1
		if anz > 2:
			E3 = Ereignisbeschreibung[0][2]
		else:
			E3 = E2
		Ereignis = date(jahr, monat, tag) 
		Tage_bis = (Ereignis - self.heute).days
		if Tage_bis > 1:
			return "Es sind noch " + str(Tage_bis) + " Tage bis " + E1 + textZusatz
		elif Tage_bis > 0:
			return "Es ist nur noch ein Tag bis " + E1 + textZusatz
		elif Tage_bis >= (-dauer + 1):
			return Ereignisbeschreibung[1 - Tage_bis]
		else:
			return "Fehler in der Ereignisdefinition"
	def EreignisseFestlegen(self, heute):
		self.EreignisseJahr = []
		while True:
			name = "Advent"
			use = False
			if name == self.Auswahl or (self.Auswahl == "Alle" and use == True):
				diffTage = 0
				text = "" # wenn difftage <> 0 text hier eingeben [["Ereignis"], "Heute ist ..."]
				show_future = False
				level = 3
				self.Ereignis_Advent(name, diffTage, show_future, level, text)
				if name == self.Auswahl:
					break
			name = "1Adventsonntag"
			use = True
			if name == self.Auswahl or (self.Auswahl == "Alle" and use == True):
				diffTage = 0
				text = [["zum 1. Adventsonntag"], "Advent, Advent, das erste Lichtlein brennt!"] # anstatt Text ein Bild.png anzeigen
				show_future = False
				level = 4
				self.Ereignis_Advent(name, diffTage, show_future, level, text)
				if name == self.Auswahl:
					break
			name = "2Adventsonntag"
			use = True
			if name == self.Auswahl or (self.Auswahl == "Alle" and use == True):
				diffTage = 7
				text = [["zum 2. Adventsonntag"], "Advent, Advent, das zweite Lichtlein brennt!"] # anstatt Text ein Bild.png anzeigen
				show_future = False
				level = 3
				self.Ereignis_Advent(name, diffTage, show_future, level, text)
				if name == self.Auswahl:
					break
			name = "3Adventsonntag"
			use = True
			if name == self.Auswahl or (self.Auswahl == "Alle" and use == True):
				diffTage = 14
				text = [["zum 3. Adventsonntag"], "Advent, Advent, das dritte Lichtlein brennt!"] # anstatt Text ein Bild.png anzeigen
				show_future = False
				level = 3
				self.Ereignis_Advent(name, diffTage, show_future, level, text)
				if name == self.Auswahl:
					break
			name = "4Adventsonntag"
			use = True
			if name == self.Auswahl or (self.Auswahl == "Alle" and use == True):
				diffTage = 21
				text = [["zum 4. Adventsonntag"], "Advent, Advent, das vierte Lichtlein brennt!"] # anstatt Text ein Bild.png anzeigen
				show_future = False
				level = 3
				self.Ereignis_Advent(name, diffTage, show_future, level, text)
				if name == self.Auswahl:
					break
			break
		self.EreignisseJahr.sort()
		self.aktEreignis = []
		cnt = len(self.EreignisseJahr)
		if cnt == 0:
			return
		prio = 999
		if self.Auswahl == "Alle":
			for idx in range(0, cnt):
				jahr  = self.EreignisseJahr[idx][0]
				monat = self.EreignisseJahr[idx][1]
				tag   = self.EreignisseJahr[idx][2]
				level = self.EreignisseJahr[idx][3]
				if date(jahr, monat, tag) <= self.heute:
					if level < prio:
						prio = level
						aktIdx = idx
				else:
					break
			if prio == 999:
				for idx in range(0, cnt):
					jahr2  = self.EreignisseJahr[idx][0]
					monat2 = self.EreignisseJahr[idx][1]
					tag2   = self.EreignisseJahr[idx][2]
					level = self.EreignisseJahr[idx][3]
					if date(jahr, monat, tag) == date(jahr2, monat2, tag2):
						if level < prio:
							prio = level
							aktIdx = idx
					else:
						break
		if prio == 999:
			aktIdx = 0
		self.aktEreignis.append(self.EreignisseJahr[aktIdx])
	def Ereignis_fest(self, name, mon, tag, show_future, level, text):
		dauer = len(text) - 1
		if dauer < 1:
			return
		jahr = self.aktJahr
		if self.heute > (date(jahr, mon, tag) + timedelta(dauer - 1)):
			jahr += 1
		if (self.Auswahl <> "Alle") or show_future or (self.heute >= date(jahr, mon, tag)) and (self.heute <= (date(jahr, mon, tag) + timedelta(dauer - 1))):
			self.EreignisseJahr.append([jahr, mon, tag, level, dauer, name, show_future, text])
	def Ereignis_Advent(self, name, diffTage, show_future, level, text):
		dauer = 0
		if len(text) > 1:
			dauer = len(text) - 1
		jahr, mon, tag, new_dauer, text2 = self.calcAdvent(self.aktJahr, diffTage, dauer)
		if self.heute > (date(jahr, mon, tag) + timedelta(new_dauer - 1)):
			jahr, mon, tag, new_dauer, text2 = self.calcAdvent(self.aktJahr + 1, diffTage, dauer)
		dauer = new_dauer
		if dauer < 1:
			return
		if len(text2) > 1:
			text = text2
		del text2
		if (self.Auswahl <> "Alle") or show_future or (self.heute >= date(jahr, mon, tag)) and (self.heute <= (date(jahr, mon, tag) + timedelta(dauer - 1))):
			self.EreignisseJahr.append([jahr, mon, tag, level, dauer, name, show_future, text])
	def calcAdvent(self, jahr, diffTage = 0, dauer_in = 0):
		monat = 12
		tag = 24
		vday = date(jahr, monat, tag).isoweekday() # monday = 1
		dauer_adv = 21 + vday % 7 + (vday == 7)
		anfang = date(jahr, monat, tag) - timedelta(dauer_adv - (vday == 7))
		if diffTage == 0 and dauer_in == 0:
			Ereignisbeschreibung = [["zum 1. Adventsonntag"]]
			dauer = dauer_adv
			for x in range(1, dauer_adv + 1):
				if (x % 7) == 1:
					Ereignisbeschreibung.append("Heute ist der " + str(int(x / 7) + 1) + ". Adventsonntag")
				else:
					Ereignisbeschreibung.append("Wir befinden uns nun in der " + str(int((x - 1) / 7) + 1) +". Adventswoche")
		else:
			Ereignisbeschreibung = ""
			dauer = dauer_in
		temp = anfang + timedelta(diffTage)
		return temp.year, temp.month, temp.day, dauer, Ereignisbeschreibung
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich weiß, diese UV-TV-Box scheint was ganz spezielles zu sein, aber auch dort wird es möglich sein, die Lesbarkeit durch ein paar Leerzeichen zu erhöhen.
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, keine Tabs.
Attribute werden wie Variablennamen komplett klein geschrieben. Und alle Attribute werden in __init__ angelegt. Später kommen keine neuen hinzu (aktEreignis, EreignisseJahr, etc).

aktEreignis wäre besser ein Rückgabewert von `EreignisseFestlegen` und ein Parameter für `calculate`.
So wie es aussieht, enthält aktEreignis auch immer maximal einen Einträg, wäre also gar keine Liste, sondern entweder None, oder Wert.
Statt erst eine Variable mit einem literalen Wert zu belegen und dann diese zu benutzen, kann man auch gleich der literalen Wert benutzen.

Eine while-Schleife, die immer sofort per break verlassen wird, ist keine while-Schleife. Das sollte kein Ersatz für goto sein!

Die vielen magischen Indizes solltest Du durch eine passende Klasse ersetzen, bzw. das Datum als date-Objekt belassen.
`del` braucht man sehr selten bis nie. Bei Dir macht das definitiv keinen Sinn.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Gibt es zu der Box bzw Software keine eigene Community, wo du das erfragen kannst? Es geht mir nicht darum, dich loszuwerden. Nur hier kennt sich keiner aus mit diesem Ding. Die Fragen vorher nach Zeit-Arithmetik waren ja allgemeiner Natur, aber was jetzt hier genau an Moeglichkeiten besteht, weiss eben keiner.
Antworten