Input Stream anzeigen

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

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: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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

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: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

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

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

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

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

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

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

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: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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

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

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

Großes Dankeschön natürlich auch an Sirius3!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09: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!
snoopy48
User
Beiträge: 14
Registriert: Mittwoch 7. Februar 2018, 21:47

Hi wuf!

Ja, funktioniert jetzt prima! Vielen Dank!
Da hätte ich noch ein Frage dazu: wenn ich den Output nicht nur in der GUI, sondern gleichzeitig auch mittels keyboard.send_keys in ein Programm ausgeben lassen möchte, dachte ich, einfach in der Zeile 24 den Befehl "keyboard.send_keys(label['text'])" eingeben zu müssen. Da erhalte ich aber eine Fehlermeldung: name 'keyboard' is not defined
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi snoopy48

Tut mir leid das Python-Modul 'keyboard' kenne ich nicht. Vielleicht weiss da ein anderes Formmitglied mehr darüber.

Gruss wuf :wink:
Take it easy Mates!
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@snoopy48: wenn `keyboard` nicht definiert ist, dann hast Du es nirgends definiert. Namen tauchen nicht auf magische Weise irgendwo auf. Woher hast Du die Zeile?
snoopy48
User
Beiträge: 14
Registriert: Mittwoch 7. Februar 2018, 21:47

Wird in den (Python) Programmen von Autokey verwendet, dachte daher, dass es ein Python Befehl wäre.
Wie sende ich dann in diesem Programm einen Text z.B. in gerade offenes Word Dokument? Der Print Befehl geht ja auf die Konsole.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist autokey-Funktionalitaet. Ich kenne das nicht weiter, aber wenn das ein eingebetteter Interpreter ist, dann musst du dein Python schon darin laufen lassen. Ansonsten *kann* man das alles mit COM nachbasteln, aber das ist eine Herkulesaufgabe, und nicht fuer Anfaenger geeignet.
Antworten