Input Stream anzeigen

Fragen zu Tkinter.
snoopy48
User
Beiträge: 14
Registriert: Mittwoch 7. Februar 2018, 21:47

Mittwoch 7. Februar 2018, 21:59

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()
Sirius3
User
Beiträge: 7628
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 7. Februar 2018, 22:54

@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()
snoopy48
User
Beiträge: 14
Registriert: Mittwoch 7. Februar 2018, 21:47

Donnerstag 8. Februar 2018, 21:05

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
"
__deets__
User
Beiträge: 2707
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 8. Februar 2018, 23:24

config(‚pillepalle’) geht ja auch nicht. Es muss config(text=‘Pillepalle‘) heißen.
snoopy48
User
Beiträge: 14
Registriert: Mittwoch 7. Februar 2018, 21:47

Freitag 9. Februar 2018, 14:55

Sorry, verstehe ich nicht!
__deets__
User
Beiträge: 2707
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 9. Februar 2018, 15:20

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?
snoopy48
User
Beiträge: 14
Registriert: Mittwoch 7. Februar 2018, 21:47

Samstag 10. Februar 2018, 13:29

Danke, kann damit aber leider nichts anfangen, bin - wie eingangs erwähnt - blutiger Anfänger.
__deets__
User
Beiträge: 2707
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samstag 10. Februar 2018, 14:08

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
snoopy48
User
Beiträge: 14
Registriert: Mittwoch 7. Februar 2018, 21:47

Samstag 10. Februar 2018, 14:12

Könntest Du mir nicht einfach zeigen, wie die korrekte Zeile aussieht?
__deets__
User
Beiträge: 2707
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samstag 10. Februar 2018, 14:28

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.
Benutzeravatar
wuf
User
Beiträge: 1423
Registriert: Sonntag 8. Juni 2003, 09:50

Samstag 10. Februar 2018, 14:43

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:
Take it easy Mates!
snoopy48
User
Beiträge: 14
Registriert: Mittwoch 7. Februar 2018, 21:47

Samstag 10. Februar 2018, 15:11

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.
snoopy48
User
Beiträge: 14
Registriert: Mittwoch 7. Februar 2018, 21:47

Samstag 10. Februar 2018, 15:31

Hi deets!

Ah, jetzt habe ich erst verstanden, was Du meintest. Vielen Dank, funktioniert jetzt. Schwere Geburt :D
snoopy48
User
Beiträge: 14
Registriert: Mittwoch 7. Februar 2018, 21:47

Samstag 10. Februar 2018, 15:33

Großes Dankeschön natürlich auch an Sirius3!
Benutzeravatar
wuf
User
Beiträge: 1423
Registriert: Sonntag 8. Juni 2003, 09:50

Samstag 10. Februar 2018, 17:50

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:
Take it easy Mates!
Antworten