get() macht Ärger

Fragen zu Tkinter.
Antworten
Roman
User
Beiträge: 65
Registriert: Dienstag 14. März 2006, 09:10
Wohnort: Berlin

Hallo,
Ich habe ein Programm geschrieben, was eine Mail versenden soll.
Habe nur ein Problem mit get().
Hier der Code:

Code: Alles auswählen

class mail:
    def anfangen(self):
        self.root.destroy()
        self.rcpt=self.mto.get()
        self.absender=self.mailfrom.get()
        self.betreff=self.msub.get()
        self.mess1=self.textfenster.get(1.0,END)
        self.repeats=self.mrep.get()
        do=MyMainProgram()
        do.begin_MyRegularThread()
    def grafik(self):
        self.root=Tk()
        self.root.geometry("600x400")
        self.root.title("Mail-Programm")
        self.mailfrom=Entry(self.root,width=60,font=("Arial",10))
        self.mto=Entry(self.root,width=60,font=("Arial",10))
        self.msub=Entry(self.root,width=60,font=("Arial",10))
        self.mtolabel=Label(self.root,width=10,text="An:",font=("Arial",10,"bold"))
        self.mfromlabel=Label(self.root,width=10,text="Von:",font=("Arial",10,"bold"))
        self.msublabel=Label(self.root,width=10,text="Betreff:",font=("Arial",10,"bold"))
        self.textfenster=Text(self.root,width=74,height=10, font=("Arial",10))
        self.button=Button(self.root,text="Senden",font=("Arial",15,"bold"),command=self.anfangen)
        self.mfromlabel.place(x=5,y=10)
        self.mailfrom.place(x=100,y=10)
        self.mtolabel.place(x=5,y=50)
        self.mto.place(x=100,y=50)
        self.msublabel.place(x=5,y=90)
        self.msub.place(x=100,y=90)
        self.textfenster.place(x=5,y=140)
        self.button.place(x=480,y=350,width=100,height=35)
        if not usingIDLE:
            self.root.mainloop()
Und hier die Fehlermeldung:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python22\lib\lib-tk\Tkinter.py", line 1316, in __call__
    return apply(self.func, args)
  File "C:\Dokumente und Einstellungen\Roman\Mein Kram\Eigene Programme\mail_provisional.py", line 13, in anfangen
    self.rcpt=self.mto.get()
  File "C:\Python22\lib\lib-tk\Tkinter.py", line 2202, in get
    return self.tk.call(self._w, 'get')
TclError: invalid command name ".11504712"
Die hilft mir nicht sonderlich weiter, ich weiss jetzt nur, dass der Fehler im get() steckt.
Weiss jemand warum das nicht geht? Ich habe ein änliches Konzept schon mal geschrieben und da hat es wunderbar funktioniert.
Danke schon mal im Voraus,
Roman :D
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Roman hat geschrieben:Habe nur ein Problem mit get().
Hier der Code:

Code: Alles auswählen

        self.root.destroy()
        self.rcpt=self.mto.get()
Hi Roman!

Du zerstörst das Fenster inklusive aller enthaltenen Widgets eine Zeile bevor du ein Widget auslesen willst. Ich glaube, das ist der Fehler.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Roman hat geschrieben:

Code: Alles auswählen

    def anfangen(self):
        self.root.destroy()
        self.rcpt=self.mto.get()
        self.absender=self.mailfrom.get()
        self.betreff=self.msub.get()
        self.mess1=self.textfenster.get(1.0,END)
        self.repeats=self.mrep.get()
        do=MyMainProgram()
        do.begin_MyRegularThread()
    def grafik(self):
        self.root=Tk()
        self.root.geometry("600x400")
        self.root.title("Mail-Programm")
        self.mailfrom=Entry(self.root,width=60,font=("Arial",10))
        self.mto=Entry(self.root,width=60,font=("Arial",10))
        self.msub=Entry(self.root,width=60,font=("Arial",10))
        self.mtolabel=Label(self.root,width=10,text="An:",font=("Arial",10,"bold"))
        self.mfromlabel=Label(self.root,width=10,text="Von:",font=("Arial",10,"bold"))
        self.msublabel=Label(self.root,width=10,text="Betreff:",font=("Arial",10,"bold"))
        self.textfenster=Text(self.root,width=74,height=10, font=("Arial",10))
        self.button=Button(self.root,text="Senden",font=("Arial",15,"bold"),command=self.anfangen)
        self.mfromlabel.place(x=5,y=10)
        self.mailfrom.place(x=100,y=10)
        self.mtolabel.place(x=5,y=50)
        self.mto.place(x=100,y=50)
        self.msublabel.place(x=5,y=90)
        self.msub.place(x=100,y=90)
        self.textfenster.place(x=5,y=140)
        self.button.place(x=480,y=350,width=100,height=35)
        if not usingIDLE:
            self.root.mainloop()
Sorry dass ich so offtopic bin, aber bitte, bitte, bitte PEP 8 durchlesen. Darin steht unter anderem dass man an vielen Stellen Leezeichen setzen sollte. So wie du es hast ist es ein großer Block voller Zeichen der zudem schwer lesbar ist.

Also etwa

Code: Alles auswählen

self.mailfrom.place(x=100, y=10)
oder

Code: Alles auswählen

self.absender = self.mailfrom.get()
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Roman
User
Beiträge: 65
Registriert: Dienstag 14. März 2006, 09:10
Wohnort: Berlin

Danke, Gerold. Manchmal sieht man echt vor lauter Bäumen den Wald nicht... Ich habe gestern 2 Stunden nach dem Fehler gesucht, konnte ihn aber nicht finden :oops:
@ Leonidas
Du hast Recht, ich sollte meinen Code besser strukturieren... Sagt mein Informatik-Lehrer auch immer :D , aber ich war irgendwie immer zu faul oder habe es einfach vergessen :roll:
Danke für eure schnellen Antworten, ihr habt mir sehr geholfen...
Mfg,
Roman
Antworten