Input Stream anzeigen

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

Input Stream anzeigen

Beitragvon snoopy48 » 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: 7043
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Input Stream anzeigen

Beitragvon Sirius3 » 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.

  1. import Tkinter as tk
  2. import os
  3.  
  4. def oeffnen(label, lines):
  5.     try:
  6.         label.config(next(lines))
  7.     except StopIteration:
  8.         pass
  9.     else:
  10.         label.after(1000, oeffnen, label, lines)
  11.  
  12. def main():
  13.     main = tk.Tk()
  14.     main.title("Input")
  15.  
  16.     text_label = tk.Label(main, fg="black")
  17.     text_label.pack()
  18.  
  19.     lines = open("test.txt")
  20.     text_label.after(1000, oeffnen, text_label, lines)
  21.  
  22.     button = tk.Button(main, text='Stop', width=25, command=main.destroy)
  23.     button.pack()
  24.     main.mainloop()
  25.  
  26. if __name__ == '__main__':
  27.     main()
snoopy48
User
Beiträge: 11
Registriert: Mittwoch 7. Februar 2018, 21:47

Re: Input Stream anzeigen

Beitragvon snoopy48 » 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
"

Benutzeravatar
__deets__
User
Beiträge: 2141
Registriert: Mittwoch 14. Oktober 2015, 14:29

Re: Input Stream anzeigen

Beitragvon __deets__ » Donnerstag 8. Februar 2018, 23:24

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

Re: Input Stream anzeigen

Beitragvon snoopy48 » Freitag 9. Februar 2018, 14:55

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

Re: Input Stream anzeigen

Beitragvon __deets__ » 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: 11
Registriert: Mittwoch 7. Februar 2018, 21:47

Re: Input Stream anzeigen

Beitragvon snoopy48 » Samstag 10. Februar 2018, 13:29

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

Re: Input Stream anzeigen

Beitragvon __deets__ » 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: 11
Registriert: Mittwoch 7. Februar 2018, 21:47

Re: Input Stream anzeigen

Beitragvon snoopy48 » Samstag 10. Februar 2018, 14:12

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

Re: Input Stream anzeigen

Beitragvon __deets__ » 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: 1366
Registriert: Sonntag 8. Juni 2003, 09:50

Re: Input Stream anzeigen

Beitragvon wuf » Samstag 10. Februar 2018, 14:43

Hi snoopy48

Kannst du das folgende Skript einmal ausprobieren?:
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. try:
  5.     # Tkinter for Python 2.xx
  6.     import Tkinter as tk
  7. except ImportError:
  8.     # Tkinter for Python 3.xx
  9.     import tkinter as tk
  10.  
  11.  
  12. def oeffnen(label):
  13.     with open("test.txt") as f:
  14.         data = f.read()
  15.         print(data)
  16.     label.config(text=data)
  17.  
  18.  
  19. main = tk.Tk()
  20. main.title("Input")
  21.  
  22. text_label = tk.Label(main, fg="black")
  23. text_label.pack()
  24. oeffnen(text_label)
  25.  
  26. button = tk.Button(main, text='Stop', width=25, command=main.destroy)
  27. button.pack()
  28. main.mainloop()
Gruss wuf :wink:
Take it easy Mates!
snoopy48
User
Beiträge: 11
Registriert: Mittwoch 7. Februar 2018, 21:47

Re: Input Stream anzeigen

Beitragvon snoopy48 » 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: 11
Registriert: Mittwoch 7. Februar 2018, 21:47

Re: Input Stream anzeigen

Beitragvon snoopy48 » 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: 11
Registriert: Mittwoch 7. Februar 2018, 21:47

Re: Input Stream anzeigen

Beitragvon snoopy48 » Samstag 10. Februar 2018, 15:33

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

Re: Input Stream anzeigen

Beitragvon wuf » 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:
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. try:
  5.     # Tkinter for Python 2.xx
  6.     import Tkinter as tk
  7. except ImportError:
  8.     # Tkinter for Python 3.xx
  9.     import tkinter as tk
  10.  
  11.  
  12. def oeffnen(label):
  13.     with open("test.txt") as f:
  14.         data = f.read().splitlines()
  15.     show(label, data)
  16.  
  17. def show(label, data, index=0):
  18.     if index < len(data):
  19.         label['text'] = data[index]
  20.         index += 1
  21.     else:
  22.         return
  23.     main.after(1000, show, label, data, index)
  24.  
  25.    
  26. main = tk.Tk()
  27. main.title("Input")
  28.  
  29. text_label = tk.Label(main, fg="black")
  30. text_label.pack()
  31. oeffnen(text_label)
  32.  
  33. button = tk.Button(main, text='Stop', width=25, command=main.destroy)
  34. button.pack()
  35. main.mainloop()
Gruss wuf :wink:
Take it easy Mates!

Wer ist online?

Mitglieder in diesem Forum: __deets__, Yahoo [Bot]