Änderbarer Text im Ausgabefenster - Hilfe benötigt!

Fragen zu Tkinter.
Antworten
br4ndy
User
Beiträge: 4
Registriert: Donnerstag 6. Dezember 2012, 23:09

Hey,
ich bin Pythonanfänger und mich hat der Ehrgeiz gepackt mein Projekt grafisch darzustellen, bis jetzt hat auch alles gut funktioniert, jetzt hänge ich aber leider an einer (warscheinlich) simplen Funktion.

Mein Code schaut bis jetzt folgendermaßen aus:

Code: Alles auswählen

value=[]
time=[]
from Tkinter import *
main = Tk()


def sende1():                
  s=Eingabefeld1.get()
  if s == "einseitige_auslenkung":
      d=open("einseitige_auslenkung.txt","r")
      liste=d.readlines()
      d.close()
      geloescht=liste.pop(0)

  if s == "zweiseitige_auslenkung":
      d=open("zweiseitige_auslenkung.txt","r")
      liste=d.readlines()
      d.close()
      geloescht=liste.pop(0)

  if s == "sprunganregung":
      d=open("sprunganregung.txt","r")
      liste=d.readlines()
      d.close()
      geloescht=liste.pop(0)
      
  for x in liste:
      if ";" in x:
          arr = x.split(";")
          y1 = (arr[1])                           
          y = float(y1.replace(",","."))          
          value.append(y)                         
          q0 = (arr[0])
          q = float (q0.replace(",","."))
          time.append(q)                                                            

      else:                                                                           
          arr = x.split()                         
          y1 = (arr[1])                           
          y = float(y1.replace(",","."))          
          value.append(y)
          q0 = (arr[0])
          q = float (q0.replace(",","."))
          time.append(q)
          
    
  a = 0                                                                       
  while a < len(value):                                                        
      if value[a] > 5.8:
          print "Vorsicht Ueberlast!!", value[a], "V bei", time[a], "s"
      else: 
          print "Gewicht O.K.        ", value[a], "V bei", time[a], "s"
        
      a = a + 1
    


Container1=Frame(main, height=100,width=400)        
Container1.pack(expand=NO)
Container2=Frame(main, height=100,width=400)
Container2.pack(expand=NO)
Eingabefeld1= Entry(Container1,bg='white')
Text1=Label(Container1,text='Datei: ')
Text2=Label(Container1,text='.txt')
Text3=Label(Container2,text='         ')
Knopf1=Button(main,text='Start',command=sende1)
Text1.pack(side=LEFT) 
Eingabefeld1.pack(side=LEFT)
Text2.pack(side=LEFT)
Text3.pack(side=LEFT)

Knopf1.pack(side=LEFT)

main.mainloop()
Text3 soll nun folgenden wert annehmen und ständig ändern:
" "Vorsicht Ueberlast!!", value[a], "V bei", time[a], "s" " bzw " "Gewicht O.K. ", value[a], "V bei", time[a], "s" ".
Ich habe jetzt versucht das ganze über text3.config(text=...)" zu lösen (so ähnlich hatte ich das ganze aus einem grafischen taschenrechner herausgelesen), leider wird mir nun aber in meinem Ausgabefenster Text3 nicht angepasst, bzw ist value[a] angeblich nicht definiert :(
Wie kann ich also Text3 richtig anzeigen, ständig überprüfen und ggf. ändern lassen?
Oder ist es möglich soetwas wie ein Ausgabefenster zu programmieren in dem die Werte bzw die Aussage "Überlast" durchlaufend angezeigt werden und das man verschieden einfärben kann ("gewicht ok"->grün,"überlast"->rot)?

Vielen Dank im Vorraus.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo br4ndy,

was nun? Wird der Text nicht geändert oder kommt eine Fehlermeldung und wie sieht die genau aus?
Was hast Du schon versucht?

So ist's besser:

Code: Alles auswählen

def sende1():               
    s=Eingabefeld1.get()
    if s not in ("einseitige_auslenkung", "zweiseitige_auslenkung", "sprunganregung"):
        return

    with open("%s.txt"%s,"r") as d:
        liste=d.readlines()

    time_value = [map(float,zeile.replace(';',' ').replace(',','.').split()) for zeile in liste[1:]]
    for time, value in time_value:         
        msg = "Vorsicht Ueberlast!!" if value > 5.8 else "Gewicht O.K.       "
        print "%s %fV bei %fs"%(msg,value,time) 
Grüße
Sirius
br4ndy
User
Beiträge: 4
Registriert: Donnerstag 6. Dezember 2012, 23:09

Hallo Sirius,

also für folgenden code wird Text3 nicht geändert (bzw nicht angezeigt da er ja auf " " definiert ist):

Code: Alles auswählen

a = 0                                                                       
  while a < len(value):                                                        
      if value[a] > 5.8:
          print "Vorsicht Ueberlast!!", value[a], "V bei", time[a], "s"
          Text3.config(text="Ueberlast")
      else: 
          print "Gewicht O.K.        ", value[a], "V bei", time[a], "s"
          Text3.config(text="Gewicht O.K.")
      a = a + 1
für folgenden code bekomme ich eine fehlermeldung:

Code: Alles auswählen

a = 0                                                                       
  while a < len(value):                                                        
      if value[a] > 5.8:
          print "Vorsicht Ueberlast!!", value[a], "V bei", time[a], "s"
          Text3.config(text="Vorsicht Ueberlast!!", value[a], "V bei", time[a], "s")
      else: 
          print "Gewicht O.K.        ", value[a], "V bei", time[a], "s"
          Text3.config(text="Gewicht O.K.        ", value[a], "V bei", time[a], "s")
      a = a + 1
Fehlermeldung: "There's an error in your program: *** non-keyword arg after keyword arg (datei.py,line 51)"

und zu guter letzt für folgenden versuch,bei dem ich erstmal versuchen wollte einen sich ändernden wert darzustellen, wieder eine fehlermeldung:

Code: Alles auswählen

a = 0                                                                       
  while a < len(value):                                                        
      if value[a] > 5.8:
          print "Vorsicht Ueberlast!!", value[a], "V bei", time[a], "s"
          Text3.config(value[a])
      else: 
          print "Gewicht O.K.        ", value[a], "V bei", time[a], "s"
          Text3.config(value[a])
      a = a + 1
Fehlermeldung:
"Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python27\lib\lib-tk\Tkinter.py", line 1410, in __call__
return self.func(*args)
File "E:\fertig.py", line 54, in sende1
Text3.config(value[a])
File "C:\Python27\lib\lib-tk\Tkinter.py", line 1202, in configure
return self._configure('configure', cnf, kw)
File "C:\Python27\lib\lib-tk\Tkinter.py", line 1182, in _configure
cnf = _cnfmerge(cnf)
File "C:\Python27\lib\lib-tk\Tkinter.py", line 82, in _cnfmerge
for c in _flatten(cnfs):
TypeError: object of type 'float' has no len()"

Ich muss dazusagen dass ich bis jetzt nur einen python grundlagenkurs hinter mir habe und den tkinter-teil des programms via copy/paste zusammengebastelt und dann umgeschrieben/angepasst habe soweit ich die funktionen verstanden habe.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo br4ndy,

Um Text zu setzen geht das so:

Code: Alles auswählen

ueberlast = StringVar()
text3 = Label(master, textvariable=ueberlast).pack()
und zum Setzen:

Code: Alles auswählen

        msg = "Vorsicht Ueberlast!!" if value > 5.8 else "Gewicht O.K.       "
        ueberlast.set("%s %fV bei %fs"%(msg,value,time))
Deine 2. Methode tut nicht, weil aus den einzelnen Teilen ein String gemacht
werden muß, Methode 3 ist falsch, weil value[a] kein String ist.

Grüße
Sirius
br4ndy
User
Beiträge: 4
Registriert: Donnerstag 6. Dezember 2012, 23:09

Also mit deinem code kam zunächst der fehler "name 'master' not defined".

nachdem ich 'master' rausgelöscht hatte zeigt er jetzt zwar "gewicht ok und die dazugehörenden werte aus der datei" an, allerdings nur den letzten wert meiner datei. wenn das programm jetzt noch die komplette datei ablaufen und die ausgabe jedem wert anpasst wärs perfekt, da es sich um eine datei mit gefühlten 1000 zeilen handelt und bei jedem wert, der 5,8 volt übersteigt, eine überlast warnung ausgegeben werden soll.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Du willst 1000 Einträge in Deinem Label haben?
Dann wird es da aber ein bißchen eng.
Wie wärs mit eine ListBox?
BlackJack

@Sirius3: Ich denke die Datei hat 1000 Zeilen und *ein paar* davon zeigen eine Überlast an. Ich würde es aber auch nicht in einem Label anzeigen.

@br4ndy: Warum willst Du die Anzeige laufend aktualisieren? 1000 Zeilen sind so schnell verarbeitet, dass das wenig Sinn macht. Man kann da auch alle Zeilen auf einmal verarbeiten und die Ausgabedaten sammeln und die am Ende in einem Widget anzeigen.
br4ndy
User
Beiträge: 4
Registriert: Donnerstag 6. Dezember 2012, 23:09

Danke BlackJack, ich denke so werde ich es mal versuchen :)
Antworten