TypeError erkenne Fehler nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
ichbins
User
Beiträge: 40
Registriert: Samstag 5. September 2020, 07:07

Danke für die ausführlichen Beschreibungen!
ichbins
User
Beiträge: 40
Registriert: Samstag 5. September 2020, 07:07

Irgendwie hänge ich wieder beim Auslesen von mehreren Entries bei tkinter. Hier ist ein Versuch aber entweder wird immer nur die letzte Zahl eingetragen oder es kommt ein Fehler. Ich versuche aus mehreren Entries die Werte auszulesen und in die Liste zu speichern. Habt ihr vielleicht ein Beispiel.

Danke!

Code: Alles auswählen

def __init__(self): 
 	self.entries=[]
        for column in range(0,10):
            self.entry=tk.Entry(root, width=3)
            self.entry.pack(side=tk.LEFT, anchor=tk.W)
            self.entries.append(self.entry.get())
            
def auslesen(self):
	i=0
	for x in self.entries:
     		x=x.get()   
  		self.entries.insert(i, x)
 		i=i+1
	print (str(x))
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Deine Einrückungen sind kaputt. Damit ist der code nicht lesbar. Einen Wert an ein Attribut ( hier entry) innerhalb einer for Schleife zubinden ist eigentlich nie sinnvoll. entry wird ja auch nicht mehr verwendet. Zu dem Zeitpunkt, zudem du entry.get aufrufst, kann der Nutzer doch noch gar nichts eingegeben haben. Der Name der Liste entries ist daher auch irreführend.
In auslesen ist dann so einiges nicht gut. Der Name x der Laufvariable für die Einträge von entries ist schlecht, da er nicht beschreibt was das für Einträge sind. Wenn diese Einträge eine get-Methode hätten, warum sollte dann auch das Ergebnis des Aufrufs der get-Methode in dieselbe Liste gepackt werden?
Zudem ist das Ändern einer Liste, über die gerade mit einer for-Schleife iteriert wird, ein Fehler. Generell ist es unüblich in Python Listen zu verändern. Stattdessen macht man einfach neue Listen.
ichbins
User
Beiträge: 40
Registriert: Samstag 5. September 2020, 07:07

entry.get wird später verwendet da die Werte gespeichert werden mit pickle. Ich bin jetzt nur dabei Werte die ich eintrage in die Entry Widgets in eine Liste gespeichert werden.

Die Eingabefelder sind ja für die Vorgabe von Werten bestimmter Kanäle von der Hardware. Somit werden die Eingaben an das Hauptprogramm der Hardware geschickt. Die Werte werden mit pop und insert an den jeweiligen Stellen gelöscht und in die Liste an der jeweiligen Position eingetragen.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ichbins: `entry.get()` wird nicht später verwendet das wird in der `__init__()` verwendet, zu einem Zeitpunkt wo das garantiert die leere Zeichenkette ergibt und damit gar keinen Sinn macht. Und später kannst Du die `Entry`-Objekte gar nicht mehr verwenden, denn Du speicherst sie ja nicht. Lass Dir am Ende der `__init__()` einfach mal `self.entries` ausgeben.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
ichbins
User
Beiträge: 40
Registriert: Samstag 5. September 2020, 07:07

So wird nur die letzte Stelle von self.entry in self.entries=[] geschrieben. Aber das funktioniert auch nicht dass ich mit self.entry[column] mehrere Entry anlege. Beim self.entries bei __init__ wird ja eine leere Liste mit 4 Stellen erzeugt. Das ist in Ordnung. Wie kann ich jetzt die 4 self.entry auslesen um es in self.entries zu schreiben.

Code: Alles auswählen

import tkinter as tk

class Window():
    def __init__(self): 

        self.root = tk.Tk()
        self.root.geometry("600x400")        

        self.entries=[]
        for column in range(0,4):
            self.entry=tk.Entry(self.root, width=5)
            self.entry.pack(side=tk.LEFT, anchor=tk.W)
            self.entries.append(self.entry.get())
        print(self.entries)
        
        self.button=tk.Button(self.root, text='Auslesen', command=self.auslesen)
        self.button.pack()
                  
            
    def auslesen(self):   
        i=0
        for x in self.entry.get(): 
            self.entries.pop(i)
            self.entries.insert(i, x)
            i=i+1
            print(self.entries)
            print (str(x))
            
graph=Window()
graph.root.mainloop()
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@ichbins: das ist nicht in Ordnung. Wie schon geschrieben, erzeugt man in Python keine Listen mit Dummy-Werten und füllt die nachträglich, sondern man erzeugt eine neue Liste mit den Einträgen die man braucht.
Und Du brauchst alle Eingabefelder, daher brauchst Du auch eine Liste self.entries, aber da müssen alle Entry-Objekte rein, damit Du später auch auf sie zugreifen kannst. Was soll jetzt die for-Schleife über self.entry.get()? Hast Du Dir schonmal angeschaut, was das macht?
Programmieren funktioniert nicht mit Raten. Man baut ein Programm Schritt für Schritt auf, und überlegt sich, "was brauche ich für den nächsten Schritt".
Daher Schritt für Schritt: Für das Auslesen der Entryfelder brauche ich die Entryfelder.
Daher: Im ersten Schritt muß ich mir die erzeugten Entryfelder irgendwo merken.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ichbins: Eine „leere Liste mit vier Stellen“ ist ein Widerspruch in sich, denn entweder ist eine Liste leer, oder sie enthält Werte. In diesem Fall vier. Und das ist *nicht* in Ordnung, denn es macht keinen Sinn und nicht das was Du willst. In diese Liste gehören die `Entry`-Objekte, denn auf diese `Entry`-Objekte willst Du in `auslesen()` zugreifen. Das geht halt nur wenn Du Dir die Objekte irgendwo merkst. Zum Beispiel in genau dieser Liste.

Ein einzelnes `Entry` aus dieser Schleife gehört dagegen *nicht* an das Objekt gebunden. Das ist dann nach der Schleife logischerwesie das letzte welches ertellt wurde. Das hätte man auch als letztes Element aus der `entries`-Liste haben können, wenn man da die `Entry`-Objekte drin speichert.

Und diese Liste *bleibt* dann auch so! Da wird in `auslesen()` *nichts dran verändert*. Schon gar nicht mit `pop()` und `insert()` auf den gleichen Index. Das ist extrem unsinnig.

Das wurde aber jetzt auch alles schon mal gesagt. Fang damit an a) die `Entry`-Objekte in der Liste zu speichern, und b) die *einzelnen* `Entry`-Objekte nicht mehr an das Objekt selbst zu binden. Und in der `auslesen()`-Methode kannst Du dann über die `Entry`-Objekte in der Liste iterieren, deren Inhalt abfragen, und in einer *neuen* Liste speichern. Und zwar in dem diese Liste Element für Element aufgebaut wird, durch `append()` oder eine „list comprehension“, so wie das in Python üblich ist. Alles andere ist nicht „in Ordnung“ sondern falsch und nicht zielführend.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten