Widgetklasse wird aus unerfindlichen Gründen doppelt aufgerufen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
AFX
User
Beiträge: 51
Registriert: Samstag 4. September 2021, 08:40

Ich habe eine Widgetklasse, deren Code ich weiter unten poste. Diese führe ich wie folgt aus:

result = ScrollMessageBoxShowResourceContactsAdd(None)
result.exec_()

Das Problem daei ist, dass, wenn ich den "OK" - Button drücke, ein weiteres Widget, also eine weitere Instanz, erscheint. Beim ersten Drücken von "OK" habe ich zwei Widgets / Fenster, dann drei usw. Wie kommt das? Ich habe den Fehler nicht finden können.

Hier der Code:


Ich habe eine Widgetklasse, deren Code ich weiter unten poste. Diese führe ich wie folgt aus:

Code: Alles auswählen

result = ScrollMessageBoxShowResourceContactsAdd(None)
result.exec_() 

Das Problem daei ist, dass, wenn ich den 

Hier der Code:

[code]
class ScrollMessageBoxShowResourceContactsAdd(QMessageBox):  

   def __init__(self, *args, **kwargs):
       
       def msgbtn(tf, btn):
           if btn.text().upper() == 'SAVE':
               #Hier in die DB schreiben, dann das Ding neu aufrufen. # 
               #dbaccess.updateMainFilterString2("")            
               self.close()

           if btn.text().upper() == 'OK':
               #Hier in die DB schreiben, dann das Ding neu aufrufen. #
               #dbaccess.updateMainFilterString2(tf.text())
               self.close()
               
               print("Warum schließt das Ding nicht?")
               
               result = ScrollMessageBoxShowResourceContactsAdd(None)
               result.exec_()
       
           if not (btn.text().upper() == 'OK' or btn.text().upper() == 'SAVE'):
               sys.exit(self.exec_())
       
       QMessageBox.__init__(self, *args, **kwargs)
       
       self.setWindowTitle("Ressourcenkontakte einsehen oder hinzufügen.")
       
       self.setStandardButtons(QMessageBox.Ok | QMessageBox.Save)

       self.setInformativeText("Filtern: OK drücken. ~ Hinzufügen: Häkchen (od. nicht), dann 'SAVE'")
       
       filtertf = QLineEdit() 
       filtertf.setStyleSheet("background-color: yellow; max-height: 2em; max-width: 22em;");
       self.buttonClicked.connect(partial(msgbtn, filtertf))
       
       scroll = QScrollArea(self)
       scroll.setWidgetResizable(True)
       
       self.content = QWidget()
       
       scroll.setWidget(self.content)
       
       lay = QVBoxLayout(self.content)
       
       delendaDict = {} 
       self.delDict = {}
       
       filterText = "foo" #dbaccess.filterText2()[0][0]
       
       filtertf.setText(filterText)
       
       if filterText == "":
           for rc in []: #Dies ist für das Problem irrelevant. 
               deleteCB = QCheckBox('add', self)
               deleteCB.stateChanged.connect(partial(self.btnstateDel, deleteCB, delendaDict))
               deleteCB.setObjectName(rc[9])
 
               qb = QPushButton(rc[9], self)
               qb.released.connect(partial(self.button_releasedRC, rc[9]))
               lay.addWidget(qb)
               lay.addWidget(deleteCB)
 
       else:
           for rc in []: 
               deleteCB = QCheckBox('add', self)
               deleteCB.stateChanged.connect(partial(self.btnstateDel, deleteCB, delendaDict))
               deleteCB.setObjectName(rc[9])
 
               qb = QPushButton(rc[9], self)
               qb.released.connect(partial(self.button_releasedRC, rc[9]))
               lay.addWidget(qb)
               lay.addWidget(deleteCB)
 
       lay.addWidget(filtertf) 
 
       delete_all_rc = QPushButton('Alle Ressourcenkontakte hinzufügen.', self)
       delete_all_rc.released.connect(partial(self.button_releasedDeAllRC))
       lay.addWidget(delete_all_rc)
       
       self.buttonClicked.connect(self.msgButtonClickDel)   
       self.layout().addWidget(scroll, 0, 0, 1, self.layout().columnCount())
       self.setStyleSheet("QScrollArea{min-width:410 px; min-height: 600px}")

   def btnstateDel(self, dlt, dlts):    
       dlts[dlt.objectName()] = False
       if dlt.isChecked:
           dlts[dlt.objectName()] = True
       self.delDict = dlts

   def msgButtonClickDel(self, i):
       if i.text().upper() == "SAVE":
           #Das hier ist noch zu implementieren.        
           pass
           #dbaccess.deleteRCs2(self.delDict) 

   def button_releasedRC(self, nameshow):
       ScrollMessageBoxRCInfo(QMessageBox.Information, nameshow, '')

   def button_releasedDeAllRC(self):
       #Das hier ist noch zu implementieren.
       pass
       #dbaccess.deleteAllRCs()
       self.close()
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du erzeugst den doch andauernd neu. Direkt hinter deinem print. Was sonst soll denn dann passieren?
AFX
User
Beiträge: 51
Registriert: Samstag 4. September 2021, 08:40

Vielen Dank für die rasche Antwort - mein Plan war es, das Ding zu schließen mit "self.close()" und dann durch die neue Erzeugung es erneut zu öffnen. Oder gibt es da einen Hack, das Ding zu schließen und es erneut zu öffnen (sodass dann auch neu in die Datenbank geschriebene Werte frisch ausgelesen werden)?
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ordentlich machen? Statt eine profund ätzende Interaktion, bei der sich das immer gleiche Fenster schließt und öffnet und schließt und öffnet und schließt und öffnet und schließt….
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Zumal das nicht mal ein Parent hat, womit in der Regel die Fensterverwaltung des Systems entscheidet wo das Fenster aufgeht. Und zwar jedes mal neu. Wenn man Glück hat, ist das immer an der gleichen Stelle. Wenn nicht, nervt das *noch* mehr.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten