QTableWidget Aktualisieren

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Peter1977
User
Beiträge: 90
Registriert: Mittwoch 4. September 2013, 14:59

Hello,

Habe ein Formular mit pyqt erstellt was mir daten aus einer Datenbank anzeigt.
mittels eines Buttons wird ein weiteres Fenster geöffnet
wo Daten eingegeben werden können.

Bei betätigen eines Buttons im zweiten Fenster
werden die Daten in die DB eingetragen und es soll die Tabelle im ersten Fenster aktualisiert werden.

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,180) # Bic
        self.tbl_konten.horizontalHeader().resizeSection(4,160) # Kontostand
        self.btn_neu.clicked.connect(self.konto_neu_fenster)
        self.btn_update.clicked.connect(self.konto_fuellen)
        self.konto_fuellen()
        
        
        #self.connect(self, SIGNAL('send()'),self,SLOT('konto_reset()'))
        
    def send(self):
        print ('Sende Signal Erhalten')
        self.konto_fuellen()
        self.emit(SIGNAL('send()'))
    #    #self.Sig.emit()
        
    @pyqtSignature('konto_fuellen()')
            
    def konto_fuellen(self):
        print (' ')
        print ('Konto Fuellen')
        #self.tbl_konten.clear()
        
        SQL_Statement="SELECT id,bezeichnung,iban,bic,kontostand FROM bh_konten ORDER BY iban;"
        SQL_Result=db.DBConnect(SQL_Statement)
        print (' ')
        print ('SQL: ' + SQL_Statement)
        self.tbl_konten.setRowCount(len(SQL_Result))
        print (' ')
        print ('Länge: ' + str(len(SQL_Result)))
        Guthaben=0
        for Zeile,ROW in enumerate(SQL_Result):
            print ('Zeile: ', Zeile)
            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 + Decimal(ROW[4])
        
        print (' ')
        print ('Ende Konto Fuellen')
        self.lbl_gesamtsumme.setText("Gesamt Vermögen: " + str(Guthaben))
        
    def konto_neu_fenster(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),Decimal(Guthaben))
        Result=db.DBConnect(SQL_Statement)
        
        func_konto_fuellen=konten()
        func_konto_fuellen.send()
        self.close()
        
Die Daten werden korrekt eingetragen. und auch das print funktioniert die Tabelle wird nur nicht aktualisiert.
mfg Peter
Sirius3
User
Beiträge: 18273
Registriert: Sonntag 21. Oktober 2012, 17:20

@Peter1977: in Zeile 71 erzeugst Du direkt aus Usereingaben einen SQL-Befehl. Das ist eine riesige SQL-Injection-Lücke, da man damit alles mit der Datenbank machen kann. Nutze die Möglichkeit Deines Datenbankinterfaces Parameter zu übergeben!

In Zeile 74 erzeugst Du ein neues Konto-Fenster. Warum sollte sich am alten irgendetwas ändern?
Peter1977
User
Beiträge: 90
Registriert: Mittwoch 4. September 2013, 14:59

Ja zu Zeile 71

Allerdings wenn ich was vorhabe in dieser Richtung dann kann ich dies auch im Script selbst machen.
Zumindest benötige ich für das Script Leseszugriff und solbald ich Lesezugriff habe ist es sicher nicht schwer schreibzugriff zu erhalten


Zu Zeile 74:

wenn ich Zeile 74 weglasse müsste die Zeile 75 so aussehen

konten.send()

die ich schon probiert habe die allerdings auch nicht funktioniert

Und was sich im alten Konto Fenster ändern sollte ist das ein Neuer Eintrag hinzukommt.

mfg Peter
Sirius3
User
Beiträge: 18273
Registriert: Sonntag 21. Oktober 2012, 17:20

@Peter1977: dann formulier ich das ganze anders: das Schreiben in die Datenbank ist fehlerhaft. Bei bestimmten Werten, die geschrieben werden sollen, passiert nicht das, was passieren soll. Im günstigsten Fall bricht das Programm mit einer Fehlermeldung ab, im schlimmsten macht man sich unbeabsichtigt die ganze Datenbank kaputt. Dazu braucht es nichtmal Böswilligkeit.

Durch raten kommst Du nicht weiter. Mach Dir klar, dass es, so wie Du es bisher versucht hast, verschiedene Instanzen der Klasse konten gibt, Du aber eigentlich nur eine Instanz haben willst. Also muß die aktuelle konten-Instanz irgendwie an die erzeugte Instanz von konto_neu übergeben werden, das geht über init-Parameter.

Es gibt eine Namenskonvention in Python, damit man nicht durcheinander kommt, was jetzt Klassen, Instanzen, Variablen oder Funktionen sind. Klassen werden groß, der Rest klein geschrieben.
Peter1977
User
Beiträge: 90
Registriert: Mittwoch 4. September 2013, 14:59

