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

Hallo,

es kommt ein TypeError. Könnt ihr erkennen wo der Fehler liegt.

Wäre dankbar für eure Hilfe.

MfG

Hier ist der Code:

Code: Alles auswählen

import tkinter as tk

window = tk.Tk()
window.geometry("780x480")

def vorname_nachname():
    for m in range(0,5):
        vorname=entry_vorname[m].get()
        nachname=entry_nachname[m].get()
        if vorname=='' or nachname=='':
            tk.messagebox.showwarning()
            

#Text und Eingabefelder für "Vorname"
label_vorname=tk.Label(window, text="Vorname:")
label_vorname.place(x=50, y=40, width=80, height=20)
for i in range(0,5):
    entry_vorname[i]=tk.Entry(window, width=10)
    entry_vorname[i].place(x=140, y=40+i*30, width=80, height=20)


#Text und Eingabefelder für "Nachname"    
label_nachname=tk.Label(window, text="Nachname:")
label_nachname.place(x=320, y=40, width=115, height=20)


for j in range(0,5):
    entry_nachname[j]=tk.Entry(window, width=10)
    entry_nachname[j].place(x=445, y=40+j*30, width=80, height=20)
    
button=tk.Button(window, text='Senden', command=vorname_nachname)
button.place(x=645, y=400) 

window.mainloop()


Traceback (most recent call last):

  File "<ipython-input-11-7651fa8f67cd>", line 1, in <module>
    runfile('/home/Dokumente/grafik/grafik.py', wdir='/home/Dokumente/grafik')

  File "/usr/lib/python3/dist-packages/spyder_kernels/customize/spydercustomize.py", line 678, in runfile
    execfile(filename, namespace)

  File "/usr/lib/python3/dist-packages/spyder_kernels/customize/spydercustomize.py", line 106, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "/home/Dokumente/grafik/grafik.py", line 26, in <module>
    entry_vorname[i]=tk.Entry(window, width=10)

  File "/usr/lib/python3.7/tkinter/__init__.py", line 1492, in __setitem__
    self.configure({key: value})

  File "/usr/lib/python3.7/tkinter/__init__.py", line 1485, in configure
    return self._configure('configure', cnf, kw)

  File "/usr/lib/python3.7/tkinter/__init__.py", line 1476, in _configure
    self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))

  File "/usr/lib/python3.7/tkinter/__init__.py", line 1324, in _options
    if k[-1] == '_': k = k[:-1]

TypeError: 'int' object is not subscriptable
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ichbins: Der Code pass nicht zur Ausnahme, denn der Code führt zu einem `NameError` weil `entry_vorname` nicht definiert ist. Das sieht auch reichlich komisch aus, dass da per numerischem Index `Entry`-Exemplare zugewiesen werden. Was ist das denn für ein Datentyp? Falls es ein Wörterbuch ist, dann ist das komisch weil von 0 startende, fortlaufende Schlüssel eher für eine Liste sprechen würde. Falls es eine Liste ist, dann ist das komisch weil sich dann die Frage stellt welche nicht-Dummy-Werte da ersetzt werden. Falls es Dummy-Werte sind, dann ist das kein Python. In Python würde man so eine Liste elementweise aufbauen und nicht irgendwelche Dummy-Werte ersetzen.

`place()` ist keine gute Idee, das verwendet man nicht.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Für jede nicht-triviale GUI braucht man Klassendefinitionen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
ichbins
User
Beiträge: 40
Registriert: Samstag 5. September 2020, 07:07

Hallo Blackjack

es sind zwei Listen mit Strings.

So funktioniert es zwar aber ich bekomme keine Werte angezeigt. Kann man so auf die einzelnen Elemente zugreifen falls ein Text steht oder werden die Texte überschrieben? Es sollen Vor- und Nachname eingegeben werden jedoch muss es nicht die Anzahl der Eingabefelder sein.

Code: Alles auswählen

from tkinter import messagebox

window = tk.Tk()
window.geometry("780x480")

vorname=[]
nachname=[]

def vorname_nachname():
    for m in range(0,5):
        vorname=entry_vorname.get()
        nachname=entry_nachname.get()
        print(vorname, nachname)
        
        '''
        if vorname=='' or nachname=='':
            tk.messagebox.showwarning('Warning', 'Keine Eingabe')
            break'''

