Zeilen in Widget Text durchlaufen

Fragen zu Tkinter.
Antworten
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

Hallo zusammen,
in einem Text-Widget befindet sich in jeder Zeile eine Dezimalzahl, welche ich in eine Liste einlesen möchte. Kann mir jemand sagen, wie der Code dafür aussehen kann? Wie kann ich die einzelnen Zeilen, deren Anzahl variabel sein kann, durchlaufen?

Vielen Dank.

snowflake
BlackJack

@snowflake: Ich würde mir den kompletten Inhalt vom `Text`-Widget geben lassen und den dann in Zeilen aufteilen. Zeichenketten haben da eine passende Methode für. Und über diese Liste mit den Zeileninhalten kann man dann ganz normal iterieren, zum Beispiel mit einer ``for``-Schleife.
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

Über die get-Methode kann ich mir den gesamten Text geben lassen. Wie kann ich dann auf jede einzelne Zeile zugreifen?

Vielen Dank.

snowflake
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@snowflake: Indem Du Dir anschaust, welche Methoden ein Stringobjekt anbietet.
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

Den Inhalt bekomme ich jetzt so: inhalt=ereignis.get("1.0", "end")
Welche Methode kann ich jetzt verwenden, um Zeile für Zeile in eine Liste zu schreiben?

Vielen Dank.

snowflake
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

Hallo zusammen,

die Methode habe ich jetzt gefunden:

Code: Alles auswählen

    
werteliste1=werte.get("1.0","end").split()
Jetzt habe ich ein anderes Problem. Ich möchte die als String vorhandenen Werte in der Liste in Zahlen umwandel, damit ich mit statistischen Funktionen (mean, stdev, usw.) mit der Liste rechnen kann.

Folgender Code funktioniert nicht:

Code: Alles auswählen

for i in range(0,len(werteliste1),1):
	werteliste.insert(0,float(werteliste1[i]))
Kann mir jemand sagen, was ich falsch mache?

Vielen Dank.
snowflake
BlackJack

@snowflake: `range()` und Indexzugriffe sind hier schon mal ”falsch”. Das macht man in Python nicht so weil man *direkt* über die Elemente von Seqzenzen, wie zum Beispiel Listen, iterieren kann, ohne den Umweg über einen Indexwert. Das ”echte” Problem mit dem Code ist das `werteliste` nicht definiert ist. Und falls Du das machst, dann existieren die Elemente denen Du etwas zuweisen willst nicht.

In Python erstellt man in solchen Fällen einfach eine neue Liste. Zum Beispiel mit der „list comprehension“-Syntax oder mittels `map()`:

Code: Alles auswählen

werte = [float(x) for x in werte_entry.get('1.0', tk.END).split()]
# oder
werte = list(map(float, werte_entry.get('1.0', tk.END).split()))
In Python 2 lässt man den `list()`-Aufruf weg weil `map()` dort schon eine Liste liefert.

Weder der konkrete Datentyp (`liste`) noch irgendwelche angehängten Nummern haben im Namen etwas zu suchen.

Edit: `insert()` braucht man nur ganz selten und wiederholtes Einfügen an der ersten Stelle sollte man sich komplett verkneifen. Das ist ineffizient. Da würde man eher alle Elemente anhängen und die Liste am Ende dann einmal umdrehen.
snowflake
User
Beiträge: 93
Registriert: Mittwoch 9. November 2016, 15:46

Guten Morgen BlackJack,

vielen Dank für die ausführliche Darstellung. Da kann ich sehr viel draus lernen.

Ich wünsche einen schönen Tag und nochmals vielen Dank.

snowflake
Antworten