Durch raten kommst Du nicht weiter. Mach Dir klar, dass es, so wie Du es bisher versucht hast, verschiedene Instanzen der Klasse konten gibt, Du aber eigentlich nur eine Instanz haben willst. Also muß die aktuelle konten-Instanz irgendwie an die erzeugte Instanz von konto_neu übergeben werden, das geht über init-Parameter.
Muss also in der Klasse Konten die Aktuelle Instanz auslesen und diese bei aufruf der Klasse konto_neu mit Übergeben.
da ich auf Zugriff von Klasse Konto_neu auf Klasse Konten die Richtige Instanz angesprochen wird.

Muss nur noch in netz nach dem richtigen Artikel dazu suchen bis jetzt habe ich zum Teil ienträge wie diese http://pythonrope.com/
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo,

ich lege Dir mal diesen Thread ans Herzen: http://www.python-forum.de/viewtopic.ph ... 54#p194754

Darin gehe ich auf alles mögliche rund um Qt-Modelle und SQL-Support von Qt ein. Kurzzusammenfassung: Qt bietet Dir viele tolle Möglichkeiten out-of-the box, um Ergebnisse von Queries in einer Tabellenform anzeigen zu können. Dank SortFilterProxy usw. bekommst Du weitere Flexibilität gratis dazu.

Vergiss die "TableWidget"-Klasse und befasse Dich mit MVC bei Qt - es lohnt sich wirklich!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Peter1977
User
Beiträge: 90
Registriert: Mittwoch 4. September 2013, 14:59

Qt-Modelle und SQL-Support von Qt ein. Kurzzusammenfassung: Qt bietet Dir viele tolle
befasse Dich mit MVC bei Qt
Kann wer eine gute Dokumentation Empfehlen?

möglichst in Buchform. Danke

mfg Peter
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Ein Buch direkt zu MVC mit Qt habe ich noch nicht entdeckt, was sicher auch daran liegen kann, dass das Thema nicht an ein bestimmtes GUI-Kit gebunden ist.

Die offizielle Doku:
http://qt-project.org/doc/qt-4.8/model- ... mming.html

Du erhälst auch endlose Beispiele, Tutorials, Erklärungen und Illustrationen wenn du Google o.Ä. fragst.
http://lmgtfy.com/?q=understanding+mvc :-)
Peter1977
User
Beiträge: 90
Registriert: Mittwoch 4. September 2013, 14:59

Hat beides einen Nachteil funktioniert nicht wenn man nicht vor einen Computer,Notebook,Netbook,Tablet,Smartphon oder ähnlichen sitzt.

mfg Peter
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@Peter1977: Ich habe die Links in dem Thread jetzt nicht ausprobiert, würde aber hoffen, dass die noch gehen. Alternativ solltest Du auf der offiziellen Qt-Seite sicherlich schnell zu den aktuellen Fassungen finden.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Peter1977 hat geschrieben:Hat beides einen Nachteil funktioniert nicht wenn man nicht vor einen Computer,Notebook,Netbook,Tablet,Smartphon oder ähnlichen sitzt.

mfg Peter
Ja sicher, aber in dem Falle kannst du auch schwer programmieren ... oder schreibst du deinen Code vorher mit Stift und Papier? ;-)
Ich habe dir die Links gegeben, weil man eben kein bzw. nur sehr schwer ein Buch über MVC + Qt finden dürfte. Letzten Endes kannst du dir die Websites/Online-Docs ja auch ausdrucken.
Peter1977
User
Beiträge: 90
Registriert: Mittwoch 4. September 2013, 14:59

Links in dem Thread jetzt nicht ausprobiert,
Funktionieren noch und Lesezichen Hinzugefügt
oder schreibst du deinen Code vorher mit Stift und Papier?
Wenn ichs genau nehme Ja. Denn am Anfang war der Bleistift.


mfg Peter
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Peter1977 hat geschrieben:Denn am Anfang war der Bleistift.
Am Anfang war das Ei ... aber das wird zu philosophisch :-)

Ich vermute mal du skizzierst dir das Problem bzw. mögliche Ansätze, du schreibst doch aber sicher keinen Code aufs Papier!?
Peter1977
User
Beiträge: 90
Registriert: Mittwoch 4. September 2013, 14:59

Am Anfang war das Ei ... aber das wird zu philosophisch
Wer hat das Ei gelegt?
Ich vermute mal du skizzierst dir das Problem bzw. mögliche Ansätze, du schreibst doch aber sicher keinen Code aufs Papier!?
Ja

es wird Notiert was soll das Programm am Ende Anzeigen.
und dazu die "Abhängigkeiten"

wie bei den oberen beiden Klassen fuer die Konten ist ja nur ein Teil

Am Ende soll das Programm mir die Einnahmen/Ausgaben im Monat/Jahr anzeigen
auch anzeigen in welchen Bereich die Einnahmen und Ausgaben waren

mfg Peter
Antworten