Seite 1 von 1

Funktions Zugriff

Verfasst: Samstag 26. Juli 2014, 07:23
von Peter1977
Hallo,

Code: Alles auswählen

class konten(QtGui.QDialog):
    def  __init__(self, *args):
        QtGui.QDialog.__init__(self, *args)
        uic.loadUi("gui/bh_konten.ui",self)


        self.tbl_konten.horizontalHeader().resizeSection(0,0) # Id
        self.tbl_konten.horizontalHeader().resizeSection(1,450) # Kontoname
        self.tbl_konten.horizontalHeader().resizeSection(2,350) # Iban
        self.tbl_konten.horizontalHeader().resizeSection(3,200) # Bic
        self.tbl_konten.horizontalHeader().resizeSection(4,160) # Kontostand
        self.btn_neu.clicked.connect(self.konto_neu)

        self.konto_fuellen()
        
    def konto_fuellen(self):
        SQL_Statement="SELECT id,bezeichnung,iban,bic,kontostand FROM bh_konten ORDER BY iban;"
        SQL_Result=db.DBConnect(SQL_Statement)
        self.tbl_konten.setRowCount(len(SQL_Result))
        Zeile=0
        Guthaben=0
        for ROW in SQL_Result:
            self.tbl_konten.setItem(Zeile,0,QtGui.QTableWidgetItem(str(ROW[0]))) # ID
            self.tbl_konten.setItem(Zeile,1,QtGui.QTableWidgetItem(str(ROW[1]))) # Bezeichnung
            self.tbl_konten.setItem(Zeile,2,QtGui.QTableWidgetItem(str(ROW[2]))) # Iban
            self.tbl_konten.setItem(Zeile,3,QtGui.QTableWidgetItem(str(ROW[3]))) # BIC
            self.tbl_konten.setItem(Zeile,4,QtGui.QTableWidgetItem(str(ROW[4]))) # Kontostand
            self.tbl_konten.item(Zeile,4).setTextAlignment(QtCore.Qt.AlignRight + QtCore.Qt.AlignVCenter)
            Guthaben=Guthaben + float(ROW[4])
            Zeile=Zeile + 1
        self.lbl_gesamtsumme.setText("Gesamt Vermögen: " + str(Guthaben))
            
    def konto_neu(self):
        self.Window=konto_neu()
        self.Window.show()
        
class konto_neu(QtGui.QDialog):
    def __init__(self,*args):
        QtGui.QDialog.__init__(self, *args)
        uic.loadUi("gui/bh_konten_anlegen.ui",self)

        self.btn_anlegen.clicked.connect(self.anlegen)

    def anlegen(self):
        Kontoname=self.txt_kontoname.text()
        Iban=self.txt_iban.text()
        Bic=self.txt_bic.text()
        Guthaben=self.txt_guthaben.text()

        SQL_Statement="INSERT INTO bh_konten (bezeichnung,iban,bic,kontostand) VALUES ('%s','%s','%s',%10.2lf);" %(str(Kontoname),str(Iban),str(Bic),float(Guthaben))
        Result=db.DBConnect(SQL_Statement)

        self.close()
Wie rufe ich die funktion konto_fuellen der klasse konten von der klasse konto_neu mit der Funktion anlegen auf?

Danke peter

Re: Funktions Zugriff

Verfasst: Samstag 26. Juli 2014, 07:29
von mutetella
@Peter1977
Mit dem Punktoperator greifst Du darauf zu, mit Klammer und eventuellen Argumenten darin startest Du den Aufruf. Also z. B.

Code: Alles auswählen

>>> new = konto_neu()
>>> new.anlegen()
mutetella

Re: Funktions Zugriff

Verfasst: Samstag 26. Juli 2014, 07:31
von darktrym
Alle Achtung, das geschrieben aber nicht wissen wie man die Methoden aufruft!?

Re: Funktions Zugriff

Verfasst: Samstag 26. Juli 2014, 08:24
von Peter1977
@mutetella:

verkehrt herum

Code: Alles auswählen

konten.konto_fuellen()
oder

Code: Alles auswählen

new=konten()
new.konto_fuellen()
heissen. was aber nicht funktioniert.

@darktrynn:

Was steht da für komplizierter Code Drinn?

mfg Peter

Re: Funktions Zugriff

Verfasst: Samstag 26. Juli 2014, 08:36
von mutetella
@Peter1977
Was heißt das genau, "nicht funktioniert"? Wenn Du auf eine unbound Methode zugreifen möchtest (so würde dann auch die Fehlermeldung lauten), kannst Du das natürlich nicht, wenn diese Methode nicht auch eine Instanz erhält, was sie automatisch tut, wenn Du nicht auf die Klassen-, sondern auf die Instanzmethode zugreifst. O je, es war 'ne harte Nacht für mich, ich kann's nicht besser erklären... Ein Beispiel:

Code: Alles auswählen

class AnyClass(object):
    def __init__(self, foo):
        self.foo = foo

    def do_something(self):
        return tuple(self.foo)

Code: Alles auswählen

>>> AnyClass.do_something()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method do_something() must be called with AnyClass instance as first argument (got nothing instead)
>>> any_instance = AnyClass('blubber')
>>> any_instance.do_something()
('b', 'l', 'u', 'b', 'b', 'e', 'r')
mutetella

Re: Funktions Zugriff

Verfasst: Samstag 26. Juli 2014, 11:34
von Sirius3
Direkt aufrufen würde man das ja sowieso nicht. Die Klasse "konten" sollte einen Slot haben, der die Tabelle aktualisiert, und die Klasse zum Anlegen eines neuen Eintrags in die Kontentabelle, die seltsamerweise "konto_neu" heißt, sollte ein Signal senden, das Änderungen an der Tabelle anzeigt, wenn das die Datenbank nicht automatisch kann.
Ein Blick in PEP8 würde helfen, für andere und irgendwann für sich selbst übersichtlicheren Code zu schreiben. Wenn ein Index in einer for-Schleife (Zeile 22) gebraucht wird, hilft die enumerate-Funktion. Statt Zeilen zu kopieren, solltest Du besser Schleifen benutzen (Zeile 23-28), und Parameter in SQL-Statements darf man nicht per einfacher String-Formatierung einfügen, sondern sollten ausschließlich über die dafür vorgesehenen Mechanismen erfolgen (SQL-Injection). Für Guthaben bieten sich Decimals an, floats sind ungenau.

Re: Funktions Zugriff

Verfasst: Samstag 26. Juli 2014, 11:44
von darktrym
Was hat denn ROW[4] für ein Typ? Float ist es nicht, aber auch nicht String?!

Re: Funktions Zugriff

Verfasst: Samstag 26. Juli 2014, 13:56
von Peter1977
@darktrym:

hat den Typ Money

@Sirius3:

Wenn meine Datenbank von sich aus beginnt Daten zu verschicken würde ich mir Sorgen machen

Signale schaue ich mir an

PEP8 Schaue ich mir an oder gleich doch PEP20? http://legacy.python.org/dev/peps/pep-0020/ ist ja Aktueller, oder?
. Statt Zeilen zu kopieren, solltest Du besser Schleifen benutzen (Zeile 23-28)
im diesen Fall geht es in anderen nicht vielleicht mit enumerate


mfg Peter

Re: Funktions Zugriff

Verfasst: Samstag 26. Juli 2014, 14:02
von BlackJack
@Peter1977: Du kannst gerne auch PEP20 lesen, aber das mit dem ”aktueller” macht keinen Sinn weil PEP20 ja nicht eine neuere Variante von PEP8 ist.

Re: Funktions Zugriff

Verfasst: Samstag 26. Juli 2014, 14:04
von mutetella
Peter1977 hat geschrieben:PEP8 Schaue ich mir an oder gleich doch PEP20? [...] ist ja Aktueller, oder?
:?: :?: :?:
Peter1977 hat geschrieben:im diesen Fall geht es in anderen nicht
Ist das im Leben nicht immer so...? :wink:

mutetella