Python Unverständliche Fehlermeldung

Hydrano

Lieutenant
Registriert
März 2008
Beiträge
942
Hallo Community,

Wir machen in der Uni gerade so ein kleines Miniprojekt "Terminplaner" in Python.
Das ganze soll ein GUI haben, gelöst mit Tkinter.

Nun habe ich die Klasse GUI_Uebersicht in der halt die ganzen Buttons Labels etc. auf der Hauptoberfläche angezeigt werden sollen.
Das Programm lässt sich bisher auch starten, aber sobald ich auf einen der Buttons klicke bekomme ich folgende Fehlermeldung:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python33\lib\tkinter\__init__.py", line 1442, in __call__
return self.func(*args)
TypeError: defNeuerTermin() missing 1 required positional argument: 'self'

Ich hab habe schon einiges gegooglet und ausprobiert, doch keine Lösung gefunden, wobei das eigentlich nur eine Kleinigkeit sein kann, bis auf den Methodenaufruf durch den Button funktioniert ja alles soweit.
Hier mal ein Code Ausschnitt:

Code:
import tkinter as tk

class GUI_Uebersicht():
    Fenster = tk.Tk()
    Fenster.title("Terminplaner 2012/2013")
    Fenster.geometry('1024x600')
    
    def defNeuerTermin(self=Fenster): 
        self.btnNeuerTermin.config(text="Termin erstellt!")

    btnNeuerTermin = tk.Button(Fenster, text="Neuer Termin", command=defNeuerTermin)
    btnNeuerTermin.pack()
    btnNeuerTermin.place(x=25, y=15, height=30, width=115)

Das Problem tritt bei allen Buttons auf, immer wenn ich sie halt anklicke...
Außer beim Beenden Button, wo es wie folgt aussieht :freak:

Code:
    def defBeenden(self=Fenster):
        raise SystemExit()

    btnBeenden = tk.Button(Fenster, text="Beenden", command=defBeenden)
    btnBeenden.pack()
    btnBeenden.place(x=25, y=15*37, height=30, width=115)

Wieso kommt dort kein Fehler?
Ich hoffe mir kann da jemand weiter helfen.
 
das mal das self=Fenster weg.

so sollte das aussehen:
Code:
def defNeuerTermin(self):
   self.btnNeuerTermin.config(text="Termin erstellt!")

und ich wuerde sagen es sollte

Code:
btnNeuerTermin = tk.Button(Fenster, text="Neuer Termin", command=self.defNeuerTermin)
heissen.
 
Das habe ich schon versucht, dann meckert er wegen undefined variable self.
Also in dieser Zeile
Code:
btnNeuerTermin = tk.Button(Fenster, text="Neuer Termin", command=self.defNeuerTermin)
Wo sollte ich das self denn noch definieren es ist doch eigentlich immer vorhanden?
Genaue Meldung:
btnNeuerTermin = tk.Button(Fenster, text="Neuer Termin", command=self.defNeuerTermin)
NameError: name 'self' is not defined

Und der Beenden Button Funktioniert ja, aber nicht ohne das self=Fenster, also nur mit self geht es nicht.
Deshalb hab ich das Vorsorglich überall so gemacht.
 
Das ist alles bischen komisch wa sich da sehe,
normal wuerde Code in der Class GUI_Uebersicht ja in eine Methode gehoeren, oder in den Konstruktor,
und da waere dann self auch bekannt... dann wuerde das klappen.
 
Ja keine Ahnung, deswegen Frage ich ja.
Hab mit Python vorher nicht viel am Hut gehabt, Skriptsprachen sind nicht so meins :)
Ich versuch jetzt das ganze mal in Methoden zu packen und melde mich dann noch einmal.
Ergänzung ()

So jetzt ist das ganze in Methoden verpackt aber trotzdem läuft es nicht.
Der Fehler ist jedoch ein anderer.
Hier einmal der ganze Code für einen Button:
Code:
import tkinter as tk
import time as time

class GUI_Uebersicht:
   
    def __init__(self):
        self.btnHeight = 30
        self.btnX = 25
        self.btnY = 15               
        self.Fenster = tk.Tk()       
        self.defMain()
        
    def defNeuerTermin(self): 
        self.btnNeuerTermin.config(text="Termin erstellt!")

    def defMain(self):
        self.Fenster.title("Terminplaner 2012/2013")
        self.Fenster.geometry('1024x600') 
        
        btnNeuerTermin = tk.Button(self.Fenster, text="Neuer Termin", command=self.defNeuerTermin)
        btnNeuerTermin.pack()
        btnNeuerTermin.place(x=self.btnX, y=self.btnY, height=self.btnHeight, width=115)

        self.Fenster.mainloop()
        
self=GUI_Uebersicht()
Und der Fehler welcher beim Klick auf die Buttons auftritt:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python33\lib\tkinter\__init__.py", line 1442, in __call__
return self.func(*args)
File "C:\Users\Hydrano\workspace\Terminplaner\src\GUI_Uebersicht.py", line 14, in defNeuerTermin
self.btnNeuerTermin.config(text="Termin erstellt!")
AttributeError: 'GUI_Uebersicht' object has no attribute 'btnNeuerTermin'
Der Beenden Button funktioniert übrigenz weiterhin.
Irgendwas passt da wohl mit den ganzen Attributen, Übergaben und Deklarierungen nicht, aber ich weiß nicht was :(
 
Zuletzt bearbeitet:
OK, ich kann sagen wie es geht, aber ich kann nicht erklaeren wieso es anders nicht geht...
Da steh ich noch auf dem schlauch, evtl schlaegt der Garbagecollector irgendwo zu... aber ich seh nicht direk wo.

Code:
import Tkinter as tk
import time as time

class GUI_Uebersicht:
        def __init__(self):
                self.btnHeight = 30
                self.btnX = 25
                self.btnY = 15
                self.Fenster = tk.Tk()
                self.defMain()

        def defNeuerTermin(self):
                self.btnNeuerTermin.config(text="Termin erstellt!")

        def defMain(self):
                self.Fenster.title("Terminplaner 2012/2013")
                self.Fenster.geometry('1024x600')
                self.btnNeuerTermin = tk.Button(self.Fenster, text="Neuer Termin", command=self.defNeuerTermin)
                self.btnNeuerTermin.pack()
                self.btnNeuerTermin.place(x=self.btnX, y=self.btnY, height=self.btnHeight, width=115)

                self.Fenster.mainloop()
self=GUI_Uebersicht()
Ergänzung ()

Ach Quark... ist ja klar... oben war es einmal mit self. unten ohne...
 
Ah jetzt funktioniert das.
Irgendwie hab ich überhaupt nicht daran gedacht, da nen self Vorzusetzen.
Ich hab das Problem überall gesucht, nur nicht dort -.-

Danke für die Hilfe!:daumen:
 
Zurück
Oben