#Text und Eingabefelder für "Vorname"
label_vorname=tk.Label(window, text="Vorname:")
label_vorname.place(x=50, y=40, width=80, height=20)
for i in range(0,5):
    entry_vorname=tk.Entry(window, width=10)
    entry_vorname.place(x=140, y=40+i*30, width=80, height=20)


#Text und Eingabefelder für "Nachname"    
label_nachname=tk.Label(window, text="Nachname:")
label_nachname.place(x=320, y=40, width=115, height=20)


for j in range(0,5):
    entry_nachname=tk.Entry(window, width=10)
    entry_nachname.place(x=445, y=40+j*30, width=80, height=20)
    
button=tk.Button(window, text='Senden', command=vorname_nachname)
button.place(x=645, y=400) 

window.mainloop()
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ichbins: Was sind Listen mit Zeichenketten? `entry_vorname` und `entry_nachname`? Dann sind die Namen falsch und man sollte auch nicht verschiedene (Duck)Typen in einer Liste speichern. Also nicht Zeichenketten und `Entry`-Objekte.

Die Listen `vorname` und `nachname` im geänderten Quelltext werden nirgends verwendet. Und sollten sie auch nicht, denn das hat wie schon gesagt auf Modulebene alles nichts verloren. Da gehören keine Variablen hin und kein Code der nicht Konstanten, Funktionen, und Klassen definiert.

Und man braucht für dieses Programm Klassen! Also mindestens eine.

Jetzt kommt auch schon viel früher ein `NameError` weil `tk` hier nicht mehr definiert ist.

Zeichenkettenliterale sind keine Kommentare. Auch wenn man Code auskommentiert macht man das mit #.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
ichbins
User
Beiträge: 40
Registriert: Samstag 5. September 2020, 07:07

@blackjack: Irgendwie ist es mir unklar was du gemeint hast.
In einem Modul sind die Listen Seriennummer und Ware.

daten.py

seriennummer=['1', '2', '3', '4']
ware=['5', '6', '7', '8']

Ich habe jetzt versucht die Seriennummer und Ware in der Grafik tkinter einzugeben und in den Listen Seriennummer und Ware abzuspeichern. Wie kann ich auf die einzelnen Felder zugreifen. Ich dachte das geht mit entry_seriennummer[x]. Aber da funktioniert es nicht. Bei entry_seriennummer=tk.entry() ist kein Fehler, jedoch wie kann ich auf die einzelnen Eingabefelder zugreifen. Wenn ich auf den Button Senden gehe, werden die Strings von den Eingabefeldern nicht in den Listen von daten.seriennummer und daten.ware gespeichert. Bei print() wird nichts angezeigt.

Was die Klassen betrifft bei tkinter. Viele Tutorials sind ohne Klassen. Ich versuche noch das erste Problem zu lösen. Was ist eigentlich der Vorteil der Klassen.

Danke!
LG

Hier ist der Code der funktioniert, jedoch ist irgendwo der Wurm.

Code: Alles auswählen

grafik.py

import tkinter as tk
from tkinter import messagebox
import daten

window = tk.Tk()
window.geometry("780x480")


def vergleichen():
    for m in range(0,5):
        daten.seriennummer=entry_seriennummer.get()
        daten.ware=entry_ware.get()
        print(daten.seriennummer, daten.ware)
        


#Text und Eingabefelder für "Seriennummer"
label_seriennummer=tk.Label(window, text="S.nummer:")
label_seriennummer.place(x=50, y=40, width=80, height=20)
for i in range(0,5):
    entry_seriennummer=tk.Entry(window, width=10)
    entry_seriennummer.place(x=140, y=40+i*30, width=80, height=20)


#Text und Eingabefelder für "Ware"    
label_ware=tk.Label(window, text="Ware:")
label_ware.place(x=320, y=40, width=115, height=20)


for j in range(0,5):
    entry_ware=tk.Entry(window, width=10)
    entry_ware.place(x=445, y=40+j*30, width=80, height=20)
    
button=tk.Button(window, text='Senden', command=vergleichen)
button.place(x=645, y=400) 

window.mainloop()




daten.py

seriennummer=[]
ware=[]

Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ichbins: Es macht keinen Sinn das von Dir benannte „erste Problem“ zu lösen solange der Rest so kaputt ist und es ist auch nicht so wirklich die Frage was der Vorteil von Klassen ist. Du *brauchst* Klassen. Der Nachteil ohne Klassen wäre, das es ohne Klassen nicht funktioniert. Weil man keine globalen Variablen verwendet. Also ist das `daten`-Modul auch falsch wenn `ware` und `seriennummer` dort keine Konstanten sondern auch wieder globale Variablen sind.

Du musst Python so weit drauf haben, dass Du Funktionen verstanden hast. *Echte* Funktionen die nicht magisch auf irgendwelchem globalen Zustand operieren. Danach dann Klassen um ohne globale Variablen Zustand über Aufrufe hinweg merken zu können. Erst dann macht es Sinn sich mit einer nicht-trivialen GUI zu beschäftigen.

Und da auch gleich von Anfang an *kein* `place()` verwenden. Das ist Murks der nicht richtig funktioniert, unnötig aufwändig, und fehleranfällig ist.

Falls jeweils eine Serienummer zu einer Ware gehört, dann ist es auch falsch das in zwei ”parallelen” Listen zu speichern.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
ichbins
User
Beiträge: 40
Registriert: Samstag 5. September 2020, 07:07

Hier ist jetzt die Klasse. Es ist wieder das gleiche Problem. Habe ich ein Eingabefenster funktioniert es. Habe ich 5 Eingabefenster zeigt er nichts an.

Kannst du mir vielleicht mal ein Bsp. zeigen wie du das gemeint hast dass ich eine Liste verwenden soll und dass es nicht global sein soll. Ich müsste also dann die Variable in eine Funktion schreiben.

Das andere Problem ist wenn ich auf Senden drücke wird die Eingabe angezeigt wenn ich nur eine Zeile habe. Jedoch wird die der Inhalt nicht im Variablenmanager angezeigt. Es steht im Variablenmanager dass die Liste 0 ist. Und setze ich einen Breakpoint beim Debugger bleibt er nur beim Start stehen, danach öffnet er den tkinter und wenn ich auf Senden drücke bleibt er nicht mehr beim Breakpoint stehen aber es wird angezeigt.

LG

Code: Alles auswählen

import tkinter as tk
from tkinter import messagebox
import daten

class Fenster:
    def __init__(self):
        self.window = tk.Tk()
        self.window.geometry("780x480")
        
        #Text und Eingabefelder für "Seriennummer"
        self.label_seriennummer=tk.Label(self.window, text="S.nummer:")
        self.label_seriennummer.place(x=50, y=40, width=80, height=20)
        for i in range(0,5):
            self.entry_seriennummer=tk.Entry(self.window, width=10)
            self.entry_seriennummer.place(x=140, y=40+i*30, width=80, height=20)

        #Text und Eingabefelder für "Ware"    
        self.label_ware=tk.Label(self.window, text="Ware:")
        self.label_ware.place(x=320, y=40, width=115, height=20)


        for j in range(0,5):
            self.entry_ware=tk.Entry(self.window, width=10)
            self.entry_ware.place(x=445, y=40+j*30, width=80, height=20)
    
        self.button=tk.Button(self.window, text='Senden', command=self.vergleichen)
        self.button.place(x=645, y=400) 
        
        self.vergleichen()
        

        self.window.mainloop()
    
    
    
    def vergleichen(self):
        daten.seriennummer=self.entry_seriennummer.get()
        daten.ware=self.entry_ware.get()
        print(daten.seriennummer, daten.ware)
        
        
        
fenster=Fenster()



daten.py
seriennummer=[]
ware=[]



