wo liegt der Fehler ?

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.
Antworten
Benutzeravatar
StMan
User
Beiträge: 23
Registriert: Sonntag 11. Januar 2026, 17:48

Hallo,
ich habe eine Fehlermeldung, diese kann ich nicht zuordnen.
Kann mich jemand aufklären ?

Code: Alles auswählen

class Application:
     def login(self, host, username, password):
        print(f"Anmeldeversuch für Benutzer:{host} , {username} ,  {password}")  ### der print funktioniert
         try:
            conn = mysql.connector.connect(
            host ,
            username,
            password,
            #database=database
        )
            if conn.is_connected():
                messagebox.showinfo("Ergebnis", "OK: Verbindung erfolgreich hergestellt!")
                conn.close()
            else: 
                messagebox.showerror("Ergebnis", "Fehler: Verbindung konnte nicht hergestellt werden.")
        except Error as e:
            messagebox.showerror("Fehler", f"Verbindungsfehler: {e}")

Code: Alles auswählen

def on_connect(self):
        host = self.host_var.get().strip()
        username = self.user_var.get().strip()
        password = self.password_var.get()
        
        if not host or not username:
            messagebox.showwarning("Fehlende Felder", "Bitte geben Sie Host und Benutzernamen an.")
            return
        try: self.app.login(host, username, password)        
        except Exception as e:
            messagebox.showerror("Login Fehler", str(e))        ###  <- Fehlermeldung von hier:   CMySQLConnection.__init__() takes 1 positional argument but 4 were given
Gruß Manfred
derHoepp
User
Beiträge: 6
Registriert: Donnerstag 9. Januar 2020, 22:21

Moin,

ich vermute mal, dass du den Syntaxfehler meinst, dass du der Connect-Methode ein Komma zu viel übergibst.

Viele Grüße
derHoepp
Benutzeravatar
sparrow
User
Beiträge: 4633
Registriert: Freitag 17. April 2009, 10:28

@StMan: Bitte die komplette Fehlermeldung Posten. Nicht nur eine Zeile davon. Die Fehlermeldung passt nicht zu der Stelle, die du angibst.
Bzw. die Ausgabe kommt an der Stelle, die weil du da aktiv den Fehler suchst. Trotzdem steht in der Fehlermeldung eine Ausgabe, die eigentlich nicht zu deinem Code passen kann. Kann es sein, dass du da nochträglich dran gefummelt hast und die Ausgabe von einem vorherigen Versuch ist?
Der Fehler wird dir sogar in Prosa beschrieben.

Falls du du mysql-connector-python verwendest, würde ich mit dem Beispiel auf der Seite dort beginnen. Dort werden named parameters verwendet.
Zuletzt geändert von sparrow am Samstag 31. Januar 2026, 12:00, insgesamt 1-mal geändert.
Benutzeravatar
Dennis89
User
Beiträge: 1678
Registriert: Freitag 11. Dezember 2020, 15:13

@derHoepp da ist kein Syntaxfehler, siehe:

Code: Alles auswählen

def give_it_to_me(a, b):
    print(a, b)

def main():
    give_it_to_me(
        'a',
        'b',
        #c
    )

if __name__ == '__main__':
    main()
Wichtig ist, dass man weiß was Positional Argumments und Keywords Argumments sind.

Grüße
Dennis

@sparrow dein Link geht nicht. Denke du meinst:
https://pypi.org/project/mysql-connector-python/
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
StMan
User
Beiträge: 23
Registriert: Sonntag 11. Januar 2026, 17:48

derHoepp hat geschrieben: Samstag 31. Januar 2026, 11:23 Moin,
ich vermute mal, dass du den Syntaxfehler meinst, dass du der Connect-Methode ein Komma zu viel übergibst.
sorry, das Komma kann ich nicht sehen? Vielleicht muß ich zum Augenarzt :ugeek:
Gruß Manfred
Benutzeravatar
StMan
User
Beiträge: 23
Registriert: Sonntag 11. Januar 2026, 17:48

sparrow hat geschrieben: Samstag 31. Januar 2026, 11:33 @StMan: Bitte die komplette Fehlermeldung Posten. Nicht nur eine Zeile davon. Die Fehlermeldung passt nicht zu der Stelle, die du angibst.
Bzw. die Ausgabe kommt an der Stelle, die weil du da aktiv den Fehler suchst. Trotzdem steht in der Fehlermeldung eine Ausgabe, die eigentlich nicht zu deinem Code passen kann. Kann es sein, dass du da nochträglich dran gefummelt hast und die Ausgabe von einem vorherigen Versuch ist?
Der Fehler wird dir sogar in Prosa beschrieben.

Falls du du mysql-connector-python verwendest, würde ich mit dem Beispiel auf der Seite dort beginnen. Dort werden named parameters verwendet.
Hallo @sparrow das ist die komplette Fehlermeldung aus der messagebox.showerror("Login Fehler", str(e)), in der Console gibt es kein Fehler (und nein, ich habe nicht gefummelt.)
Gruß Manfred
Sirius3
User
Beiträge: 18357
Registriert: Sonntag 21. Oktober 2012, 17:20

@StMan: Einrückungen sind in Python wichtig. Bei Dir ist einiges durcheinander. Eingerückt wird immer mit 4 Leerzeichen pro Ebene. Es ist wie den Schlüssel im unaufgeräumten Zimmer zu finden, so ist es auch viel schwieriger, einen Fehler in so uneinheitlichen Code zu finden.

