Fehler beim Eingabefeld auswerten

Fragen zu Tkinter.
Antworten
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Hallo, ich habe wieder einmal ein Problem.
Wenn ich dieses Programm ausführe und auf den Button Komprimieren klicke gibt es einen Fehler

Programm:

Code: Alles auswählen

from tkinter import *
import shutil
ausgabetext = ""
def kompromieren():
    Kompromierverzeichnis = root.eingabefeld.get()
    Dateinamen = root.eingabefeld2.get()
    try:
        shutil.make_archive(Kompromierverzeichnis, "zip", Dateinamen)
        ausgabetext = "Wurde kompromiert."
        root.update()
    except:
        ausgabetext = "Falscher Pfad"
        root.update()
def entpacken():
    try:
        shutil.unpack_archive(Dateiname, Extraktverzeichnis, "zip")
        ausgabetext = "Wurde entpackt"
    except:
        ausgabetext = "Falscher Pfad"

root = Tk()
root.title("Archivverwaltung")

Label(root,
      text="Bitte Archivpfad eingeben").grid(row=0, column=0)

Label(root,
      text="Bitte Dateienpfad eingeben").grid(row=2, column=0)

Label(root,
      text=ausgabetext).grid(row=4, column=0, columnspan=2)

eingabefeld = Entry(root, bd=10, width=40).grid(row=1,column=0)

eingabefeld2 = Entry(root,bd=10, width=40).grid(row=3,column=0)
Button(root,
       text="entpacken",
       command=entpacken).grid(row=1, column=1)

Button(root,
       text="kompromieren",
       command=kompromieren).grid(row=2, column=1)

root.mainloop()

und das ist der fehler:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.4/tkinter/__init__.py", line 1536, in __call__
    return self.func(*args)
  File "/home/pi/Desktop/Selbst-erstellt/Python3/Zippen.py", line 5, in kompromieren
    Kompromierverzeichnis = root.eingabefeld.get()
  File "/usr/lib/python3.4/tkinter/__init__.py", line 1935, in __getattr__
    return getattr(self.tk, attr)
AttributeError: 'tkapp' object has no attribute 'eingabefeld'
Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.4/tkinter/__init__.py", line 1536, in __call__
    return self.func(*args)
  File "/home/pi/Desktop/Selbst-erstellt/Python3/Zippen.py", line 5, in kompromieren
    Kompromierverzeichnis = root.eingabefeld.get()
  File "/usr/lib/python3.4/tkinter/__init__.py", line 1935, in __getattr__
    return getattr(self.tk, attr)
AttributeError: 'tkapp' object has no attribute 'eingabefeld'
ich hoffe ihr könnt mir helfen :D
__deets__
User
Beiträge: 14525
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Fehler sagt doch ganz klar, was das Problem ist: du rufst "root.eingabefeld.get()" auf. root kennt kein solches Attribut. eingabefeld und das grossartig benannte eingabefeld2 sind globale Variablen, auf die du ohne root. zugreifst.

(hier ignorierten Sermon ueber globale Variablen und warum die doof sind einfuegen, siehe gerade aktives Thema von Cortez).
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Keine *-Importe. Keine nakten Excepts und die falsche Fehlerbehandlung endet damit, dass es keinen Sinn macht, der lokalen Variable `ausgabetext` irgend einen Wert zu geben, der nie verwendet wird.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

habe das root herausgenommen aber jetzt kommt der Fehle :cry: r:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.4/tkinter/__init__.py", line 1536, in __call__
    return self.func(*args)
  File "/home/pi/Desktop/Selbst-erstellt/Python3/Zippen.py", line 5, in kompromieren
    Kompromierverzeichnis = eingabefeld.get()
AttributeError: 'NoneType' object has no attribute 'get'
Die except brauche ich zum falsche eingaben abfangen! :D
__deets__
User
Beiträge: 14525
Registriert: Mittwoch 14. Oktober 2015, 14:29

Zeig bitte den vollen Quelltext wie er JETZT ist. Und trotz gegenteiliger Beteuerung: das ist keine fehlerbehandlung. Sondern Verschleierung. Das eingabefeld None ist, darf nicht sein, und ist ein Fehler, den du beheben musst, aber nicht siehst, wenn du alles einfach abfängst.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

habe die except rausgenommen immer noch gleicher Fehler.
mein jetziger code ist:

Code: Alles auswählen

from tkinter import *
import shutil
ausgabetext = ""
def kompromieren():
    Kompromierverzeichnis = eingabefeld.get()
    Dateinamen = eingabefeld2.get()
    shutil.make_archive(Kompromierverzeichnis, "zip", Dateinamen)
    ausgabetext = "Wurde kompromiert."
    root.update()
    
def entpacken():
    Dateiname = eigabefeld.get()
    Extraktverzeichnis = eingabefeld1.get()
    shutil.unpack_archive(Dateiname, Extraktverzeichnis, "zip")
    ausgabetext = "Wurde entpackt"
    root.update()

root = Tk()
root.title("Archivverwaltung")

Label(root,
      text="Bitte Archivpfad eingeben").grid(row=0, column=0)

Label(root,
      text="Bitte Dateienpfad eingeben").grid(row=2, column=0)

Label(root,
      text=ausgabetext).grid(row=4, column=0, columnspan=2)

eingabefeld = Entry(root, bd=10, width=40).grid(row=1,column=0)

eingabefeld2 = Entry(root,bd=10, width=40).grid(row=3,column=0)
Button(root,
       text="entpacken",
       command=entpacken).grid(row=1, column=1)

Button(root,
       text="kompromieren",
       command=kompromieren).grid(row=2, column=1)

root.mainloop()

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

“eigabefeld”. Schau mal genau hin....
__deets__
User
Beiträge: 14525
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ah. Ich sehe jetzt den Fehler. Du weist den ruckgabewert von grid zu. Das ist ein Fehler. Der ist None. Das grid muss in eine extra Zeile.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

wie in eine extrazeile?
__deets__
User
Beiträge: 14525
Registriert: Mittwoch 14. Oktober 2015, 14:29

So:

eingabefeld = Entry(root, bd=10, width=40)
eingabefeld.grid(row=1,column=0)

Extra. Zeile.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Danke, es läuft!
Antworten