Mehrere Variablen in Textfeld ausgeben

Fragen zu Tkinter.
Antworten
anonym29

Hallo,

ich habe das Problem das ich 4 Variablen in einem Textfeld ausgeben möchte. Jeweils nur eine Variable pro Zeile und noch zusätzlich eine Zeile zwischen zwei Variablen. Mein Testcode steht unten. Vielen Dank im Voraus.

Code: Alles auswählen

from tkinter import *

gui=Tk()
gui.geometry("800x800")

a = 1
b = 2
c = 3
d = 4

T = Text(gui, height=12, width=23)
T.place(x=20, y=20)
T.insert(END, a,"\n\n", b, ,"\n\n", c, ,"\n\n", d)

gui.mainloop()
BlackJack

@RaspiFabi: Das ist ja nicht einmal syntaktisch korrektes Python. Programmieren funktioniert nicht durch raten und anderen Code hinzuwerfen von dem man denkt das der vielleicht das macht was man möchte, in der Hoffnung das irgendwer dann schon den richtigen Code für einen schreiben wird.

Welche Dokumentation hat Dich denn glauben lassen das das Python ist und wie kommst Du darauf die `insert()`-Zeile so zu schreiben? Was dort entspricht denn welchem Argument von der `Text.insert()`-Methode? Wie viele Argumente erwartet die Methode? Wie heissen die und was bedeuten sie? Referenzdokumentation für `tkinter`: http://infohost.nmt.edu/tcc/help/pubs/t ... index.html (ist auch in der Python-Dokumentation zum `tkinter`-Modul verlinkt)

Sonstige Anmerkungen: Sternchen-Importe sind Böse™. Damit holt man sich alle Namen aus einem Modul in das importierende Modul. Es wird schnell unübersichtlich welcher Name wo definiert wurde und es besteht die Gefahr von Namenskollisionen.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Für so ziemlich jede nicht-triviale GUI-Anwendung ist objektorientierte Programmierung (OOP) Voraussetzung.

Für das konkrete Problem brauchst Du, wenn Du das mit den Argumenten geklärt hast, Zeichenkettenformatierung. Die ist beispielsweise Thema im Grundlagentutorial in der Python-Dokumentation.

Edit: `place()` sollte man nicht verwenden, das macht nur in wenigen Fällen Sinn, und in allen anderen Probleme. Vorgaben für Fenstergrössen nur wenn es in der GUI Elemente gibt die dynamisch mitwachsen können, denn sonst ist das unnötig weil die GUI automatisch so gross ist das alles genau passt. Also wenn man nicht `place()` nimmt, was ein Grund ist *nicht* `place()` zu verwenden.
anonym29

Du hast mir jetzt gesagt was ich falsch gemacht habe, aber nicht wie ich es richtig mache. Bitte um etwas Unterstützung :D
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

RaspiFabi hat geschrieben:Du hast mir jetzt gesagt was ich falsch gemacht habe, aber nicht wie ich es richtig mache. Bitte um etwas Unterstützung :D
Mach doch zuerst einen String daraus:

text = str(a) + "\n\n" + str(b) + "\n\n" + str(c) + "\n\n" + str(d)
BlackJack

@RaspiFabi: Doch habe ich: Lies Dir die Doku zur `Text.insert()`-Methode durch und dann weist Du welche Argumente Du übergeben musst, und dafür brauchst Du noch Zeichenkettenformatierung (nicht das was Alfons Mittelmeyer da umständlich macht) was zum Beispiel im Tutorial in der Python-Dokumentation dran kommt. Oder Du schaust Dir die Dokumentation zum Zeichenkettendatentyp (`str`) an und schaust welche Methoden es da gibt und welche davon Dir dann bei der Lösung helfen. Die Hilfe ist: Lies die Doku zu den Sachen die Du verwendest und lerne die Python-Grundlagen.

Wo liegt denn das konkrete Problem dabei?
anonym29

Nach ein paar Änderungen geht mein Programm jetzt aber noch „unschön“ mit Place und from tkinter Import *
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

BlackJack hat geschrieben:nicht das was Alfons Mittelmeyer da umständlich macht
Was findest Du an '+' umständlich?
BlackJack

@Alfons Mittelmeyer: ``+`` finde ich nicht umständlich — ``str(a) + "\n\n" + str(b) + "\n\n" + str(c) + "\n\n" + str(d)`` finde ich umständlich. Zeichenkettenformatierung trennt Daten und Code besser, ist flexibler, und kürzer. Und wenn der Trenner immer gleich ist, wie hier wäre die `join()`-Methode auf Zeichenketten in Verbindung mit `map()`, oder `itertools.imap()` in Python 2, und `str()` noch ein bisschen redundanzfreier.
Antworten