Seite 1 von 1

TKinter-Label als Prozess-Log; stackt immer

Verfasst: Freitag 8. Mai 2020, 07:49
von 3cosystem
Hallo Leute,

fuer mein Programm moechte ich ein "Prozess-Log" schreiben, wo ich einfach ueber mein Script hinweg
an wichtigen Stellen ein Text an ein Label sende, um zu sehn, dass er diese passiert hat.
Allerdings sollen manche Eintraege gestackt werden, andere sich selbst ueberschreiben.
Leider stackt er bei meiner Version einfach immer, auch wenn ich den Inhalt nicht zurueckgebe.
Hier der Code dazu, aber nur ein Ausschnitt, das Ganze ist in eine TKinter-Struktur gesetzt:

Code: Alles auswählen

class...
	def __init__
		self.var_label = tk.StringVar()
		self.info_label = tk.Label(self, textvariable=self.var_label, borderwidth=2, relief="groove", width=30, height=5, bg='#64ae25', anchor=N)


	def type(self, text, stack):
  	  self.label = text
  	  self.label_content.set(self.label)
 	  root.update()
	    if stack == 1: # Den Label-Inhalt zurueckgeben
	        print(self.label) # hier wird bei "nicht gestackt (0)", auch nicht gestackt, sondern nur im Label...
	        return self.label

self.type('Wichtig 1, gestackt.', 1)
self.type('Wichtig 2, gestackt.', 1)
self.type('Wichtig 3, gestackt.', 1)

while True: # Die wiederholte Ausfuehrung des Label-Inhalts soll nur aktualisiert werden, nicht aber gestackt
	x = 1
	self.type(str('x')+'x; Wichtig 4, nicht gestackt.' 0)
	x+=1
	if x > 10:
		break
		
>>> so soll's aussehen im Label
10x; Wichtig 4, nicht gestackt.
Wichtig 3, gestackt.
Wichtig 2, gestackt.
Wichtig 1, gestackt.

>>> und nicht so
...
3x; Wichtig 4, nicht gestackt.
2x; Wichtig 4, nicht gestackt.
1x; Wichtig 4, nicht gestackt.
Wichtig 3, gestackt.
Wichtig 2, gestackt.
Wichtig 1, gestackt.
Ich hoffe ihr koennt mir da helfen.
Vielleicht geht das mit dem Label nicht und man nimmt dafuer ein anderes TKinter-Objekt?
Wenn ich das printe, siehts im Uebrigen korrekt aus. Nur im Label nicht.

Vielen Dank im Voraus
Einen angenehmen Freitag

Liebe Grueße
3cosystem

Re: TKinter-Label als Prozess-Log; stackt immer

Verfasst: Freitag 8. Mai 2020, 08:40
von Sirius3
Python kennt Wahrheitswerte, da sollte man nicht 0 und 1 dafür nehmen.
Die Einrückungen sind so kaputt, da kann man kaum was am Code erkennen. Eingerückt wird immer mit 4 Leerzeichen pro Ebene, keine Tabs, und vor allem nicht mischen.
Warum bindest Du text ans self.label? Du willst doch den Inhalt von self.var_label aktualisieren.
Und dazu mußt Du bei gestackt einfach eine Zeile anfügen, bei nicht gestackt, die letzte Zeile löschen und die neue Anfügen.
Um es vereinfacht auszudrücken: bei nicht gestackt, letzte Zeile aus self.var_label löschen, und dann immer die neue Zeile anfügen.

`update` sollte man nicht benutzen, und `root` kommt in self.type aus dem nichts, das sollte nicht sein. Sollte eh nicht sein, dass da update aufgerufen wird.
Bei GUIs gilt für lang laufende Dinge, dass sie in einem separaten Thread gestartet werden müssen, die Kommunikation mit der GUI findet üblicherweise mit Hilfe einer Queue statt, wo die Aktualisierungen hineingelegt werden und in der GUI wird in regelmäßigen Abständen die Queue geprüft und entsprechend das Label aktualisiert.
Dafür gibt es hier im Forum schon Duzende Beispiele, wie man das richtig umsetzt. Einfach mal suchen.

Re: TKinter-Label als Prozess-Log; stackt immer

Verfasst: Sonntag 10. Mai 2020, 07:39
von 3cosystem
@Sirius3

Vielen Dank!
Habe 0/1 alle auf True/False geaendert. Jetzt ist das "If" auch schoener ohne ==.
Das mit dem Zeile loeschen funktioniert fast, weil die letzte Zeile (Wichtig 3, gestackt.), die eigentlich stehenbleiben soll, geloescht wird.
Lass ich aber, einfach weils jetzt funktioniert.

root.update kann ich gerade noch nicht entfernen, weil sich mein Label sonst nicht aktualisiert. Das liegt vermutlich, wie du schon gesagt hast,
an meiner schlechten gui-Struktur. Ich kann das Gui mit einem button und "root.destroy" auch nicht schließen, wenn das Skript laeuft. Das force ich dann
ueber windowns (Programm reagiert nicht).
Ich versuche das hier im Forum mal zu finden.

LG