Zuletzt geändert von ichbins am Sonntag 20. September 2020, 21:12, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Alles einfach nur in eine __init__-Methode zu packen, ist nicht sinnvoll. Eine __init__-Methode ist dazu da, dass ein Objekt initialisiert wird, nicht dass es ewig läuft.
Wie __blackjack__ schon geschrieben hatte, ist die daten.py-Datei schon ein Fehler an sich, da es sich hier um globale Variablen handelt.
Man muß nicht alles an Attribute binden. Auf die Labels wird z.B. später nie wieder zugegriffen.
Immer wenn in einer for-Schleife ein Attribut gesetzt wird, deutet das schon darauf hin, dass man was falsch macht, weil es ja in jedem Schleifendurchlauf wieder überschrieben wird.
Wie __blackjack__ schon geschrieben hat, mußt Du Dir jedes Entry-Objekt merken, das geht am besten in einer Liste. Zusammengehörige Daten sollten zusammenbleiben, also auch das Entry für Vorname und das für Nachname, oder eben Seriennummer und Ware, oder was auch immer Du eigentlich speichern willst.
place sollte man nicht benutzen, sondern hier wohl ein Grid.

Code: Alles auswählen

import tkinter as tk

class Fenster:
    def __init__(self):
        self.window = tk.Tk()
        
        tk.Label(self.window, text="Seriennummer:").grid(row=0, column=0)
        tk.Label(self.window, text="Ware:").grid(row=0, column=1)
        self.entries = []
        for row in range(1,6):
            seriennummer = tk.Entry(self.window, width=10)
            seriennummer.grid(row=row, column=0)
            ware = tk.Entry(self.window, width=10)
            ware.grid(row=row, column=1)
            self.entries.append((seriennummer, ware))
    
        tk.Button(self.window, text='Senden', command=self.vergleichen).grid(row=7, column=0)
    
    def vergleichen(self):
        for seriennummer, ware in self.entries:
            print(seriennummer.get(), ware.get())

def main():
    fenster = Fenster()
    fenster.window.mainloop()

if __name__ == '__main__':
    main()
ichbins
User
Beiträge: 40
Registriert: Samstag 5. September 2020, 07:07

Hallo

danke für das gute Bsp.

Kannst du mir vielleicht erklären was das Bedeutet ".!entry>" , wie ich auf den Inhalt von self.seriennummer_ware und wann ich get() verwende. Bei seriennummer funktioniert es bei self.seriennummer_ware wieder nicht. Beim letzten Bsp. Speicherort zeigt er mir auch ein NameError an. Irgendwie bin ich total durcheinander gekommen.
Eigentlich wollte ich sehen wieviel Einträge ich habe und beim letzten Eintrag abbrechen.

Danke

LG

Code: Alles auswählen

import tkinter as tk
from tkinter import messagebox

class Fenster:
    def __init__(self):
        self.window = tk.Tk()
        
        tk.Label(self.window, text="Seriennummer:").grid(row=0, column=0)
        tk.Label(self.window, text="Ware:").grid(row=0, column=1)
        self.seriennummer_ware = []
        for row in range(1,6):
            entry_seriennummer = tk.Entry(self.window, width=10)
            entry_seriennummer.grid(row=row, column=0)
            entry_ware = tk.Entry(self.window, width=10)
            entry_ware.grid(row=row, column=1)
            self.seriennummer_ware.append((entry_seriennummer, entry_ware))
        
        entry_pfad = tk.Entry(self.window, width=20)
        entry_pfad.grid(row=7)
        
        
    
        tk.Button(self.window, text='Senden', command=self.senden).grid(row=7, column=1)
    
    
    
    def senden(self):
        self.vergleichen()
        self.speicherort()
        
    
    def vergleichen(self):
        for seriennummer, ware in self.seriennummer_ware:
            if seriennummer.get()=='' or ware.get()=='':
                tk.messagebox.showwarning('Warning', "Fehler 1")
                break
            else:
                print(len(self.seriennummer_ware), self.seriennummer_ware, seriennummer.get(), ware.get())
                
    
    def speicherort(self):
        ort=entry_pfad.get()
        print(ort)
        if ort=='':
            pass
                 
                
def main():
    fenster = Fenster()
    fenster.window.mainloop()

if __name__ == '__main__':
    main()
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Was erwartest Du? Du gibst ein Tuple mit zwei Entry-Objekten aus, und das was Du siehst ist die interne Bezeichnung für so ein Entry-Objekt.
Wie Du an die Werte kommst, hast Du ja in der selben Zeile auch.
Und woher soll entry_pfad denn in speicherort herkommen? Das ist eine lokale Variable, so lokal wie die Variable gleichen Namens in __init__ auch. Du mußt entry_pfad an self binden, wenn Du es in Klassemethoden benutzen willst.
ichbins
User
Beiträge: 40
Registriert: Samstag 5. September 2020, 07:07

