PyQt4 GUI/mysql

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Ralf_90
User
Beiträge: 9
Registriert: Mittwoch 12. April 2017, 14:28

Hallo Python-Forum!

Im Rahmen meiner Bachelorarbeit muss ich eine GUI programmieren, mit welcher der Benutzer eine Mariadb-Datenbank editieren kann.
Ich arbeite mich noch in Python, PyQt4 und SQl ein.
Jetzt habe ich mit dem Qt Designer einen Anmelde-Dialog (StartDialog.ui) erstellt, mit dem eine Verbindung zu meiner Datenbak aufgebaut wird.
Es funktioniert auch alles prima- aber nur wenn ich das Programm über Spyder strate(run). Wenn ich das Programm durch Doppelklicken auf die Programm.py starte, erscheint der Anmelde-Dialog (wie es sein soll), aber jetzt kann ich keine Verbindung zu meiner Datenbank aufbauen. Es erscheint meine selbstgeschriebene Fehlermeldung "Eingaben falsch. Keine Verbindung.".

Woran liegt das?

Grüße
Ralf_90

Code: Alles auswählen

# Bibliotheken und Module importieren
import PyQt4.QtCore as core
import PyQt4.QtGui as gui
import sys
import PyQt4.uic as uic
import mysql.connector as mariadb


#Alle Fenster laden
app = gui.QApplication(sys.argv)
StartDialog = uic.loadUi("StartDialog.ui")
Hauptfenster = uic.loadUi("Hauptfenster.ui")

StartDialog.show()

def VerbindeMitDB():
    try:
        Verbindung = mariadb.connect \
        (host=StartDialog.lineHost.text(),\
         user=StartDialog.lineUser.text(),\
         passwd=StartDialog.linePW.text())
        Hauptfenster.show()
        StartDialog.close()
    except:
        StartDialog.labelNoCon.setText("Eingaben falsch. Keine Verbindung.")

def AbbrechenStartDialog():
    StartDialog.close()
    sys.exit()
        
StartDialog.buttonVerbinden.clicked.connect(VerbindeMitDB)
StartDialog.buttonAbbrechen.clicked.connect(AbbrechenStartDialog)


sys.exit(app.exec_())
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte fuehre dir mal PEP8 und seine Styleguides fuer Python code zu Gemuete. Das erleichtert das lesen deines Quelltextes fuer uns ungemein.

Auf Modulebene gehoeren auch nur Konstanten & Funktionen/Klassen. Kein Code. Dafuer schreibt man eine main-Funktion, die mit "if __name__ == '__main__'" gegen ungewolltes ausfuehren abgesichert ist.

Simple "try/excepts" sind desweiteren ein nahezu absolutes no-no, und dein Fall zeigt klar, warum: du schluckst einfach mal radikal alles weg, was da so kommen kann (sogar inklusive Python-Fehlern, nicht nur Verbindungs-Fehlern), und die Konsequenz liegt auf der Hand: weder du, noch wir, haben eine Ahnung, was da passiert.

Auf Ausnahmen sollte man so spezifisch wie moeeglich reagieren, und eine solche grobe Behandlung ist die absolute Ausnahme zB in einer zentralen Serverschleife, die den Fehler dann loggt & weiter arbeitet, oder das Programm gar beendet.

Also: nimm das try/except mal komplett raus. Der Fehler wird sich dann schon zeigen. Und danach baust du Behandlung fuer die zu erwarteten Fehlerfaelle ein, wie zB passwort falsch, user falsch, host nicht erreichbar etc...
Ralf_90
User
Beiträge: 9
Registriert: Mittwoch 12. April 2017, 14:28

Danke für die schnelle Antwort.
Ich werde den Code verbessern. :oops:
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Ralf_90:

Anknüpfend an __deets__ - Dein Code ist "falsch herum aufgesetzt" und von oben noch unten gedacht, so funktioniert es aber idR nicht bei OOP/ereignisgesteuerter Programmierung. Wenn Du Code schreibst, sollte Dir immer der Kontrollfluss klar sein. Der Code mischt gerade Deklaration mit Ausführung, was bei Bibliotheken wie PyQt (von C++ kommend) Probleme bereiten kann. Vereinfacht gesagt trennt Python das nicht (da gibt es nur die Laufzeit), und man muss selbst im Kontrollfluss sicherstellen, dass die Typen auch "fertig" sind.
Antworten