Du hast jetzt die Fehlerausgabe direkt in Application.login, für eine klare Trennung hatte ich aber schon in meinem Beispiel die Ausgabe in der GUI-Klasse.
Für die Fehlersuche ist es dann sinnvoll, den Code ohne GUI zu testen und dort direkt den kompletten Stacktrace auf der Console anzuschauen, statt den Text aus einer Messagebox abtippen zu müssen.

mysql.connector.connect erwartet Keyword-Argumente:

Code: Alles auswählen

mysql.connector.connect(
    host=host,
    user=username,
    password=password,
    database=database,
)
derHoepp
User
Beiträge: 6
Registriert: Donnerstag 9. Januar 2020, 22:21

Dennis89 hat geschrieben: Samstag 31. Januar 2026, 11:49 @derHoepp da ist kein Syntaxfehler, siehe:
Oh, danke für den Hinweis. Beim nächsten Mal antworte ich lieber erst nach dem testen.
Benutzeravatar
StMan
User
Beiträge: 23
Registriert: Sonntag 11. Januar 2026, 17:48

@ sirius, die Fehlerausgabe ist in def on_connect(self): und nicht in Application.login.
Betr. Einrückungen: ich benutze Visual Studio Code. Das zeigt mir Fehler bei den Enrückungen an (denke ich doch). Diesbezüglich sind keine Fehler erkennbar.
Gruß Manfred
Sirius3
User
Beiträge: 18357
Registriert: Sonntag 21. Oktober 2012, 17:20

@StMan: ich kann nur das beurteilen, was Du hier postest, und nicht was Du in irgendeinem Editor hast. Also entweder ist Dein Code kaputt, oder Du hast den Code falsch hier her kopiert.

Das hier der Fehler in on_connect ausgegeben wird, bedeutet ja nicht, dass der auch dort auch herkommt. Deshalb, schrieb ich ja, keine "Fehlerbehandlung" sondern in der Konsole testen, dann sieht man auch, wo der Fehler ist.
Benutzeravatar
Dennis89
User
Beiträge: 1678
Registriert: Freitag 11. Dezember 2020, 15:13

Das mit den Editoren und Fehler bzw. Warnungen ist unter anderem auch Einstellungssache. Grundsätzlich solltest du einfach durchgehend 4 Leerzeichen verwenden.

Na du hast doch in `login` ein `try`/`except` um das `conn = mysql.connector.connect(...)` dass den Fehler wirft und zusätzlich ist in `on_connect` noch ein `try´/`except`.

Ist dir der Fehler eigentlich klar geworden?

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
StMan
User
Beiträge: 23
Registriert: Sonntag 11. Januar 2026, 17:48

nein, der Fehler ist mir nicht klar geworden. Er wird doch von:
def on_connect(self)
except Exception as e:
messagebox.showerror("Login Fehler", str(e))
ausgegeben.
Gruß Manfred
Benutzeravatar
Dennis89
User
Beiträge: 1678
Registriert: Freitag 11. Dezember 2020, 15:13

Wir machen das jetzt anders, poste bitte den vollständigen Code, an einem Stück in einen Code-Block, der dir deinen genannten Fehler ausgibt. Dann gehen wir den durch und schauen und erklären wann wo der Fehler auftritt.

Das mit den Keywords-Argummente von SIrius3 hast du gesehen?
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
StMan
User
Beiträge: 23
Registriert: Sonntag 11. Januar 2026, 17:48

ich habe das mit den Keywords_Argumenten jetzt verstanden. Das war auch der Fehler.
Was ich nicht verstehe, ist das der Fehler in def(): on_connect(self,) gemeldet wird, obwohl er in def(): login(self, ) stattfindet.
Gruß Manfred
Benutzeravatar
Dennis89
User
Beiträge: 1678
Registriert: Freitag 11. Dezember 2020, 15:13

Wie gesagt, vollständiger Code und man kann es dir zeigen/erklären. Alternativ wurde auch schon vorgeschlagen, das ganze ohne GUI im Terminal zu machen, damit dir der vollständige Traceback angezeigt wird
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 14290
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@StMan: In der `login()` wird `Error` und alles was davon abgeleitet wird, behandelt. Wo auch immer `Error` her kommt. Das ist keine der Standard-Ausnahmen von Python. Der `TypeError` der durch den falschen Aufruf ausgelöst wird, ist aber eine Ausnahme aus der Standardbibliothek und ist und kann nicht von dem `Error` abgeleitet sein, also wird der auch nicht in der `login()` behandelt. Aber in der aufrufenden Methode, denn das wird ja allgemein alles was von `Exception` abgeleitet ist, behandelt.

`login()` ist so wie es da steht ja keine Methode, sondern nur eine Funktion die in einer Klasse steckt. Und die macht auch nicht wirklich was der Name nahelegt. Die testet ja eher. Vielleicht sollte die besser wirklich eine Anmeldung machen und die Verbindung zurückgeben, oder wenn es tatsächlich eine Methode sein soll, dann die Verbindung an das Objekt binden. Dann sollte man allerdings auch aufpassen, was passiert wenn die Methode schon mal aufgerufen wurde, und vielleicht nicht einfach so ein schon bestehendes Verbindungsobjekt ersetzen.

Der `is_connected()`-Aufruf ist überflüssig. Man *weiss* an der Stelle ja, dass die Verbindung hergestellt wurde. Falls dem nicht so wäre, hätte es eine Ausnahme gegeben und man käme gar nicht erst zu dem Aufruf.

Dir Programmlogik sollte von der GUI getrennt sein, also in der Logik macht man nichts was irgendwie mit GUI zu tun hat. Also auch keine Dialoge mit Meldungen anzeigen.
“Programming is partially an artform and, like artists, programmers will do it even if they don't get money.” — Linus Torvalds
Antworten