Danke. Das eine funktioniert. Wo aber noch das Problem ist, ist bei diesem Bsp.

Egal ob ich seriennummer[zeilen].get() oder seriennummer[str(zeilen)].get() eingebe, es kommt ein Fehler. Und bei len(self.seriennummer_ware) zeigt er mir die Gesamtlänge an. Versuch ich auf den Inhalt zu greifen klappt es auch nicht mit get(). Da habe ich keine Lösung gefunden.

Eine andere Frage ist noch wieso beim Debuggen, wenn ich einen Breakpoint setze, keine Werte beim Variablenmanager angezeigt werden und es in dieser Funktion nicht stehen bleibt.

LG

Code: Alles auswählen

    def vergleichen(self):
        zeilen=0
        for seriennummer, ware in self.seriennummer_ware:
            if seriennummer.get()=='' or ware.get()=='':
                tk.messagebox.showwarning('Warning', "Fehler 1")
                break
            else:
                zeilen +=1
                #print(len(self.seriennummer_ware), self.seriennummer_ware, seriennummer.get(), ware.get())
                print (seriennummer[str(zeilen)].get(), ware.get())
                if seriennummer.get() == '':
                    break   
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ichbins: `seriennummer` ist ein `Entry`-Objekt und da bedeutet der […]-Zugriff das man den Wert einer der Optionen von diesem Widget haben möchte. Und die Werte dafür müssen Zeichenketten sein, was die Ausnahme auch ziemlich deutlich sagt wenn man eine Zahl übergibt:

Code: Alles auswählen

In [84]: root = tk.Tk()                                                         

In [85]: entry = tk.Entry(root)                                                 

In [86]: entry[1]                                                               
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-86-69d2063b532d> in <module>
----> 1 entry[1]

/usr/lib/python3.6/tkinter/__init__.py in cget(self, key)
   1487     def cget(self, key):
   1488         """Return the resource value for a KEY given as string."""
-> 1489         return self.tk.call(self._w, 'cget', '-' + key)
   1490     __getitem__ = cget
   1491     def __setitem__(self, key, value):

TypeError: must be str, not int
Und es muss eine für das Widget bekannte Option sein wenn man dann eine Zeichenkette übergibt:

Code: Alles auswählen

In [87]: entry["1"]                                                             
---------------------------------------------------------------------------
TclError                                  Traceback (most recent call last)
<ipython-input-87-125da92ad8cf> in <module>
----> 1 entry["1"]

/usr/lib/python3.6/tkinter/__init__.py in cget(self, key)
   1487     def cget(self, key):
   1488         """Return the resource value for a KEY given as string."""
-> 1489         return self.tk.call(self._w, 'cget', '-' + key)
   1490     __getitem__ = cget
   1491     def __setitem__(self, key, value):

TclError: unknown option "-1"

In [88]: entry["state"]                                                         
Out[88]: 'normal'

In [89]: entry["bg"]                                                            
Out[89]: '#eff0f1'

In [90]: entry["font"]                                                          
Out[90]: 'TkTextFont'

In [91]: entry["width"]                                                         
Out[91]: 20
Und keiner dieser Werte hat eine `get()`-Methode, das macht also keinen Sinn.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
ichbins
User
Beiträge: 40
Registriert: Samstag 5. September 2020, 07:07

Irgendwie konnte ich nicht genau erkennen wie ich auf den nächsten Inhalt der "seriennummer" zugreifen kann. Und wie kann ich auf den Inhalt der Liste self.seriennummer_ware zugreifen.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Dafür habe ich Dir doch die Schleife gezeigt.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ichbins: Was meinst Du mit dem ”nächsten Inhalt”? Das ist *ein* `Entry`-Objekt, das hat *einen* Inhalt. Das nächste Element aus der Liste `self.self.seriennummer_ware` wird automatisch im nächsten Schleifendurchlauf an den Namen `seriennummer` gebunden.

Du solltest am besten in dem Tutorial/Buch/… mit dem Du Python lernst noch mal zu den Schleifen zurück gehen und verstehen was da passiert.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
ichbins
User
Beiträge: 40
Registriert: Samstag 5. September 2020, 07:07

Das gui erzeugt Entries mit 5 Zeilen. Nehmen wir an ich gebe nur 3 Zeilen ein

ich ich
bin bin
da da
(leer) (leer)
(leer) (leer)

Nach der 3. Zeile soll das Programm abrechen. Jetzt möchte ich aber auf Zeile 4 wo (leer) ist zugreifen.

Bei self.seriennummer_ware steht "(<tkinter.Entry object .!entry>,". Ich möchte aber die Elemente sehen. Bei self.self.seriennummer_ware ist ein Fehler.
seriennummer.get() wird richtig angezeigt. Ich brauche in diesem Fall aber die nächste Zeile wo (leer) steht. Wenn ich versuche mit seriennummer(zeilen).get() draufzugreifen kommt "TypeError: can only concatenate str (not "int") to str"
Wie kann ich aber auf die nächste Zeile zugreifen

Code: Alles auswählen

    def vergleichen(self):
        zeilen=0
        for seriennummer, ware in self.seriennummer_ware:
            if seriennummer.get()=='' or ware.get()=='':
                tk.messagebox.showwarning('Warning', "Fehler 1")
                break
            else:
                zeilen +=1
                print (self.seriennummer_ware)
                print(seriennummer.get())
                print(seriennummer[zeilen].get())
                if seriennummer[zeilen].get() == '' and ware[zeilen].get()=='':
                    break
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum möchtest Du auf eine leere Zelle zugreifen?

Erkläre was Du machen möchtest, nicht wie (da das wie so nicht funktioniert). Was ist das Ziel?
ichbins
User
Beiträge: 40
Registriert: Samstag 5. September 2020, 07:07

Keine Eingabe => Showwarning wird angezeigt
Eine Eingabe fehlt => Showwarning
Eingabe seriennummer und ware => kein Showwarning

Wenn ich es so schreibe wird wieder kein Fehler angezeigt wenn eine Eingabe fehlt.

Seriennummer und Ware waren ja eine globale Variable. Wie verwende und gebe ich ein print() aus bzgl. Elemente von self.seriennummer_Ware in einer anderen Datei.

Danke!

Code: Alles auswählen

beispiel.py
 
 class Fenster:
    def vergleichen(self):
        zeilen=False
        for seriennummer, ware in self.seriennummer_ware:
            if seriennummer.get()=='' or ware.get()=='':
                if zeilen==False:
                    tk.messagebox.showwarning('Warning', "Fehler 1")
                break
            else:
                zeilen=True
                
    
                
   daten.py
   
   import beispiel

print(beispiel.Fenster.seriennummer_ware)
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ichbins: Ich verstehe immer noch nicht was da genau passieren soll und vor allem nicht warum Du in einem Schleifendurchlauf schon auf das *nächste* Eingabefeld(paar) zugreifen willst, welches ja ganz regulär im nächsten Schleifendurchlauf behandelt werden kann.

Der Versuch im `daten`-Modul dann über die *Klasse* auf ein Attribut einer nicht existierenden *Instanz* zuzugreifen geht natürlich nicht.

Ich finde die Namen `seriennummer` und `ware` hier auch ein wenig problematisch, denn das ist ja keine Seriennummer, sondern ein Eingabeelement für eine Seriennummer. Eine (potentielle) Seriennummer ist das was die `get()`-Methode liefert. Wenn man diesen Rückgabwert hier an einen lokalen Namen binden will, bekommt man Probleme sich einen Namen dafür auszudenken, weil der offensichtliche schon belegt ist. Gleiches gilt für `ware`.

`vergleichen()` ist als Methodenname auch nicht besonders aussagekräftig.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Was soll dann das Flag `zeilen`? Was für Gedanken hast Du Dir gemacht?
Du hast drei verschiedene Fälle, Zeile gefüllt, Zeile halb gefüllt und Zeile leer. Welchen Fall prüft Dein if? Und was übersiehst Du dabei? Welche Bedingung wird noch gar nicht geprüft?
Lass das mit den verschiedenen Dateien oder globalen Variablen. Das ist eine falsche Denkweise. Bei GUIs muß man sowieso komplett umdenken. Was soll denn mit der Eingabe passieren?
Antworten