Seite 1 von 2

Input Stream anzeigen

Verfasst: Mittwoch 7. Februar 2018, 21:59
von snoopy48
Hallo!

Ich bin blutiger Anfänger in Python und würde gerne ein ganz einfaches Script erstellen, mit dem ich eine Textdatei einlese und den Inhalt zeilenweise in einer GUI anzeige. Das hier funktioniert nicht so recht, weil es nur die letzte Zeile der Datei anzeigt. Leider ist Python doch nicht so einfach wie ich dachte :( Weiß jemand, wo der Fehler ist?

Code: Alles auswählen

import Tkinter as tk
import os 
counter = 0 

def oeffnen(label):
	file = open("test,txt", "r")
	i = 0
	for line in file: 
		i = i + 1
		x = line
		label.config(text=str(x))
		time.sleep(1)
	file.close()
 
 
main = tk.Tk()
main.title("Input")

text_label = tk.Label(main, fg="black")
text_label.pack()
oeffnen(text_label)

button = tk.Button(main, text='Stop', width=25, command=main.destroy)
button.pack()
main.mainloop()

Re: Input Stream anzeigen

Verfasst: Mittwoch 7. Februar 2018, 22:54
von Sirius3
@snoopy48: bei GUIs darf es kein sleep und keine „Endlos“-Schleifen geben. Wenn Du einen Text zeilenweise angezeigt haben willst, mußt Du der GUI immer wieder die Gelegenheit geben, sich zu aktualisieren. Dazu verwendet man after. »i« wird nicht verwendet, bräuchte man es doch, nimmt man »enumerate«. Eingerückt wird immer mit 4 Leerzeichen pro Ebene.

Code: Alles auswählen

import Tkinter as tk
import os

def oeffnen(label, lines):
    try:
        label.config(next(lines))
    except StopIteration:
        pass
    else:
        label.after(1000, oeffnen, label, lines)
 
def main():
    main = tk.Tk()
    main.title("Input")

    text_label = tk.Label(main, fg="black")
    text_label.pack()

    lines = open("test.txt")
    text_label.after(1000, oeffnen, text_label, lines)

    button = tk.Button(main, text='Stop', width=25, command=main.destroy)
    button.pack()
    main.mainloop()

if __name__ == '__main__':
    main()

Re: Input Stream anzeigen

Verfasst: Donnerstag 8. Februar 2018, 21:05
von snoopy48
Hm, was läuft da falsch? Erhalte folgende Fehlermeldungen ("Apple" ist die erste Zeile aus der test.txt Datei):
python test8.py
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1540, in __call__
return self.func(*args)
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 590, in callit
func(*args)
File "test8.py", line 6, in oeffnen
label.config(next(lines))
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1329, in configure
return self._configure('configure', cnf, kw)
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1319, in _configure
return self._getconfigure1(_flatten((self._w, cmd, '-'+cnf)))
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1307, in _getconfigure1
x = self.tk.splitlist(self.tk.call(*args))
TclError: unknown option "-Apple
"

Re: Input Stream anzeigen

Verfasst: Donnerstag 8. Februar 2018, 23:24
von __deets__
config(‚pillepalle’) geht ja auch nicht. Es muss config(text=‘Pillepalle‘) heißen.

Re: Input Stream anzeigen

Verfasst: Freitag 9. Februar 2018, 14:55
von snoopy48
Sorry, verstehe ich nicht!

Re: Input Stream anzeigen

Verfasst: Freitag 9. Februar 2018, 15:20
von __deets__
label.config - was glaubst du macht die Methode? Wenn du ein Objekt bist, und ich kann dich konfigurieren, zB wo im Raum du bist - x und y Koordinate. Und jetzt brülle ich dir zu “15!!” - was tust du dann? Nix. Weil du nicht weißt, was ich meine. Da fehlt die Angabe welche Koordinate ich meine.

label.config ohne Keyword-Argument ist also genauso verwirrend. Was willst du denn an dem Label konfigurieren?

Re: Input Stream anzeigen

Verfasst: Samstag 10. Februar 2018, 13:29
von snoopy48
Danke, kann damit aber leider nichts anfangen, bin - wie eingangs erwähnt - blutiger Anfänger.

Re: Input Stream anzeigen

Verfasst: Samstag 10. Februar 2018, 14:08
von __deets__
Du hast es doch in deinem eigenen Code stehen. Sirius3 hat da einen kleinen Fehler gemacht, und du musst die beiden Dinge zusammen führen :K

Re: Input Stream anzeigen

Verfasst: Samstag 10. Februar 2018, 14:12
von snoopy48
Könntest Du mir nicht einfach zeigen, wie die korrekte Zeile aussieht?

Re: Input Stream anzeigen

Verfasst: Samstag 10. Februar 2018, 14:28
von __deets__
das hab ich schon getan. Doch suchen und ersetzen musst du schon selbst. Das hat mit programmieren lernen ja nun nichts zu tun. Ich bin hier nicht zum programmieren auf Zuruf. Und weil ich am iPad sitze, ist das auch eh schwieriger als normal.

Re: Input Stream anzeigen

Verfasst: Samstag 10. Februar 2018, 14:43
von wuf
Hi snoopy48

Kannst du das folgende Skript einmal ausprobieren?:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

try:
    # Tkinter for Python 2.xx
    import Tkinter as tk
except ImportError:
    # Tkinter for Python 3.xx
    import tkinter as tk


def oeffnen(label):
    with open("test.txt") as f:
        data = f.read()
        print(data)
    label.config(text=data)
 
 
main = tk.Tk()
main.title("Input")

text_label = tk.Label(main, fg="black")
text_label.pack()
oeffnen(text_label)

button = tk.Button(main, text='Stop', width=25, command=main.destroy)
button.pack()
main.mainloop()
Gruss wuf :wink:

Re: Input Stream anzeigen

Verfasst: Samstag 10. Februar 2018, 15:11
von snoopy48
Hi wuf!

Funktioniert, aber nicht ganz so wie gewünscht. Es wird gleich der gesamte Inhalt der test Datei angezeigt und nicht Zeile für Zeile mit 1 Sek. Verzögerung.

Re: Input Stream anzeigen

Verfasst: Samstag 10. Februar 2018, 15:31
von snoopy48
Hi deets!

Ah, jetzt habe ich erst verstanden, was Du meintest. Vielen Dank, funktioniert jetzt. Schwere Geburt :D

Re: Input Stream anzeigen

Verfasst: Samstag 10. Februar 2018, 15:33
von snoopy48
Großes Dankeschön natürlich auch an Sirius3!

Re: Input Stream anzeigen

Verfasst: Samstag 10. Februar 2018, 17:50
von wuf
snoopy48 hat geschrieben:Funktioniert, aber nicht ganz so wie gewünscht.
Sorry habe dich falsch verstanden. Hier noch die korrigierte Variante:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

try:
    # Tkinter for Python 2.xx
    import Tkinter as tk
except ImportError:
    # Tkinter for Python 3.xx
    import tkinter as tk


def oeffnen(label):
    with open("test.txt") as f:
        data = f.read().splitlines()
    show(label, data)
 
def show(label, data, index=0):
    if index < len(data):
        label['text'] = data[index]
        index += 1
    else:
        return
    main.after(1000, show, label, data, index)

    
main = tk.Tk()
main.title("Input")

text_label = tk.Label(main, fg="black")
text_label.pack()
oeffnen(text_label)

button = tk.Button(main, text='Stop', width=25, command=main.destroy)
button.pack()
main.mainloop()
Gruss wuf :wink: