Funktions Zugriff

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
Peter1977
User
Beiträge: 86
Registriert: Mittwoch 4. September 2013, 14:59

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
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Alle Achtung, das geschrieben aber nicht wissen wie man die Methoden aufruft!?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Peter1977
User
Beiträge: 86
Registriert: Mittwoch 4. September 2013, 14:59

@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
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Was hat denn ROW[4] für ein Typ? Float ist es nicht, aber auch nicht String?!
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Peter1977
User
Beiträge: 86
Registriert: Mittwoch 4. September 2013, 14:59

@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
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.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten