Frame mit Text, welcher sich verändert je nach Resultat

Plattformunabhängige GUIs mit wxWidgets.
Antworten
kay2012
User
Beiträge: 14
Registriert: Montag 10. September 2012, 17:05

Hallo,

ich möchte eine grafische Darstellung, es soll dokumentiert werden, ob die Verbindung zu einer Datenbank geklappt hat. (via mysql.connect)

Die Verbindung aufzubauen ist nicht schwer:

Code: Alles auswählen

import mysql.connector
 
 # Verbindungsdaten zur MYSQL Datenbank und Verbindungsaufbau
connection = mysql.connector.connect(localhost, root, password, dbname)

# Deklaration von 'cursor'
cursor = connection.cursor()
Was wünsche ich mir ?

Das im Fenster angezeigt wird: Verbindung wird hergestellt... (Text ändern sich, wenn Verbindung hergstellt wird in) Verbindung hergestellt (oder falls die Verbindung nicht hergestellt werden konnte in) Verbindung konnte nicht hergestellt werden, Fehler: (errormeldung).
Interessant wären beide Möglichkeiten zu wissen, also wie man es macht das der Text quasi ausgetauscht wird und wie man Zeilen hinzufügen könnte.

Ein Fenster zu erstellen ist in wxypthon nicht schwer, aber wie ich das verbinden kann, das peile ich nicht.
Hat wer von Euch einen Tipp oder ein Beispielcode ?
Vielen Dank im voraus.
Programmieranfänger

Bücher:
Python 3 - Das umfassende Handbuch (J.Ernesti, P. Kaiser - 3. akt. und erw. Auflage 2012) = ABSOLUTER MÜLL !!
wxpython in action (englisch)
BlackJack

@kay2012: Was hast Du denn bis jetzt? Mit welchem Control auch immer Du den Text bisher anzeigst, das wird doch eine Methode zum setzen des Textes haben.
kay2012
User
Beiträge: 14
Registriert: Montag 10. September 2012, 17:05

Das Fenster habe ich so gemacht:

Code: Alles auswählen

import wx

class DasFenster(wx.Frame):
    
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, 'Das Fenster', size=(300, 200))
        panel = wx.Panel(self)
        wx.StaticText (panel, -1, 'Mein Text', (20, 20))
        
if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = DasFenster(parent=None, id=-1)
    frame.Show()
    app.MainLoop()
    
Programmieranfänger

Bücher:
Python 3 - Das umfassende Handbuch (J.Ernesti, P. Kaiser - 3. akt. und erw. Auflage 2012) = ABSOLUTER MÜLL !!
wxpython in action (englisch)
kay2012
User
Beiträge: 14
Registriert: Montag 10. September 2012, 17:05

kann ich das in etwas so machen (um das ganze erstmal ohne frame) hinzubekommen:

Code: Alles auswählen

import mysql.connector


# Klasse zum Aufbau der Datebankverbindung        
class Verbindungsaufbau:
        
    def dbverbindung(self):
        
        try: 
            dbverbindung = mysql.connector.connect (localhost, user, pw, test)
            
        except:
            Print="Verbindung konnte nicht hergstellt werden: "
            
        else: 
            Print="Verbindung hergestellt!"
Programmieranfänger

Bücher:
Python 3 - Das umfassende Handbuch (J.Ernesti, P. Kaiser - 3. akt. und erw. Auflage 2012) = ABSOLUTER MÜLL !!
wxpython in action (englisch)
BlackJack

@kay2012: Der Verbindungsaufbau ist kein „Ding” sondern ein Vorgang, deshalb ist eine Klasse da schon mal fragwürdig. In dem Quelltext wird in der ”Methode”, die semantisch gar keine ist, ja auch gar kein Gebrauch davon gemacht, dass es eine Klasse ist.

Minimal müsste das was da steht in eine Methode oder Funktion die vom GUI-Code aufgerufen wird, und dort müsste man dann auch die Texte wieder in der GUI anzeigen, oder zumindest die entsprechenden Schritte anstossen. Dann hätte man aber sehr wahrscheinlich keine wirklich gute Trennung zwischen Geschäftslogik und GUI. Ausserdem müsste man den Verbindungsaufbau asynchron durchführen, damit der die GUI nicht blockiert falls er länger dauert. Dann wird das Ganze richtig kompliziert. IMHO zu kompliziert für einen Anfänger. Ich würde raten erst einmal die Geschäftslogik zu implementieren und vor allem zu testen und dann erst eine GUI dort drauf zu setzen.
kay2012
User
Beiträge: 14
Registriert: Montag 10. September 2012, 17:05

Hab mir nun nochmal ein Tutorial zu Gemüte geführt:
http://dev.mysql.com/doc/connector-pyth ... cting.html

Der darin enthalten CodeSnippet ist schon ganz okay, der Aufbau zur Datenbank (inkl. Fehlermeldungen) sind hier nun vorhanden:

Code: Alles auswählen

import mysql.connector
from mysql.connector import errorcode
import time

try:
  cnx = mysql.connector.connect(host='localhost', user='username', password='kennwort', database='datenbankname')
except mysql.connector.Error as err:
  if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
    print("Benutzername oder Passwort falsch !")
  elif err.errno == errorcode.ER_BAD_DB_ERROR:
    print("Datenbank existiert nicht !")
      
else:
    print("Verbindung steht!")
    time.sleep(5)
    print("Verbindung wird nun beendet!")
    time.sleep(2)
    cnx.close()
Unten habe ich noch timesleep gemacht, damit man auch visuell das ende der Verbindung mitbekommt.
Soweit sogut, und das ganze möchte ich in einem Frame packen. Nur weiß ich nicht wie.
Programmieranfänger

Bücher:
Python 3 - Das umfassende Handbuch (J.Ernesti, P. Kaiser - 3. akt. und erw. Auflage 2012) = ABSOLUTER MÜLL !!
wxpython in action (englisch)
BlackJack

@kay2012: So kommen wir, und insbesondere Du nicht weiter. Du hast da jetzt ein Beispiel aus einem Tutorial (unvollständig) abgeschrieben und (geringfügig) erweitert. Alles auf Modulebene. Das ist sicher nicht die Geschäftslogik Deines Programms. Dazu ist es etwas zu dünn und auch nicht wirklich flexibel verwendbar so auf Modulebene, selbst ohne GUI. Um ein GUI-Programm zu schreiben muss man seinen Code mindestens sinnvoll in Funktionen strukturieren. IMHO sollte man besser schon objektorientierte Programmierung halbwegs drauf haben, bevor man sich mit GUIs und der damit einhergehenden Komplexität *zusätzlich* auseinander setzt. Und in diesem Fall kommen dann noch möglicherweise blockierende, externe Anhängigkeiten durch die Datenbank hinzu, also nebenläufige Programmierung wenn man das ordentlich implementieren möchte — was an sich schon ein zusätzliches komplexes Thema ist, aber durch GUIs noch einmal verschärft wird, weil die in der Regel nicht „thread safe” sind und weitere Einschränkungen auferlegen.

Die API, die Du für die Datenbankanbindung verwendest ist übrigens ziemlich speziell. Die ist auf MySQL beschränkt. Normalerweise würde man mindestens die für die Sprache übliche abstrakte API für relationale Datenbanken verwenden. In diesem Fall also die DB API 2.0. Allgemein wird heutzutage aber SQLAlchemy als Abstraktionsschicht in Python empfohlen.
kay2012
User
Beiträge: 14
Registriert: Montag 10. September 2012, 17:05

Ich werde mir dieThematik, insbesondere Funktionen, Klassen und Methoden nochmal genauer ansehen, ich glaub das war ein wenig überstürzt.
Danke für die Ratschläge.
Programmieranfänger

Bücher:
Python 3 - Das umfassende Handbuch (J.Ernesti, P. Kaiser - 3. akt. und erw. Auflage 2012) = ABSOLUTER MÜLL !!
wxpython in action (englisch)
Antworten